# 创建一个列表
1, 2, 3]
> my_list = [# 调用__iter__()方法,返回一个迭代器
_()
> my_iter = my_list.__iter_# 调用__next__()方法,返回下一个元素
_()
> my_iter.__next_1
_()
> my_iter.__next_2
_()
> my_iter.__next_3
# 没有更多元素了,抛出StopIteration异常
_()
> my_iter.__next_Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
如果你想要创建一个自定义的迭代器,但是不想使用类和__iter__()和__next__()两个方法,那么你可以使用yield语句和生成器函数来创建一个生成器迭代器(Generator Iterator)。生成器迭代器是一种特殊的迭代器,它可以使用简单的函数来定义迭代逻辑,而不需要显式地维护状态和抛出异常。
yield语句是一种特殊的return语句,它可以返回一个值,并且暂停函数的执行,直到下一次调用__next__()方法时再恢复。生成器函数是一种包含yield语句的函数,它可以返回一个生成器迭代器,这个生成器迭代器可以按照函数中的逻辑来生成值。
下面是一个使用yield语句和生成器函数来创建生成器迭代器的示例:
# 定义一个生成器函数,用来生成斐波那契数列
def fib(n):
# 初始化两个变量
a = 0
b = 1
# 循环n次
for i in range(n):
# 返回a,并且暂停执行
yield a
# 更新a和b的值
a, b = b, a + b
# 调用生成器函数,返回一个生成器迭代器
5)
> my_gen = fib(# 调用__next__()方法,返回下一个值,并且恢复执行
_()
> my_gen.__next_0
_()
> my_gen.__next_1
_()
> my_gen.__next_1
_()
> my_gen.__next_2
_()
> my_gen.__next_3
# 没有更多元素了,抛出StopIteration异常
_()
> my_gen.__next_Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
可以看到,生成器函数可以让你用简单的方式来定义迭代逻辑,而不需要使用类和特殊方法。生成器函数会返回一个生成器迭代器,这个生成器迭代器会在每次调用__next__()方法时执行函数中的代码,直到遇到yield语句或者return语句或者函数结束为止。如果遇到yield语句,那么会返回yield后面的值,并且暂停执行;如果遇到return语句或者函数结束,那么会抛出StopIteration异常。
如果你想要创建一个简单的生成器迭代器,但是不想使用yield语句和生成器函数,那么你可以使用生成器表达式(Generator Expression)来创建一个简洁的迭代器。生成器表达式是一种类似于列表推导式的语法,它可以用一行代码来定义一个生成器迭代器,而不需要定义一个函数。
生成器表达式的语法如下:
(expression for item in iterable if condition)
生成器表达式接受一个或多个可迭代对象作为参数,然后返回一个生成器迭代器,这个生成器迭代器可以根据表达式和条件来生成值。
下面是一个使用生成器表达式来创建简洁的迭代器的示例:
# 使用生成器表达式来创建一个生成偶数的迭代器
10) if x % 2 == 0)
> my_gen = (x for x in range(# 调用__next__()方法,返回下一个值
_()
> my_gen.__next_0
_()
> my_gen.__next_2
_()
> my_gen.__next_4
_()
> my_gen.__next_6
_()
> my_gen.__next_8
# 没有更多元素了,抛出StopIteration异常
_()
> my_gen.__next_Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
可以看到,生成器表达式可以让你用简洁的方式来定义一个生成器迭代器,而不需要使用yield语句和生成器函数。生成器表达式会返回一个生成器迭代器,这个生成器迭代器会在每次调用__next__()方法时执行表达式和条件,直到没有更多元素为止。
# 在Python 2中
1, 2, 3], ['a', 'b', 'c'])
> zip([[(1, 'a'), (2, 'b'), (3, 'c')]
1, 2, 3], ['a', 'b', 'c']))
> type(zip([<type 'list'>
1, 2, 3], ['a', 'b', 'c'])[0]
> zip([(1, 'a')
1, 2, 3], ['a', 'b', 'c']):
> for x in zip([... print(x)
...
(1, 'a')
(2, 'b')
(3, 'c')
1, 2, 3], ['a', 'b', 'c']):
> for x in zip([... print(x)
...
(1, 'a')
(2, 'b')
(3, 'c')
# 在Python 3中
1, 2, 3], ['a', 'b', 'c'])
> zip([<zip object at 0x7f9f5d0e6e80>
1, 2, 3], ['a', 'b', 'c']))
> type(zip([<class 'zip'>
1, 2, 3], ['a', 'b', 'c']))
> list(zip([[(1, 'a'), (2, 'b'), (3, 'c')]
1, 2, 3], ['a', 'b', 'c']))[0]
> list(zip([(1, 'a')
1, 2, 3], ['a', 'b', 'c']):
> for x in zip([... print(x)
...
(1, 'a')
(2, 'b')
(3, 'c')
1, 2, 3], ['a', 'b', 'c']):
> for x in zip([... print(x)
...
# Nothing happens
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!