Home > Backend Development > Python Tutorial > Python function class syntactic sugar

Python function class syntactic sugar

高洛峰
Release: 2016-11-22 15:56:07
Original
1389 people have browsed it

Python syntactic sugar

, newline connection

s = ''
s += 'a' + \
     'b' + \
     'c'
n = 1 + 2 + \
3
# 6
Copy after login

while, else outside the for loop

If the while loop ends normally (no break exit), else will be executed.

num = [1,2,3,4]
mark = 0while mark < len(num):
    n = num[mark]    if n % 2 == 0:   
     print(n)        # break
    mark += 1else: print("done")
Copy after login

zip() parallel iteration

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;)]
Copy after login

list comprehension

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]
Copy after login

dictionary comprehension

{ key_exp : value_exp fro expression in iterable }

#查询每个字母出现的次数。
strs = &#39;Hello World&#39;
s = { k : strs.count(k) for k in set(strs) }
Copy after login

set comprehension

{expression for expression in iterable }

tuple There is no derivation

I thought the tuple derivation was a list derivation and changed it into parentheses, but later I discovered the generator derivation.

Generator derivation

>>> num = ( x for x in range(5) )>>> num
...:<generator object <genexpr> at 0x7f50926758e0>
Copy after login

function

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

def do(a=0,b,c)
    return (a,b,c)

do(a=1,b=3,c=2)
Copy after login

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

def buygy(arg, result=[]):
    result.append(arg)
    print(result)
Copy after login

changed:

def nobuygy(arg, result=None):
    if result == None:
        result = []
    result.append(arg)
    print(result)
# or
def nobuygy2(arg):
    result = []
    result.append(arg)
    print(result)
Copy after login

*args 收集位置参数

def do(*args):
    print(args)
do(1,2,3)
(1,2,3,&#39;d&#39;)
Copy after login

**kwargs 收集关键字参数

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}
Copy after login

lamba 匿名函数

a = lambda x: x*x
a(4)
# 16
Copy after login

生成器

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

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

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>
Copy after login

装饰器

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

# 一个装饰器
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
Copy after login

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

命名空间和作用域

a = 1234
def test():
    print("a = ",a) # True
####
a = 1234
def test():
    a = a -1    #False
    print("a = ",a)
Copy after login

可以使用全局变量 global a 。

a = 1234
def test():
    global a
    a = a -1    #True
    print("a = ",a)
Copy after login

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

_ 和 __

Python 保留用法。 举个栗子:

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__)
Copy after login

异常处理,try...except

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

>>> 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
Copy after login

再试下:

>>> 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
Copy after login

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

获取异常对象,except exceptiontype as name

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)
Copy after login

自定义异常

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

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
Copy after login

命令行参数

命令行参数

python文件:

import sys
print(sys.argv)
Copy after login

PPrint()友好输出

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

子类super()调用父类方法

举个栗子:

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;
Copy after login

self.__name 保护私有特性

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
Copy after login

实例方法( instance method )

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

class A():
    count = 2
    def __init__(self): # 这就是一个实例方法
        A.count += 1
Copy after login

类方法 @classmethod

class A():
    count = 2
    def __init__(self):
        A.count += 1    @classmethod
    def hello(h):
        print("hello",h.count)
Copy after login

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

静态方法 @staticmethod

class A():    @staticmethod
    def hello():
        print("hello, staticmethod")
>>> A.hello()
Copy after login

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

特殊方法(sqecial method)

一个普通方法:

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
Copy after login

使用特殊方法:

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
Copy after login

# True

其他还有:

*方法名*                        *使用*
__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)
Copy after login

文本字符串

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

{} 和 .format

&#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)
Copy after login


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template