1、enumerate():可以把一个序列变成索引-元素对
enumerate2、列表生成式:
list(range(1,11)) -->[1,2,3,4,5,6,7,8,9,10]
[x * x for x in range(1,11) if x %2 == 0]----->偶数的平方
[m + n for m in 'ABC' for n in 'XYZ'] --->全排列['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']
3、生成器generator:一边循环一边计算的方法,生成器保存的是算法
(1) 简单的生成器:g = (x * x for x in range(1,11)),使用next(g)可获取一个值,最好是遍历:
for num in g:
print(num)
(2)使用yield关键字定义的生成器:如果一个函数定义中包含yield关键字,那么这个函数就不是普通函数,而是生成器generator
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b,a+b
return "done"
generator和普通函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。普通函数调用直接返回结果,而generator函数的“调用”实际返回一个generator对象。
遍历yield生成器:
for num in fib(5):
print(num)
获取generator函数的return返回值:用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
获取generator函数的return值4、迭代器
可直接作用于for循环的数据类型有以下几种:
(1)集合数据类型:list,set,tuple,str,dict
(2)generator生成器:生成器和带yield的generator function
这些可以直接作用于for循环的对象称为:可迭代对象Iterable
可以被next()函数调用并不断返回下一个值的对象称为:迭代器Iterator
生成器都是Iterator,但是可迭代对象Iterable却不是Iterator
把Iterable变成Iterator可以用iter()函数
为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
总结
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的,例如:
网友评论