python_生成器&&迭代器
#迭代器的概念
dir([])方法:#告诉我列表拥有的方法(双下方法)
#双下方法(带双下划线的方法 例:_add_) : 都是已经写好的C语言代码,并可以通过不只一种方法可以调用它
##一般双下方法不直接被我们调用
#求交集用set()函数: set(dir([]))&set(dir(''))&set(dir(range(9))) #&求列表的交集
#只要是能被for循环的数据类型,就一定拥有 _iter_方法
#什么是迭代器?
print([]._iter_())
#一个列表执行了_iter_()之后的返回值就是一个迭代器
#只要含有_iter_()方法的都是可迭代的,都可以被for循环
#迭代器通过 _next_()方法就可以从迭代器中一个一个取值
#只要内部含有_next_()和_iter_()方法的都是迭代器
#迭代器的好处:
#从容器类型中一个一个取值,会把所有的值都取到
#节省内存空间
#迭代器并不会在内存中再占用一大块内存,
#而是随着循环,每次生产一个,每次next每次给我一个
isinstance()方法,判断参数的数据类型
print(isinstance([],Iterable))
#for循环其实就是在使用迭代器
#当我们遇到一个新的变量,不确定能不能for循环的时候,就判断他是否可迭代
#遇到迭代器的两种情况:
#已明确告诉你是一个iterator
#直接给一个内存地址,可能是一个迭代的
#拿到一个函数没有值,猜测 可能是一个迭代器
#for循环剖析:
for i in l :
pass
#代码执行解析:
iterator = l._iter_()
iterator._next_()
#生成器函数
#只要含有yield关键字的函数都是生成器函数
def generator() : #generator() 是一个生成器函数
print(1)
yield 'a' #yield只能写在函数里 , 并且不能和 return 共用
#return会直接结束一个函数而 yield不会结束
print(2)
yield 'b'
#只要是生成器函数 :执行之后会得到一个生成器作为返回值
ret = generator() #ret是一个生成器
print(ret)
r = ret._next_() #生成器也是一个迭代器, 可以利用在迭代器中取值的方法来取值 (next);执行一次yield只能取到一次 yield返回值(但函数并没有结束)
print (r)
r = ret._next_() #生成器也是一个迭代器, 可以利用在迭代器中取值的方法来取值 (next);执行一次yield只能取到一次 yield返回值(但函数并没有结束)
print (r)
for i in set : #用for循环 可以一次性读取生成器中所有的yield,但是不能单个读取,只能一次全部读完
print (i)
浙公网安备 33010602011771号