迭代器和生成器
迭代器和生成器
知识点补充:类和对象
- int str list ----类
- 由类创建的的东西叫做对象
迭代器
-
定义:对某对象(str/list/tuple/dict/set)【序列】【可迭代对象】中的元素进行逐一获取
-
在对字典进行迭代时,只对其键进行迭代
-
从列表中循环每一个元素
v1 = [11,22,33,44] v2 = iter(v1) #v1是迭代器 #或者 v2 = v1.__iter__() while True: #其实就是一个分类展示的步骤,因为生成的是一个整体的函数,相当于将其打散分类展示出 try: val = v2.__next__()#每次可迭代一个 print(val) except Exception as e: #如果有异常 break
-
如何判断一个对象是否为迭代器:1.内部是否有
__next__
方法 2.利用type( )函数 -
for循环内部就是迭代器
可迭代对象
-
可迭代对象的标记:
- 1.可以被for循环的 2. 内部有__iter__方法且返回一个迭代器
生成器
生成器函数
-
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束
# 生成器函数(内部是否包含yield) def func(): print('f1') yield 1 print('f2') yield 2 print('f3') yield 100 print('f4') # 函数内部代码不会执行,返回一个生成器对象 v1 = func() #函数不执行 #生成器是可以被for循环的,一旦开始循环那么函数内部代码就开始执行 for item in v1: print(item)
-
利用生成器生成1到10万
def func(): count = 1 while True: yield count count += 1 if count = 100000: return val = func() for i in val: print(i) #或者 if i >= 100000: break #优点边做边用
-
每次循环都会获得yield的返回值
def func(): return 2 yield 1 a = func() print(a)
-
只要yield存在就是生成器
练习题
-
分行读取文件的内容
def func(): cursor = 0 while True: f = open('db','r',encoding = 'utf-8') f.seek(cursor) data_list = [] for i in range(10): line = f.readline() if not line: return data_list.append(line) cursor = f.tell() f.close() for rew in data_list: yield rew for item in func(): print(item)
补充:
- 生成器还一种特殊的迭代器,也是一种特殊的可迭代对象,迭代可运行类似返回值,一步一停
记录学习的点点滴滴