lambda 表达式
lambda 是个关键字,然后是冒号,冒号左边是传入函数的参数,冒号后边是函数实现表达式以及返回值。
如果使用传统的函数定义方式,应该是这样:
def <lambda>(arg1, arg2, arg3, ... argN):
... return expression
举个例子:
>>> def squareX(x):
... return x * x
...
>>> squareX(3)
9
>>> squareY = lambda y : y * y
>>> squareY(3)
9
前者是函数定义的方法,后者是使用lambda表达式
lambda 是一个表达式,因此它可以用在常规函数不可能存在的地方:
举个例子,比如放在列表之中:
>>> y = [lambda x : x * x, 2, 3]
>>> y[0](y[1])
4
>>> y[0](y[2])
9
与map(),filter()函数混合使用
>>> list(mapped = map(lambda x : ord(x) + 10, "FishC"))
[80, 115, 125, 114, 77]
>>> list(filter(lambda x : x % 2, range(10)))
[1, 3, 5, 7, 9]
生成器
在 Python 中,使用了 yield 语句的函数被称为生成器(generator)。
与普通函数不同的是,生成器是一个返回生成器对象的函数,它只能用于进行迭代操作,更简单的理解是 —— 生成器就是一个特殊的迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 yield 方法时从当前位置继续运行。
定义一个生成器,很简单,就是在函数中,使用 yield 表达式代替 return 语句即可。
>>> def counter():
... i = 0
... while i <= 5:
... yield i
... i += 1
现在我们调用 counter() 函数,得到的不是一个返回值,而是一个生成器对象:
>>> counter()
<generator object counter at 0x0000025835D0D5F0>
我们可以把它放到一个 for 语句中:
>>> for i in counter():
... print(i)
...
0
1
2
3
4
5
支持 next() 函数:
>>> c = counter()
>>> next(c)
0
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
4
>>> next(c)
5
next(c)
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
next(c)
StopIteration
由于生成器每调用一次获取一个结果这样的特性,导致生成器对象是无法使用下标索引这样的随机访问方式
生成器表达式
>>> t = (i ** 2 for i in range(10))
>>> next(t)
0
>>> next(t)
1
>>> next(t)
4
>>> next(t)
9
>>> next(t)
16
>>> for i in t:
... print(i)
...
25
36
49
64
81