迭代器与生成器
Posted ageliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器与生成器相关的知识,希望对你有一定的参考价值。
一、迭代器
简述:迭代器指的是迭代的工具,迭代指的是一个重复的过程;但是并不是单纯的重复而是基于上一次过程的结果及每一次迭代得到的最终结果都是下一次迭代的初值。
迭代的迭代方式:通过__next__()方法从迭代器对象的第一个元素开始访问一直到最后一个元素访问后迭代结束。
自定义的迭代器:
class Num(): def __init__(self,math): self.math=math self.n,self.a,self.b=0,0,1 def __iter__(self): return self def __next__(self): if self.n<self.math: temp=self.b self.a,self.b=self.b,self.a+self.b n+=1 return temp raise StopIteration print(Num(5)) for iter in Num(10): print(iter)
1、可迭代对象:包含有__iter__()方法的数据类型即为可迭代对象
‘hello‘.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {‘a‘:1}.__iter__ {‘a‘,‘b‘}.__iter__ open(‘a.txt‘).__iter__
2、迭代器对象:即包含__iter__() 和__next__()方法的对象,文件类型本身就是迭代器对象,而通过__iter__()方法得到的结果也是迭代器对象。
3、使用迭代器的意义在于:为没有索引的数据类型提供一个迭代取值的方式
4、示例
name_dict={ "name":"liu", "age":20, "hobby":"play game" } dict_iter=name_dict.__iter__() while True: try: k=next(dict_iter) print(name_dict[k]) except Exception : break
5、for循环的运行原理就使用了迭代器:
基于for循环,我们可以完全不再依赖索引去取值了 dic={‘a‘:1,‘b‘:2,‘c‘:3} for k in dic: print(dic[k]) for循环的工作原理: 1:执行in后对象的dic.__iter__()方法相当于自定义迭代器中的__iter__方法,得到一个迭代器对象iter_dic 2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码,相当于自定义迭代器中的__next__方法 3: 重复过程2,直到捕捉到异常StopIteration,结束循环
二、生成器
简述:生成器就是一个自定义的迭代器,生成器中带有yield使调用函数并不会执行函数内部的代码。
示例:
def Num(): print("1") yield 1 print("2") yield 2 print("3") yield 3 print("4") g=Num()
print(next(g))#"1"
生成器中yield与函数中return的区别:1、yield可以返回多次值,return只能返回一次值 2、yield只会暂停函数而return会结束函数
协程函数:生成器的表达形式
示例:
food_list=[] def Food(name): while True: Food_list = yield food_list print("%s喜欢吃%s" % (name, Food_list)) food_list.append(Food_list) g=Food("egon") g.send(None) g.send("apple") g.close()
补充:在函数中遇到多个yield时执行到一个yield函数就会暂停通过__next__()返回一个值,在使用协程函数时g.send()第一个值必须是None。
以上是关于迭代器与生成器的主要内容,如果未能解决你的问题,请参考以下文章