Python迭代器和生成器都是访问集合元素的一种方式。
一、迭代器
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。
1、迭代器有两个基本的方法:
iter() 创建迭代器对象
next() 输出迭代器的下一个元素
from collections.abc import Iterator
s = '123'
it1 = iter(s)
print(isinstance(it1, Iterator)) #判断一个对象是否迭代器对象,输出:True
print(next(it1)) #输出:1
print(next(it1)) #输出:2
print(next(it1)) #输出:3
#print(next(it1)) #超出范围会运行报错StopIteration
li = [1,2,3]
it2 = iter(li)
print(next(it2)) #输出:1
print(next(it2)) #输出:2
print(next(it2)) #输出:3
it3 = iter(li)
#用list可将迭代器转换为列表
print(list(it3))
2、迭代器遍历的两种方式:for、while
import sys
s = '123'
it1 = iter(s)
for i in it1:
print(i)
li = [1,2,3]
it2 = iter(li)
while True:
try:
print(next(it2))
except StopIteration:
sys.exit()
3、把一个类作为迭代器使用:在类中实现__iter__()与 __next__() 方法
# 斐波那契数列
class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def __next__(self):
self.a,self.b = self.b, self.a+self.b
return self.a
def __iter__(self):
return self
fibs = Fibs()
for f in fibs:
if f > 1000:
print(f)
break
二、生成器
生成器是一种特殊的迭代器,使用了 yield 的函数被称为生成器,即生成器是一个返回迭代器的函数,只能用于迭代操作。
1、创建生成器
# 生成器函数
def Fibs(n):
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = Fibs(6) # f是一个迭代器
print(next(f))
print(next(f))
print(next(f)) #可以用next
print(f.__next__()) #也可以用__next__
print(f.__next__())
print(f.__next__())
print(f.__next__())
'''输出:
0
1
1
2
3
5
8
'''
for f in Fibs(6):
print(f)
'''输出:
0
1
1
2
3
5
8
'''
2、生成器表达式
生成器表达式与列表推导式类似,不同之处是最外层的[]换成(),不立即执行循环,而是返回一个生成器。
r = (i*2 for i in range(5))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
'''输出:
0
2
4
6
8
'''
''' 也可以遍历
for i in r:
print(i)
'''
r2 = sum(i*2 for i in range(5))
print(r2)
'''输出:
20
'''
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx