ホームページ > バックエンド開発 > Python チュートリアル > Python 関数クラスの糖衣構文

Python 関数クラスの糖衣構文

高洛峰
リリース: 2016-11-22 15:56:07
オリジナル
1446 人が閲覧しました

Python 構文シュガー

、改行接続

1

2

3

4

5

6

7

s = ''

s += 'a' + \

     'b' + \

     'c'

n = 1 + 2 + \

3

# 6

ログイン後にコピー

while、for ループ外の else

while ループが正常に終了した場合 (ブレーク終了なし)、else が実行されます。

1

2

3

4

5

num = [1,2,3,4]

mark = 0while mark < len(num):

    n = num[mark]    if n % 2 == 0:  

     print(n)        # break

    mark += 1else: print("done")

ログイン後にコピー

zip() 並列反復

1

2

3

4

a = [1,2,3]

b = [&#39;one&#39;,&#39;two&#39;,&#39;three&#39;]

list(zip(a,b))

# [(1, &#39;one&#39;), (2, &#39;two&#39;), (3, &#39;three&#39;)]

ログイン後にコピー

リスト内包表記

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

x = [num for num in range(6)]

# [0, 1, 2, 3, 4, 5]

y = [num for num in range(6) if num % 2 == 0]

# [0, 2, 4]

 

# 多层嵌套

rows = range(1,4)

cols = range(1,3)

for i in rows:

    for j in cols:

        print(i,j)

# 同

rows = range(1,4)

cols = range(1,3)

x = [(i,j) for i in rows for j in cols]

ログイン後にコピー

辞書内包表記

{ key_exp : value_exp from iterable 内の式 }

1

2

3

#查询每个字母出现的次数。

strs = &#39;Hello World&#39;

s = { k : strs.count(k) for k in set(strs) }

ログイン後にコピー

Set 内包表記

{iterable 内の式の式 }

タプル 派生はありません

タプルの導出をリストの導出だと思って括弧に変更していたのですが、後からジェネレーターの導出であることに気づきました。

ジェネレーター導出

1

2

>>> num = ( x for x in range(5) )>>> num

...:<generator object <genexpr> at 0x7f50926758e0>

ログイン後にコピー

関数

函数关键字参数,默认参数值

1

2

3

4

def do(a=0,b,c)

    return (a,b,c)

 

do(a=1,b=3,c=2)

ログイン後にコピー

函数默认参数值在函数定义时已经计算出来,而不是在程序运行时。
列表字典等可变数据类型不可以作为默认参数值。

1

2

3

def buygy(arg, result=[]):

    result.append(arg)

    print(result)

ログイン後にコピー

changed:

1

2

3

4

5

6

7

8

9

10

def nobuygy(arg, result=None):

    if result == None:

        result = []

    result.append(arg)

    print(result)

# or

def nobuygy2(arg):

    result = []

    result.append(arg)

    print(result)

ログイン後にコピー

*args 收集位置参数

1

2

3

4

def do(*args):

    print(args)

do(1,2,3)

(1,2,3,&#39;d&#39;)

ログイン後にコピー

**kwargs 收集关键字参数

1

2

3

4

def do(**kwargs):

  print(kwargs)

do(a=1,b=2,c=&#39;la&#39;)

# {&#39;c&#39;: &#39;la&#39;, &#39;a&#39;: 1, &#39;b&#39;: 2}

ログイン後にコピー

lamba 匿名函数

1

2

3

a = lambda x: x*x

a(4)

# 16

ログイン後にコピー

生成器

生成器是用来创建Python序列的一个对象。可以用它迭代序列而不需要在内存中创建和存储整个序列。
通常,生成器是为迭代器产生数据的。

生成器函数函数和普通函数类似,返回值使用 yield 而不是 return 。

1

2

3

4

5

6

7

8

def my_range(first=0,last=10,step=1):

    number = first

    while number < last:

        yield number

        number += step

 

>>> my_range()

... <generator object my_range at 0x7f02ea0a2bf8>

ログイン後にコピー

装饰器

有时需要在不改变源代码的情况下修改已经存在的函数。
装饰器实质上是一个函数,它把函数作为参数输入到另一个函数。 举个栗子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# 一个装饰器

def document_it(func):

    def new_function(*args, **kwargs):

        print("Runing function: ", func.__name__)

        print("Positional arguments: ", args)

        print("Keyword arguments: ", kwargs)

        result = func(*args, **kwargs)

        print("Result: " ,result)

        return result

    return new_function

 

# 人工赋值

def add_ints(a, b):

    return a + b

 

cooler_add_ints = document_it(add_ints) #人工对装饰器赋值

cooler_add_ints(3,5)

 

# 函数器前加装饰器名字

@document_it

def add_ints(a, b):

    return a + b

ログイン後にコピー

可以使用多个装饰器,多个装饰由内向外向外顺序执行。

命名空间和作用域

1

2

3

4

5

6

7

8

a = 1234

def test():

    print("a = ",a) # True

####

a = 1234

def test():

    a = a -1    #False

    print("a = ",a)

ログイン後にコピー

可以使用全局变量 global a 。

1

2

3

4

5

a = 1234

def test():

    global a

    a = a -1    #True

    print("a = ",a)

ログイン後にコピー

Python 提供了两个获取命名空间内容的函数 local() global()

_ 和 __

Python 保留用法。 举个栗子:

1

2

3

4

5

6

def amazing():

    &#39;&#39;&#39;This is the amazing.

    Hello

    world&#39;&#39;&#39;

    print("The function named: ", amazing.__name__)

    print("The function docstring is: \n", amazing.__doc__)

ログイン後にコピー

异常处理,try...except

只有错误发生时才执行的代码。 举个栗子:

1

2

3

4

5

6

>>> l = [1,2,3]

>>> index = 5

>>> l[index]

Traceback (most recent call last):

  File "<stdin>", line 1, in

  <module>IndexError: list index out of range

ログイン後にコピー

再试下:

1

2

3

4

5

6

7

8

>>> l = [1,2,3]

>>> index = 5

>>> try:

...     l[index]

... except:

...     print("Error: need a position between 0 and", len(l)-1, ", But got", index)

...

Error: need a position between 0 and 2 , But got 5

ログイン後にコピー

没有自定异常类型使用任何错误。

获取异常对象,except exceptiontype as name

1

2

3

4

5

6

7

hort_list = [1,2,3]while 1:

    value = input("Position [q to quit]? ")    if value == &#39;q&#39;:        break

    try:

        position = int(value)

        print(short_list[position])    except IndexError as err:

        print("Bad index: ", position)    except Exception as other:

        print("Something else broke: ", other)

ログイン後にコピー

自定义异常

异常是一个类。类 Exception 的子类。

1

2

3

4

5

6

7

8

9

10

11

class UppercaseException(Exception):

    pass

 

words = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;AA&#39;]

for i in words:

    if i.isupper():

        raise UppercaseException(i)

# error

Traceback (most recent call last):

  File "<stdin>", line 3, in <module>

__main__.UppercaseException: AA

ログイン後にコピー

命令行参数

命令行参数

python文件:

1

2

import sys

print(sys.argv)

ログイン後にコピー

PPrint()友好输出

与print()用法相同,输出结果像是列表字典时会不同。

子类super()调用父类方法

举个栗子:

1

2

3

4

5

6

7

8

class Person():

    def __init__(self, name):

        self.name = nameclass email(Person):

    def __init__(self, name, email):

        super().__init__(name)

        self.email = email

 

a = email(&#39;me&#39;, &#39;me@me.me&#39;)>>> a.name... &#39;me&#39;>>> a.email... &#39;me@me.me&#39;

ログイン後にコピー

self.__name 保护私有特性

1

2

3

4

class Person():

    def __init__(self, name):

        self.__name = name

a = Person(&#39;me&#39;)>>> a.name... AttributeError: &#39;Person&#39; object has no attribute &#39;__name&#39;# 小技巧a._Person__name

ログイン後にコピー

实例方法( instance method )

实例方法,以self作为第一个参数,当它被调用时,Python会把调用该方法的的对象作为self参数传入。

1

2

3

4

class A():

    count = 2

    def __init__(self): # 这就是一个实例方法

        A.count += 1

ログイン後にコピー

类方法 @classmethod

1

2

3

4

5

6

class A():

    count = 2

    def __init__(self):

        A.count += 1    @classmethod

    def hello(h):

        print("hello",h.count)

ログイン後にコピー

注意,使用h.count(类特征),而不是self.count(对象特征)。

静态方法 @staticmethod

1

2

3

4

class A():    @staticmethod

    def hello():

        print("hello, staticmethod")

>>> A.hello()

ログイン後にコピー

创建即用,优雅不失风格。

特殊方法(sqecial method)

一个普通方法:

1

2

3

4

5

6

7

8

9

10

class word():

    def __init__(self, text):

        self.text = text

    def equals(self, word2): #注意

        return self.text.lower() == word2.text.lower()

a1 = word(&#39;aa&#39;)

a2 = word(&#39;AA&#39;)

a3 = word(&#39;33&#39;)

a1.equals(a2)

# True

ログイン後にコピー

使用特殊方法:

1

2

3

4

5

6

7

8

class word():

    def __init__(self, text):

        self.text = text    def __eq__(self, word2): #注意,使用__eq__

        return self.text.lower() == word2.text.lower()

a1 = word(&#39;aa&#39;)

a2 = word(&#39;AA&#39;)

a3 = word(&#39;33&#39;)

a1 == a2# True

ログイン後にコピー

# True

其他还有:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

*方法名*                        *使用*

__eq__(self, other)            self == other

__ne__(self, other)            self != other

__lt__(self, other)            self < other

__gt__(self, other)            self > other

__le__(self, other)            self <= other

__ge__(self, other)            self >= other

 

__add__(self, other)        self + other

__sub__(self, other)        self - other

__mul__(self, other)        self * other

__floordiv__(self, other)    self // other

__truediv__(self, other)        self / other

__mod__(self, other)        self % other

__pow__(self, other)        self ** other

 

__str__(self)                str(self)

__repr__(self)                repr(self)

__len__(self)                len(self)

ログイン後にコピー

文本字符串

1

2

3

&#39;%-10d | %-10f | %10s | %10x&#39; % ( 1, 1.2, &#39;ccc&#39;, 0xf )

#

&#39;1          | 1.200000   |        ccc |         33&#39;

ログイン後にコピー

{} 和 .format

1

2

3

4

5

6

7

&#39;{} {} {}&#39;.format(11,22,33)

# 11 22 33

&#39;{2:2d} {0:-10d} {1:10d}&#39;.format(11,22,33)

# :后面是格式标识符

# 33 11 22

 

&#39;{a} {b} {c}&#39;.format(a=11,b=22,c=33)

ログイン後にコピー


関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート