Python生成器 迭代器 可迭代对象
迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
- 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器可通过
next()
方法获取下一个值。 - 字符串,列表或元组对象都可用于创建迭代器。
- 任何实现了
__iter__()
和__next__()
方法的对象都是迭代器。__iter__()
返回迭代器自身,__next__()
返回容器中的下一个值
from collections import Iterable
class A:
def __init__(self):
self.__content = [1,2,3,4,5]
def __iter__(self):
return self
def __next__(self):
if self.__content:
return self.__content.pop(0)
else:
raise StopIteration
a = A()
print(isinstance(a, Iterable))
for i in a:
print(i)
生成器
- 生成器是一种特殊的迭代器,它的返回值不是通过
return
, 而是用yield
- 生成器算得上是Python语言中最吸引人的特性之一,是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写
__iter__()
和__next__()
方法了,只需要一个yiled
关键字。生成器一定是迭代器, 反之不成立. - 生成器有两种实现方法:生成器表达式、生成器函数
生成器表达式
a = (i for i in [1, 2, 3, 4])
print(type(a))
for i in a:
print(i)
生成器函数
def a():
i = 0
while i != 10:
yield i
i += 1
x = a()
print(next(x), 'next')
for i in x:
print(i)
可迭代对象
凡是可作用于for循环的对象都是 Iterable
类型(可迭代对象)。
list、tuple、dict、set、str
Python的这些对象是可迭代对象,而不是迭代器,因为他们不能被next()
函数调用,但是可以通过iter()
函数把它们转换成迭代器对象。
a = [1, 2, 3, 4]
print(type(a))
b = iter(a)
print(type(b))