迭代器
概念:
一个类(对象)只要含有“iter”、"next"两个方法,就将其称为迭代器。
对于__iter__方法,它需要具有一个可以返回一个迭代器对象的功能(这个对象可以是自己(前提是本身就是一个迭代器),也可以是其它迭代器);
对于__next__方法,它需要标记并返回下一个迭代器对象;元组,列表,字典,字符串,集合,range都是可迭代对象,但不是迭代器。

执行了红框的之后,再接着红框的数据往下执行,即该生成器的原数据为0,1,1,2,3,5,8,13,调用一次少一个数据
结论1:迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完。
结论2:可迭代对象不一定是迭代器,迭代器一定是可迭代对象。
譬如列表,元组之类的是可迭代对象,不是迭代器

迭代器的使用1:

如图1775行的lines就是一个迭代器
迭代器的使用2:

代码块:
class Fibonacci(object):
def __init__(self, nums):
self.nums = nums
self.before = 0
self.after = 1
self.i = 0 # 判断在传入数字范围内
def __iter__(self):
return self
def __next__(self):
ret = self.before
if self.i < self.nums:
self.before, self.after = self.after, self.before + self.after
self.i += 1
return ret # 返回第一个值
else:
print('aaa')
# raise Exception('完成')
return 'aaa'
if __name__ == '__main__':
nums = 300000
myFabonacci = []
time1 = time.time()
fb = Fibonacci(nums)
for i in fb:
if i == 'aaa':
print('i的值', i)
print(len(myFabonacci))
break
myFabonacci.append(i)
time2 = time.time()
print('时间1', time2 - time1)
myFabonacci2 = []
a = 0
b = 1
i = 0
while i < nums:
myFabonacci.append(a)
a, b = b, a + b
i += 1
else:
print(len(myFabonacci2))
time3 = time.time()
print('时间2', time3 - time2)
生成器
两种生成形式或者是其概念:
1、和列表推导式的定义相似,生成器表达式使用的是()而不是 [ ] ,可以称其为元组推导式;
2、只要函数中有yield关键字的就是生成器。
例如----元组推导式:

可以使用next()函数进行输出,如图在第五次输出的时候就报错,因为没有数据了
例如----含yield关键字的函数:

可以使用next()函数进行输出,如图在第五次输出的时候就报错,也是因为没有数据了
总结:生成器也是一种迭代器
什么情况下使用迭代器?
1). 如果数列的数据规模巨大
2). 数列有规律,但是依靠列表推导式描述不出来
什么时候使用生成器?
1). 节省内存
2). 流式处理数据
3). 无限的数据
本文介绍了迭代器的概念,强调了它们如何通过逐个生成数据来节省内存。Python中的列表、元组等是可迭代对象,但不是迭代器。文章还讨论了生成器的两种形式以及何时选择使用迭代器和生成器,特别是在处理大规模数据和有规律但难以用列表推导描述的情况下。

1万+

被折叠的 条评论
为什么被折叠?



