◎知识点
迭代器概述
迭代器对象
◎脚本练习
"""迭代器"""
"""
可以用于for-in语句的对象被称为可以迭代(Iterable)对象。例如:range、列表、元组、字符串、
字典、集合、生成器,都是可迭代对象。
可以调用内置函数isinstance()判断一个对象是否是可迭代对象。标准库模块collections中的
类Iterable用于表示可迭代对象。
"""
from collections import Iterable
print(isinstance([1, 2, 3], Iterable)) # True
print(isinstance('abc', Iterable)) # True
print(isinstance((i * i for i in range(1, 7)), Iterable)) # True
"""
如果一个可迭代对象可以作为内置函数next()的实参从而支持惰性推算,那么该对象被称为
迭代器(Iterator)对象。
对于range、列表、元组、字符串、字典和集合等可迭代对象,都不可以作为内置函数next()的实参,
而生成器可以。所以,生成器是迭代器的一种。
可以调用内置函数isinstance()判断一个对象是否是迭代器对象。标准库模块collections中的
类Iterator用于表示迭代器对象
"""
from collections import Iterator
L = [1, 2, 3]
s = 'abc'
# next(L) # TypeError: 'list' object is not an iterator
# next(s) # TypeError: 'str' object is not an iterator
print(isinstance(L, Iterator)) # False
print(isinstance(s, Iterator)) # False
print(isinstance((i * i for i in range(1, 7)), Iterator)) # True
"""
可以调用内置函数iter()把不支持惰性推算的可迭代对象转换为迭代器对象
"""
iter_L = iter(L)
iter_s = iter(s)
print(isinstance(iter_L, Iterator)) # True
print(isinstance(iter_s, Iterator)) # True
print(next(iter_L)) # 1
print(next(iter_s)) # a
"""
如果一个对象同时实现了特殊方法__iter__()和__next__(),那么该对象也被称为迭代器对象。如果
将该对象用于for-in语句,for-in语句首先会调用特殊方法__iter__()返回一个可迭代对象,然后不断调用
该可迭代对象的特殊方法__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环
"""
class MyIterator(object):
def __init__(self):
self.data = 0
def __iter__(self):
return self
def __next__(self):
if self.data > 5:
raise StopIteration()
else:
self.data += 1
return self.data
for item in MyIterator():
print(item)
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 50:
raise StopIteration()
return self.a
for item in Fib():
print(item)