lambda 表达式
lambda 是个关键字,然后是冒号,冒号左边是传入函数的参数,冒号后边是函数实现表达式以及返回值。
如果使用传统的函数定义方式,应该是这样:
def
... 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()
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 "
" , line 1, in - 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