目录
前言
学习掌握迭代器生成器的用法。
一、迭代器
1、什么是迭代?
迭代是一个过程重复但是结果并不重复的过程,其每次重复运行都有关联,比如:
list1=[1,2,3,4,5,6,7,8]# 是迭代的过程
for i in list1:
print i
#而下面的不是迭代
while True:
print("==========>")
2、什么是可迭代对象?什么是迭代器对象?
列表[] 字典{} 元组() 字符串"hello" 文件file 集合set等都是可迭代对象,其中file文件对象既是可迭代对象也是迭代器对象。
可迭代对象是指,可以执行__iter__()的对象,比如:
列表[] 字典{} 元组() 字符串"hello" 文件file 集合set等都是可迭代对象,其中file文件对象既是可迭代对象也是迭代器对象。
list1=[1,2,3,4,5,6,7,8]
print(list1.__iter__())#<list_iterator object at 0x000002261DC5D070>
迭代器对象:
list1=[1,2,3,4,5,6,7,8]可迭代对象
list1.__iter__()迭代器对象
要迭代器对象运行,开始迭代,需要执行.__next__()方法。
list1=[1,2,3,4,5,6,7,8]#可迭代对象
iter_list1=list1.__iter__()#迭代器
print(iter_list1.__next__())#执行一次,输出一个结果。可用一个while循环。
3、迭代器优缺点
优点:节省内存,可以不依赖索引值取值。
缺点:只能从前往后取值,不知道取值的长度。
二、生成器
1.什么是生成器,常见的用法
生成器是一种特殊的迭代器,是一种我们自制的迭代器。yield可以把函数停住。 比如:
#自定义的生成器,一般的range(start,stop,step)的step只能是整数 def my_range(start,stop,step): n=start while n < stop: yield n n+=step print(n) res=my_range(1,10,0.5) while True: try: print(res.__next__()) except: break
def eat(name): print("%s is read for eating" %name) while True: food=yield print("%s is read for eat %s" %(name,food)) person1=eat("Albert") person1.__next__()#Albert is read for eating 因为函数在yield那里停住了 person1.__next__()#再执行的时候才传值进去,这里相当于传的None所以运行结果为: #Albert is read for eating #Albert is read for eat None
2.生成器的传值
def eat(name): print("%s is read for eating" %name) foods=[] while True: food=yield print("%s is read for eat %s" %(name,food)) foods.append(food) print("%s has eaten %s" %(name,foods)) person1=eat("Albert") person1.send(None)#yield函数的初始化,其效果等同于person1.__next__() person1.send("蒸羊羔")#传值用.send() person1.send("蒸鹿茸") person1.send("烧子鹅") person1.send("烧花鸭") person1.send("蒸熊掌") person1.close()#关闭生成器
总结