目录:
一、列表生成器
二、生成器
三、迭代器
一、列表生成器
a = [x for x in range(10)] b= [y*2 for y in range(10)] def f(n) return n*n*n c = [f(z) for z in range(10)]
列表生成器会将所有的内容加载到内存中,在生成大量的数据时,会占用内存
生成器只会生成一个 generator object ,占用很少内存,只会在调用时才产生值。且只能按顺序取值
二、生成器
1、基础代码
b = (x for x in range(10)) print(b) print(next(b)) # 等价于 b.__next__() 等价于python2中的b.next() print(b.__next__()) for i in b: print(i) '''output <generator object <genexpr> at 0x000002900B1BB308> 0 1 2 3 4 5 6 7 8 9 '''
2、两种生成方式
① (x for x in range(10))
② yield方式
第②种代码
def foo(): print("ok") yield 1 print("fine") yield g = foo() print(g) # next(g) # aa = next(g) # print(aa) for i in g: print(i)
遇到函数中有 yield 则该函数为生成器
一个yield是一个生成器的生成物的结点,它会返回yield 后面的内容,然后结束,直到下一个next的调用
3、send()方法
def bar(): c = yield 0 print(c) print("ok1") count = yield 1 print(count) print("ok2") yield 2 g = bar() print(g) # print(next(g)) print(g.send('ccc')) # TypeError: can't send non-None value to a just-started generator print(g.send("qqqq"))
send()方法与next()方法类似,但可以向生成器中传值,用于一些交互场景,但在第一个send()前如果没有next(),只能传一个send(None),否则会出现 TypeError: can't send non-None value to a just-started generator
三、迭代器
参考博客:Python之路,Day4 - Python基础4 (new版)
什么是迭代器?
满足两个条件:①有iter方法 ②有next方法
区别迭代器与可迭代对象
from collections import Iterator,Iterable l = [1, 2, 3] print(isinstance(l,list)) print(isinstance(l,Iterator)) # False 不是迭代器 print(isinstance(l,Iterable)) # True 是可迭代对象 for i in l: print(i)