有人可能会问,python中的数据结构,列表,字典,元组,集合,不是已经够用了吗?这个迭代器和生成器是神马东东,怎么以前没有听过呢。
腾讯的电话面试,python方面元组列表的问题一个没有问,直接问的生成器和迭代器。
回想一下“可迭代对象”。简单说,可迭代对象就是可以用for循环依次取值的一个序列。字典,元组,列表,集合,都是可迭代对象。
#满足循环条件,eg
for i in s():
print(i)
而迭代器,首先要满足可迭代。在此基础上,可以用next()来进行取值。
而生成器,是在迭代器的基础上,加了暂停键。即在迭代器的基础上给了与暂停功能的函数。生成器其实就是一种特殊的迭代器。它是一种更为高级、更为优雅的迭代器。
画了一张图,他们之间是包含和被包含的关系。可迭代对象>>>迭代器>>>生成器。
那么为什么要使用迭代器和生成器呢?因为有效的节省内存,高效,优雅。
迭代器有两个基本的方法:iter() 和 next()。iter()是用于创建,next()是用于遍历。
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
参考菜鸟教程中的迭代器:
```python
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
#result
#1
#2
#3
#4
#5
简单说,迭代器的创建就是元素按照顺序输出。
生成器在迭代器的基础上给了与暂停功能的函数。
有一段文字:
生成器函数的一个例子:
你的笔记本电脑是8800块钱,但是你没有能力一次性购买,或者说你不想和亲戚朋友借钱,所以你在支付宝办了8个月分期还款来缓解自己的压力(生成器),就这样支付宝每次给你发这个月的账单你就还一次1100元,直到8个月后你就把钱还完了这就是生成器,每个月来了账单就还一次,直到把钱还完这样就不会在一次性还钱的时候把自己给急疯了,支付宝也能够收到它的钱的!这就是生成器的作用,如果我们产生的数据很多,数据量很大的话,很容易把进程跑死或者把服务器跑崩溃,这个生成器就很好的解决了这个问题。
** 生成器每个数据只使用和保留一次**
基于上述特性,生成器最好的场景就是当你需要以迭代的方式去遍历一个巨大的数据集合。比如:一个巨大的文件/一个复杂的数据库查询等。
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
参考菜鸟的代码:
#!/usr/bin/python3
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
#result 0 1 1 2 3 5 8 13 21 34 55