流畅的Python
第五章总结
- 函数对象
函数是一个对象。本身是一个function类的实例。
>>> def factorial(n):
'''returns n!'''
return 1 if n < 2 else n*factorial(n-1)
>>> factorial(42)
1405006117752879898543142606244511569936384000000000
>>> factorial.__doc__
'returns n!'
>>> type(factorial)
<class 'function'>
__doc__属性用于生成对象的帮助文本。
dir()可查看对象的所有属性
还可以将函数赋给变量,通过变量名调用。map()函数返回一个可迭代对象,里面的元素是把第一个参数(函数)应用到第二个参数(可迭代对象)的各个元素上得到的结果。
- 高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数。map就是一个,sorted也是。
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key = len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
再比如:先将参数反向再比较。
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key = reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
all(iterable)和any(iterable)也是内置的归约函数,如果iterable每个元素都是真值,返回True,all([ ])返回True;对于any()只要iterable中有元素是真值,返回True,any([ ])返回false。
- 匿名函数
lambda函数的定义体只能用纯表达式,不能有赋值语句,也不能使用while,try等。匿名函数很少用到。
- 可调用对象
调用运算符,即()。使用callable()查看一个对象能否被调用。python中有七种可调用对象。
- 用户定义的函数
- 内置函数
- 内置方法
- 方法
- 类
- 类的实例(如果类定义了__call__方法)
- 生成器函数
事实上任何对象都可以被调用,只要定义了__call__函数。
class test:
def __init__(self, items):
self._len = len(items)
self._first = items[0]
def the_last(self):
try:
return self._first, self._len
except Error:
print('chucuo')
def __call__(self):
return self.the_last()
test1 = test(range(3))
a = test1()
print(a)
print(callable(test1))
(0, 3)
True
函数参数前面有 * 和 ** 表示参数可能有多个,* 将参数存储为元组, ** 将参数存储为字典。
>>> def f1(a, *b, **c):
print(a)
print(b)
print(c)
>>> f1(1, 2, 3, e = 4, d = 4, f = 5)
1
(2, 3)
{'e': 4, 'd': 4, 'f': 5}
- 函数注解
Python3提供了一种句法,用于为函数声明中的参数和返回值附加元数据。
def clip(text:str, max_len:'int > 0'=80) -> str:
end = None
if len(text) >max_len:
space_before = text.rfind(' ', 0, max_len)
if space_before >=0:
end = space_before
else:
space_after = text.rfind(' ', max_len)
if space_after >=0:
end = space_after
if end is None:
end = len(text)
return text[:end].rstrip()
函数的各个参数可以在:之后增加注解表达式。如果参数有默认值,注解放在参数名和= 之间。如果想注解返回值,在)和函数声明末尾的:之间添加 ->和一个表达式,表达式可以为任何类型,字符串或类,注解不会做任何处理,只是存储在函数的__annotations__属性中。
print(clip.__annotations__)
{'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}
- 支持函数式编程的包
- operator模块
使用匿名函数和reduce函数计算阶乘
from functools import reduce
def fact(n):
return reduce(lambda a, b: a*b, range(1, n+1))
operator模块为多个算术运算符提供了对应的函数。
from functools import reduce
from operator import mul
def fact(n):
return reduce(mul, range(1, n+1))