一、迭代器:访问元素
两个方法:next()和iter()
字符串,列表或元组对象都可用于创建迭代器。
遍历元素:
list=[1,2,3,4]
it = iter(list) #创建迭代器对象
for x in it: #遍历元素
print (x, end=" ")
1 2 3 4
也可以使用next():
import sys #引入 sys 模块
list=[1,2,3,4]
it = iter(list) #创建迭代器对象
while True:
try: #遍历元素
print (next(it))
except StopIteration: #StopIteration异常用于标识迭代的完成,防止出现无限循环
sys.exit()
1
2
3
4
二、生成器:在Python中,一边循环一边计算的机制,称为生成器:generator。
即生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是我什么时候调用它,它什么时候开始计算一个新的值,并给你返回。
1.为什么要有生成器:
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
简单的说:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
2.如何创建生成器
方法一:把一个列表生成式的[]改成(),就创建了一个generator
方法二:如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。
3.工作原理
(1)生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。
next 两种方式 t.next() 或 next(t),可用for 循环获取返回值(每执行一次,取生成器里面一个值)(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)
(2) yield相当于return返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。其作用和return的功能差不多,就是返回一个值给调用者,只不过有yield的函数返回值后函数依然保持调用yield时的状态,当下次调用的时候,在原先的基础上继续执行代码,直到遇到下一个yield或者满足结束条件结束函数为止。
import sys
def fibonacci(n): #生成器函数-斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n) : #直到counter>10退出
return
yield a #返回值a,然后挂起函数,等待下一次调用
a, b = b, a + b #调用后会继续执行下去
counter += 1
f = fibonacci(10) #调用生成器函数,f是一个迭代器,由生成器返回生成
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
0 1 1 2 3 5 8 13 21 34 55