迭代器iterable定义
class iterable(metaclass=abcmeta):
__slots__ = ()
@abstractmethod
def __iter__(self):
while false:
yield none
@classmethod
def __subclasshook__(cls, c):
if cls is iterable:
if any("__iter__" in b.__dict__ for b in c.__mro__):
return true
return notimplemented
由定义可知iterable必然包含__iter__函数
iterator定义
class iterator(iterable):
__slots__ = ()
@abstractmethod
def __next__(self):
'return the next item from the iterator. when exhausted, raise stopiteration'
raise stopiteration
def __iter__(self):
return self
@classmethod
def __subclasshook__(cls, c):
if cls is iterator:
if (any("__next__" in b.__dict__ for b in c.__mro__) and
any("__iter__" in b.__dict__ for b in c.__mro__)):
return true
return notimplemented
从定义可知iterator包含__next__和__iter__函数,当next超出范围时将抛出stopiteration事件
类型关系
#! /usr/bin/python
#-*-coding:utf-8-*-
from collections import iterator,iterable
# 迭代器
s = 'abc'
l = [1,2,3]
d=iter(l)
print(isinstance(s,iterable)) # true
print(isinstance(l,iterable)) # true
print(isinstance(s,iterator)) # false
print(isinstance(l,iterator)) # false
print(isinstance(d,iterable)) # true
print(isinstance(d,iterator)) # true
理论上你可以使用next()来执行__next__(),直到迭代器抛出stopiteration 实际上系统提供了for .. in ..的方式来解析迭代器
l = [1,2,3,4]
for i in l:
print(i)
# 执行结果
# 1
# 2
# 3
# 4
生成器 generator 生成器的本质是一个迭代器
#! /usr/bin/python
#-*-coding:utf-8-*-
from collections import iterator,iterable
s = (x*2 for x in range(5))
print(s)
print('is iterable:' + str(isinstance(s,iterable)))
print('is iterator:' + str(isinstance(s,iterator)))
for x in s:
print(x)
# 执行结果
# <generator object <genexpr> at 0x000001e61c11f048>
# is iterable:true
# is iterator:true
# 0
# 2
# 4
# 6
# 8
函数中如果存在yield 则该函数是一个生成器对象 在每一次执行next函数时该函数会在上一个yield处开始执行,并在下一个yield处返回(相当于return)
def foo():
print("first")
yield 1
print("second")
yield 2
f = foo()
print(f)
a = next(f)
print(a)
b = next(f)
print(b)
# <generator object foo at 0x0000020b697f50f8>
# first
# 1
# second
# 2
实例
#! /usr/bin/python
#-*-coding:utf-8-*-
def add(s,x):
return s+x
def gen():
for i in range(4):
yield i
base = gen()
# 由于gen函数中存在yield,所以
# for 循环本质是创建了两个generator object,而非执行函数
# base = (add(i,10) for i in base)
# base = (add(i,10) for i in base)
for n in [1,10]:
base = (add(i,n) for i in base)
# 这里才开始展开生成器
# 第一个生成器展开
# base = (add(i,10) for i in base)
# base = (add(i,10) for i in range(4))
# base = (10,11,12,13)
#
# 第二个生成器展开
# base = (add(i,10) for i in (10,11,12,13))
# base = (20,21,22,23)
print(list(base)) # [20,21,22,23]
以上就是python中迭代器和生成器的示例详解的详细内容。