本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、生成器函数
生成器函数:
def gensquares(N):
for i in range(N):
yield i ** 2
此函数不断生成一系列数字的平方
for i in gensquares(5):
print(i,end=" : ")
>>>0 : 1 : 4 : 9 : 16 :
二、生成器表达式
生成器表达式同列表解析式几乎相同,只是将方括号改为了圆括号。并且列表解析式直接返回的是一个列表,而生成器解析式返回的是一个迭代器。
列表解析式:
>>>[x**2 for x in range(5)]
[0,1,4,9,16]
生成器表达式:
>>>(x**2 for x in range(5))
<generator object <genexpr> at 0x00000175EF39FC80>
三、迭代协议
迭代器是python中的一个非常重要的内容,下面我面简要介绍一下关于迭代协议的内容。 迭代协议:有__next__方法的的对象会前进到下一个结果,而在一系列结果的末尾时会引发StopInterration。在python中,任何这类对象都是可迭代对象。均可由for或其他迭代工具来进行遍历,因为迭代工具内部会自动调用__next__方法,并且会捕捉StopInterration异常来结束迭代。 python中有许多可迭代对象,例如range迭代器、map、zip、filter迭代器、list、字符串迭代对象等等,在此不一一列出。
四、列表解析
列表解析是函数式编程思想的一个重要工具。 L = [x*2 for x in range(5)] L >>>[0,2,4,6,8] 列表解析式比for循环更快,因为列表解析式是用C语言来运行的,比python的for循环代码在PVM中步进运行快的多。另外列表解析有一些扩展:
L=[x + y for x in range(5) for y in range(5)]
L
>>>[0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]
列表解析可以用在多个地方,比如文件、字典等等
五、列表解析和filter、map的比较
例:
symbols = "abcdfg"
L = [ord(s) for s in symbols if ord(s)>98]
L
>>>[99, 100, 102, 103]
symbols = "abcdfg"
L = list(filter(lambda c : c>98,map(ord,symbols)))
L
>>>[99, 100, 102, 103]
看起来,或许列表解析式更加简单易懂一点!