函数参数
- 位置参数:
def power(x):
- 默认参数:
def power(x, n=2):
默认参数必须指向不变对象! - 可变参数:
def calc(*numbers):
- 关键字参数:
def person(name, age, **kw):
- 命名关键字参数:
def person(name, age, *, city, job):
参数组合: 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
递归及尾递归优化
切片
迭代 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。 通过collections模块的Iterable类型判断一个对象是否可迭代
1 | >>> from collections import Iterable |
如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
1 | >>> for i, value in enumerate(['A', 'B', 'C']): |
列表生成器
1 | list(range(1, 11)) |
生成器:generator 不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制 方法一:只要把一个列表生成式的[]改成(),就创建了一个generator:
1 | >>> L = [x * x for x in range(10)] |
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:
1 | >>> next(g) |
断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:
1 | >>> g = (x * x for x in range(10)) |
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator: 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
迭代器
高阶函数 map/reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
filter: 用于过滤序列
sorted: 对list进行排序
返回函数
匿名函数
装饰器
1 | def log(func): |
偏函数 functools.partial