可迭代对象——容器
#比如一个列表
list01 = [43,5,6,77,80]
迭代过程
#通俗的讲迭代过程其实就是for的过程
for item in list01:
print(item)
可以被for的条件是什么?
答:能被for的对象必须具备__iter__方法
答:能被for的对象是可迭代对象
可迭代对象
1.如上所说,能被for的对象是可迭代对象
2.而可迭代对象就是为了可以迭代(for),而迭代的本质就是不断调用迭代器next方法
for循环的原理
for循环的原理是什么?
- 获取迭代器
# iterator为自定义的可迭代对象
iterator = list01.__iter__()
2.循环获取下一个元素
#可迭代对象提供 __next__ 方法
while True:
try:
item = iterator.__next__()
print(item)
3.遇到异常停止迭代
except StopIteration:
break # 退出循环
什么是生成器
生成器 本质就是(迭代器+可迭代对象.)
生成器原理
class MyGenerator:
# 生成器 = 可迭代对象 + 迭代器
def __init__(self,stop_value):
self.begin = 0
self.stop_value = stop_value
def __iter__(self):
return self
def __next__(self):
if self.begin >= self.stop_value:
raise StopIteration
temp = self.begin
self.begin+=1
return temp
代码转换为yield执行相同效果
#调用my_range方法时,并未立即执行代码,由于代码中存在yield,所以将代码转换为生成器原理代码,延迟一步再执行
#好方法的简洁写法
def my_range(stop_value):
number = 0
while number < stop_value:
yield number
number += 1
生成器最重要的特点调用一次next,计算一次结果,返回一个数据,
这个过程称之为惰性操作/延迟操作.
在海量数据下,可以大量节省内存.