带你了解可迭代对象、迭代器、生成器
2020-09-05 本文已影响0人
刘烟火
可迭代的对象
使用 iter 内置函数可以获取迭代器的对象。如果对象实现了能返
回迭代器的 iter 方法,那么对象就是可迭代的。序列都可以迭
代;实现了 getitem 方法,而且其参数是从零开始的索引,这种
对象也可以迭代
s = 'hello'
lst = [3,4,5]
dic = {'k':'v','key':'value'}
st = set([8,9,10])
for c in s:
print(c)
for e in lst:
print(e)
for e in st:
print(e)
for e in dic:
print(e)
我们可以通过 dir(lst)
发现 这些对象 都具有 iter 和 getitem 方法
在python 中所有的集合都可以迭代
字符串、列表、集合、字典等
检查对象是否可迭代 使用 iter 函数
iter([3,4,5])
iter(3)
不能迭代的对象 则会返回TypeError的异常
- 使用 get_item 自动生成迭代器
class Foo:
def __getitem__(self,index):
return ['a','b','c'][index]
foo = Foo()
for e in foo:
print(e)
- 使用 iter 调用迭代器
import re
import reprlib
RE_WORD = re.compile('\w+')
# 可迭代的类
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text)
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
def __iter__(self):
return SentenceIterator(self.words)
# 生成器
class SentenceIterator:
def __init__(self, words):
self.words = words
self.index = 0
def __next__(self):
try:
word = self.words[self.index]
except IndexError:
raise StopIteration()
self.index += 1
return word
def __iter__(self):
return self
s1 = Sentence('hello world , haha hey ya')
for w in s1:
print(w)
迭代器
迭代器是这样的对象:实现了无参数的 next 方法,返回序列
中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常。
Python 中的迭代器还实现了 iter 方法,因此迭代器也可以迭代。
- 可迭代对象必须实现 iter 方法, 但 不能实现 next方法
- 迭代器的 iter方法应该返回自身
next
返回下一个可用的元素,如果没有元素了,抛出 StopIteration
异常。
iter
返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如
在 for 循环中
对于 迭代器或可迭代对象 我们可以对其使用 next() 方法 获取,下一个元素。
siter = iter('雷好啊')
print(siter)
print(next(siter))
print(next(siter))
print(next(siter))
# StopIteration
print(next(siter))
StopIteration 异常表明迭代器到头了。Python 语言内部会处理 for
循环和其他迭代上下文(如列表推导、元组拆包,等等)中的
StopIteration 异常。
生成器
一种特殊的迭代器, Python 函数的定义体中有 yield 关键字,该函数就是生成器函
数。调用生成器函数时,会返回一个生成器对象。
- 使用 yield 关键字 的函数
# 斐波拉奇
def fib():
pre,cur = 1,1
while True:
yield pre
pre, cur =cur,pre + cur
f = fib()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
- 使用生成器表达式语法糖 构建生成器
# 100 以内的偶数
its = (i for i in range(2,100,2))
print(next(its))
print(next(its))
print(next(its))