玩转迭代器和生成器
1.迭代器
一、迭代器的概念
迭代器即迭代的工具,那什么是迭代呢?
迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
# 比如 while True: print('你好,你是谁') # 上面这个不是迭代器,单纯的循环不是迭代器的体现 # 先定义一个列表 ls = [1,2,3,4,5] count = 0 while count < len(ls): # 这里才是迭代的表现 print(ls[count]) count +=1
二、迭代器怎么使用?可迭代对象和迭代器对象是什么?
# 迭代器应该怎么使用呢? # 在我们学过的数据类型中,字符串、列表和元组都是有序的数据类型,对于有序的数据类型,我们通常通过索引来取值;然而,对于字典,集合和文件类型来说,它们都是无序的,所以不能够通过索引来取值,因此,对于迭代器来说,他就是不依赖索引来取值的。 # 那么什么又是可迭代对象呢? # 可迭代对象有以下的特点:就是他的内置功能中存在__iter__()方法,类似于obj.__iter__().列如: 'strnaem123'.__iter__() [1,2,3,4,5].__iter__() (1,2,3,4,5).__iter__() {'a':1,'b':2}.__iter__() open('user.txt').__iter__() # 那么什么是迭代器对象呢? # 类似于可迭代对象来说,可迭代对象的迭代结果就是迭代器对象,因此,迭代器对象中既存在可迭代对象的方法__iter__(),也存在__next__()方法。列如: open('user.txt').__iter__() open('user.txt').__next__() # 所以说,可迭代对象不一定是迭代器对象,但是迭代器对象百分之百是可迭代对象,毋庸置疑的存在。
三、使用迭代器的案列
# 定义一个字典,本身是一个可迭代对象 dic = {'a':1,'b':2,'3':3} info = dic.__iter__() # 得到的是迭代器对象,但是对于迭代器来说,对于迭代器来说使用__iter__()就是迭代器的本身了。 print(info.__next__()) print(info.__next__()) print(info.__next__()) print(info.__next__()) # 首先在定义字典中本身就存在三个值,在经过上面的迭代器对象的方法后,这里继续取值就睡报错了 # 我们通过抛出异常来处理报错 while True: try: mm= info.__next__() print(dic[mm]) Exception: break # 但是如果每次都这样的话,我就很烦,对于程序员懒惰的群体来说,这太复杂了,必定会寻求简单的方法,取而代替。 # 那就是for循环了 ls = {'a':1,'b':2,'c':3} for k in ls: print(ls[k]) # 这样就会很简单了
四、使用迭代器的优缺点
# 优点:可以不依赖索引进行取值 # 缺点:不能够计算数据的长度,不能根据索引进行取值(只能从前往后依次进行取值)
五、生成器
# 什么是生成器? # 只要在定义的函数里出现了yeild关键字,那么这个函数的返回就是一个生成器,也不会执行函数里的代码。
# 列如: def my_range(min, max=0, step=1): if max == 0: min, max = max, min tag = min while True: tag += step if tag >= max: break yield tag # range_obj = my_range() # print(range_obj.__next__()) # print(range_obj.__next__()) # print(range_obj.__next__()) for i in my_range(10): print(i)