day14迭代器和生成器
迭代器Interator
字符串
列表
元组
字典
集合
文件句柄、文件操作符
range
都是可迭代的
都可以使用for循环,所以说它们中的数据类型可以被一个一个取出。
iterable形容词 就是将某数据内的数据一个一个取出来 就是可迭代。
from collections import Iterable #检测一个对象是否可迭代
print(isinstance("aaa",Iterable))
print(isinstance(123,Iterable))
print(isinstance([1,2,3],Iterable))
# True
# False
#True
iterable adj.可迭代的
只要包含“双下iter"方法的数据类型就是可迭的 ---------可迭代协议。
#.__iter__()
iterrator n.迭代器
就是能实现一个一个能中取值出来。
迭代器中有__iter__和__next__方法 --------迭代协议。
lis_iterator = [1,2,3].__iter__()
验证一下:
form collections import Iterator
print(isinstance(lis_iterator,Iterator))
print(isinstance([1,2,3],Iterator))
结果:
True
False
结论:#列表+ __iter__就变成了迭代器 ,而列表只是可迭代的。
# 在python中学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器。
迭代器与可迭代对象之间的关系:
迭代器 = 可迭代对象 .__iter__()
lst_iterator = [1,2,3].__iter__()
print(lst_iterator.__next__())
print(lst_iterator.__next__())
print(lst_iterator.__next__())
结果:
1
2
3
StopIteration #如果要输出的内容超过了列表中的元素,那么就会出现一个StopIteration的这样一个提示。
因此我们可以利用while循环来完成输出,具体如下。
while True:
try:
print(lst_iterator.__next__())
except StopIteration:
break:
迭代器的本质是什么:
1、能够对python中的基本数据类型进行统一的遍历,不需要关心每个值分别是什么。 (lis = [1,2,3,4,"abc","字符串"])
2、它可以节省内存---------惰性运算。
# f = open('file','w') #文件句柄就是一个迭代器
# range(10000000).__iter__() #range就是一个可迭代的对象
迭代器总结:
1、天生的,比如文件句柄
2、后天的,可迭代对象.__iter__()
生成器Generator
生成器就是迭代器
生成器函数
生成器表达式
def generation_func(): print("111") yield "aaa" print("222") yield"bbb" g = generation_func() ret = g.__next__() print(ret) ret2 = g.__next__() print(ret2)
#输出
111
aaa
222
带yield关键字的函数就是生成器函数
生成器函数在执行的时候只返回一个生成器,不执行生成器函数的内容
从生成器中取值
1、.__next__有几个yield就可以取几次
2、for 循环取值 正常取 for i in g:
3、其他数据类型进行强制转换 list(g) 返回一个列表,里面装着生成器里的所有内容。
注意:在调用生成器函数的时候,要先调取生成器,在进行next取值。
生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。
def generator():
yield
yield 2
g = generator
for i in g:
print(i)
print(list(g))
结果:
None yield后面为空时
2
[] 因为生成器只能取一次 ,后面才取出空列表。
def clothing(): for i in range(1,200000): yield “第%s件衣服”%i g = clothing() for j in range(50): #循环次数 print(g.__next__())
或者:
def clothing():
for i in range(1,200000):
yield “第%s件衣服”%i
g = clothing()
for j in g: #循环返回值
print(j)
if j =="第50件衣服":
break
新用法 之 yield from
def func():
yield from [1,2,3]
yield from "abc"
g = func()
for i in g:
print(i)
#结果
1
2
3
a
b
c

浙公网安备 33010602011771号