在说之前先简单介绍一下迭代和可迭代对象:
1.迭代: 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程
for value in [1, 2, 3]:
print(value)
2.可迭代对象: 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串
3.整数类型不能被迭代
迭代器(iterator)
迭代器的作用是帮我们记录每次迭代时所访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会给我们返回一个它所记录的位置的下一个位置的数据.
简单来说迭代器说就是实现下面两个方法:
(1): iter函数: 获取可迭代对象的迭代器,会调用可迭代对象身上的__iter__方法
(2): next函数: 获取迭代器中下一个值,会调用迭代器对象身上的__next__方法
为什么使用迭代器:
我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
下面我们使用迭代器实现一个 斐波那契数列 的案例:
class Fibonacci(object):
def __init__(self, num):
# num:表示生成多少fibonacci数字
self.num = num
# 记录fibonacci前两个值
self.a = 0
self.b = 1
# 记录当前生成数字的索引
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
if self.current_index < self.num:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.current_index += 1
return result
else:
raise StopIteration
fib = Fibonacci(5)
# value = next(fib)
# print(value)
for value in fib:
print(value)
执行结果为:
0
1
1
2
3
小结:
1.迭代器对象要求支持迭代器协议的对象,在Python中,
2.支持迭代器协议就是实现对象的__iter__()和next()方法。
3.其中__iter__()方法返回迭代器对象本身;
4.next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。
接下来我们来聊聊生成器:
生成器是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了, 使用更加方便,它依然可以使用next函数和for循环取值
创建生成器方法1
第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )
my_generator = (i * 2 for i in range(5))
print(my_generator)
for value in my_generator:
print(value)
执行结果:
<generator object <genexpr> at 0x101367048>
0
2
4
6
8
第一种方法: 在def函数里面看到有yield关键字那么就是生成器,同样以 斐波那契数列 为例:
def fibonacci(num):
a = 0
b = 1
# 记录生成fibonacci数字的下标
index = 0
while index < num:
result = a
a, b = b, a + b
index += 1
# 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
yield result
for value in fibonacci(5):
print(value)
执行结果为:
0
1
1
2
3
小结
生成器创建有两种方式,一般都使用yield关键字方法创建生成器
yield特点是代码执行到yield会暂停,把结果返回出去,再次启动生成器在暂停的位置继续往下执行