迭代器和生成器
知识点补充:类和对象
- 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)
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)
补充:
- 生成器还一种特殊的迭代器,也是一种特殊的可迭代对象