python基础(迭代器和生成器)
---恢复内容开始---
一、迭代器
可迭代对象:Iterable,例如,ist,str,tuple,dict,set,range(100)。
具有__iter__方法的叫做可迭代对象。
迭代器:Iterator,例如,文件句柄。
具有__next__,__iter__方法的叫做迭代器。
迭代器调用__iter__()方法还是自身。
可迭代对象与迭代器的关系:
可迭代对象调用了__iter__()方法变成迭代器。
2.判断是否是可迭代对象,迭代器的方法。
(1)可迭代对象有__iter__方法,没有__next__方法
迭代器有__iter__ __next__方法
(2)iterable:形容词 可迭代的:from collections import Iterable:用来检测一个对象是否可以迭代。
isinstance()判断数据的类型,查看是否可迭代。
3.for循环的本质
for循环可以遍历一个可迭代对象,也可以遍历一个迭代器。
当遍历一个可迭代对象时,会自动调用其__iter__()方法,变为一个迭代器。然后调用__next__()方法。遇到StopIteration终止。
4.迭代器取值与索引取值的对照
(1)迭代器的缺点:不能定点取值。
不能往回取值。
(2)迭代器的优点:惰性计算,节省内存。
可以遍历字典,集合取值。这点是索引无法做到的。无序且不知道有哪些key值。
文件本质也是一个迭代器。range()就是一个可迭代对象,可迭代对象有:字符串,列表,元组等等。
__iter__():将一个可迭代对象转化成一个迭代器
__next__():读取迭代器的内容,一次只能读取一行或者一个内容
# with open('a.txt',encoding='utf-8')as f:
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
#
# b=[41,52,5,26,7,4,2,9,]
# bb=b.__iter__()
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
二 生成器 Generator
生成器本质上是迭代器。
生成器是用户写出来的。
1.生成器的分类
带有yield关键字的生成器函数
由生成器表达式生成的生成器
2.生成器函数
带有yield关键字的函数叫做生成器函数。
与普通函数的不同之处:调用生成器函数返回来是生成器。可以用for循环转化,也可以用list强转,也可以用 next来一个一个转换。
推荐用for,方便又省内存。
yield关键字:
与return相同的部分:
与rerurn不同的部分:
三、生成器的应用
生成器可以模仿管道的概念,借助生成器,可以一直往外传值。
也可以用send方法给生成器传值。
def foo():
money=0
day=0
average=0
while True:
value=yield average
money+=value
day+=1
average=money/day
g=foo()
print(g.__next__())
print(g.send(200))
而生成器和迭代器运行的顺序是只能往前取值,而不能够回头。
生成器的用法:1 有几个next,就取几个yield的返回值,不能超过yiled的范围。
2 直接for循环取值:for 变量名 in 生成器名。
3 其他数据类型进行强转,list(数据类型对象)返回一个列表,里面装着生成器的所有内容。
注意:1 生成器函数取值必须先转换成生成器,在进行next取值。
2 生成器的内容只能取一次,不能重复,只能向前取值;不能后退,直到取完为止。
惰性运算:生成器里面的内容不获取,不生成。只有在要值的时候现生成。
for i in range(1,10):
print(i)
print(list(range(10,20)))
---恢复内容结束---
浙公网安备 33010602011771号