标签:对象 输出 表达 就是 特性 self 循环 实现 next
先上本文主题:
from collections.abc import Iterator,Iterable
t = []
# 是否为迭代器
isinstance(t,Iterator)
# 是否为可迭代对象
isinstance(t,Iterable)
实现了__iter__
魔法方法,就是可迭代对象.
class Test:
def __iter__(self):
pass
t = Test()
print(isinstance(t,Iterable)) # True
print(isinstance(t,Iterator)) # False
实现了__iter__
和__next__
魔法方法,就是可迭代对象.
class Test:
def __iter__(self):
pass
def __next__(self):
pass
t = Test()
print(isinstance(t,Iterable)) # True
print(isinstance(t,Iterator)) # True
从上面两个条件可以推导出,迭代器一定是可迭代对象
__iter__
方法;__iter__
方法返回一个实现了__next__
方法的对象;class A:
def __next__(self):
return 'hello world'
a = A()
class B:
def __iter__(self):
return a
b = B()
# 每次循环都会调用a的__next__方法获取返回值.
for i in b:
print(i)
输出如下:
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
...
上面两个 class 组合在起义的写法如下:
class B:
def __iter__(self):
return self
def __next__(self):
return 'hello world'
b = B()
for i in b:
print(i)
这里的关键点就是在__iter__
方法中返回的self
,因为 class 实现了__next__
方法,所以返回self
正好满足第二个条件.
为什么这样说呢?
返回生成器对象一共有两种方式:
以第一种方式为例
In [1]: a = (i for i in range(10))
In [2]: a.__next__
Out[2]: <method-wrapper '__next__' of generator object at 0x10d3f2ed0>
In [3]: a.__iter__
Out[3]: <method-wrapper '__iter__' of generator object at 0x10d3f2ed0>
可以看到,虽然我们并未显示定义,但是生成器表达式确实实现了__iter__
和__next__
方法,通过yield关键字定义的生成器同样拥有这样的特性,所以说,生成器自动实现了迭代器的协议.生成器一定是迭代器.
标签:对象 输出 表达 就是 特性 self 循环 实现 next
原文地址:https://www.cnblogs.com/aloe-n/p/12242493.html