#列表生成式
#列表生成式 m = [x for x in range(10)] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(m)
def add(n): return n*2 s = [add(x) for x in range(10)] print(s) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
生成器:两种创建方式
#方式一:
s = (x for x in range(100)) #生成器取值下面两种方式等价 # m = s.__next__() print(next(s)) # 0 print(next(s)) # 1 #也可以用for循环 for i in s: #生成器就是可以可迭代对象 print(i)
#方式二:yield
def foo(): yield 1 print(foo()) #<generator object foo at 0x000001A11A30FF10> 生成器对象 for i in foo(): print(i) #打印出一个1
可迭代对象:对象拥有iter方法的
#斐波拉契数列
def fib(max): n,before,after = 0,0,1 while n < max: yield before before,after = after,after+before n = n + 1 print(fib(8)) #<generator object fib at 0x000001DC7CF54888> m = fib(8) for i in m: print(i) #打印结果 #0 #1 #1 #2 #3 #5 #8 #13
生成器都是迭代器,迭代器不一定是生成器
迭代器满足两个条件
1.有iter方法
2.有next方法
l = [1,3,2] m = iter(l) #<list_iterator object at 0x000002DBDC60D208> 返回一个迭代器对象 print(next(m)) #1 print(next(m)) #3
for 循环内部三件事:
1.调用可迭代对象的iter方法返回一个迭代器对象
2.不断调用迭代器对象的next方法
3.处理StopIteration异常
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。