day4 迭代器与生成器解析
一、迭代器
迭代器是访问集合元素的一种方式。其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态。迭代器是访问集合元素的一种方式。并且,迭代器只能前进,不能后退。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
特定:
(1).访问者不需要关心迭代器内部的文件,仅需通过next()方法不断去取下一个内容;
(2).不能随机访问集合中的某个值,只能从头到尾依次访问;
(3).访问到一半时不能往回退;
(4).便于循环比较大的数据集合,节省内存生成一个迭代器。
iter()用来声明迭代器,示例如下:
names = iter(["alex","sb",11,22,"gengchangxue"])
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
运行结果如下:
alex
sb
11
22
gengchangxue
Traceback (most recent call last):
File "/home/zhuzhu/day4/iterator.py", line 7, in <module>
print(names.__next__())
StopIteration
从上面结果可以看出,迭代器是使用__next__()方法来遍历集合中的每一个元素,当超过列表的长度的时候会出现错误,stoplteration(停止迭代)。上面集合有5个元素,我们去了6次,结果就报错。迭代器只能从元素的第一个值开始遍历,直到所有的元素遍历完为止。中间过程不能后退,也不能取中间某个特定位置的值。
迭代器中只有一个__next__()方法,用来去元素。
二、生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。
其实,生成器(generator)函数中包含yield,yield的作用与return作用类似,只是yield结束本地循环之后,记录程序运行的状态,能够保持在当前状态,当用户再一次调用的时候,会从这里开始,重新进行循环,并且,yield能够返回一个值给函数,并且yield与send结合还能够接收返回值。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
上面我们写了一个函数,并且调用这个函数,但是print()语句并没有执行。下面来看看atm的类型:
print(type(atm))
运行如下:
<class 'generator'>
可以看出,atm是一个生成器,生成器的调用要使用__next__()方法。实例如下:
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
生成器的作用,我们之前学的程序都是串行的,从上到下进行执行,如果中间某个过程没有执行,那么会一直等待,但是我们使用yield就能够保持记忆功能。让程序其做其他的事情,作用之后在回来继续做这件事情,比如我们去做一个大保健,做完之后重新回来取钱。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
print("叫个大保健")
print(atm.__next__())
运行结果如下:
100
败家子,又来取钱了!...
100
叫个大保健
败家子,又来取钱了!...
100
yield就是保存函数的状态,可以让我们先去完成其他事情,然后继续执行。生成器在某些时候很有用,比如我们想保存之前用户的状态,以便用户下次登录能够知道之前的信息。比如银行的系统,用户取钱之后肯定要进行减去金额,并且保存之前操作的状态。