Python 生成器和函数
我不知道这里发生了什么。今天是我第一次涉足发电机领域。我把它放到了pythontutor可视化工具中,但我不明白为什么会发生这种情况。可视化工具弹出“生成器返回实例”。我读过其他与我相似的SO线程,但不幸的是我不理解为什么会这样。除了这个特定的问题,我非常感谢任何关于学习正确有效地使用生成器的好方法的想法。谢谢大家!Python 生成器和函数,python,python-3.x,generator,Python,Python 3.x,Generator,我不知道这里发生了什么。今天是我第一次涉足发电机领域。我把它放到了pythontutor可视化工具中,但我不明白为什么会发生这种情况。可视化工具弹出“生成器返回实例”。我读过其他与我相似的SO线程,但不幸的是我不理解为什么会这样。除了这个特定的问题,我非常感谢任何关于学习正确有效地使用生成器的好方法的想法。谢谢大家! def even(nums): for number in nums: if number % 2 == 0: yield num
def even(nums):
for number in nums:
if number % 2 == 0:
yield number
def find_evens(number_list):
return even(number_list)
>>> find_evens([1,2,3,4,5,6])
<generator object even at 0x104f7af10>
def偶数(nums):
对于NUM中的数字:
如果数字%2==0:
产量
def查找(编号列表):
返回偶数(数字列表)
>>>发现偶数([1,2,3,4,5,6])
Python REPL只是返回生成器对象的默认表示形式
生成器无法自行生成其值,必须强制生成。存在许多强制选项,例如将其包装在列表中
:
list(find_evens([1,2,3,4,5,6]))
[2, 4, 6]
或者,类似地,通过迭代:
for i in find_evens([1, 2, 3, 4, 5, 6]):
print(i)
这两个示例(循环,调用列表
)都将调用生成器对象上的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
关于这些方面的更多信息,您可以查看一下,Python REPL只是返回生成器对象的默认表示形式
生成器无法自行生成其值,必须强制生成。存在许多强制选项,例如将其包装在列表中
:
list(find_evens([1,2,3,4,5,6]))
[2, 4, 6]
或者,类似地,通过迭代:
for i in find_evens([1, 2, 3, 4, 5, 6]):
print(i)
这两个示例(循环,调用列表
)都将调用生成器对象上的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
关于这些方面的更多信息,您可以随时查看,您可以想象,您只得到一个指向发电机所在位置的指针。通过打印它,您可以打印它所在的位置。但要真正得到这些值,你必须说给我这些值,你可以通过执行list
或者在for
循环中使用它来做到这一点。你可以想象,你只得到一个指向生成器所在位置的指针。通过打印它,您可以打印它所在的位置。但要实际获得值,您必须说给我值,然后您可以通过执行列表或在for
循环中使用它来实现这一点。生成器对象具有方法\uuuuuuu next\uu()
必须调用此方法(显式或隐式)以获取其下一个值
(通过在某些上下文中使用generator对象隐式地重复调用它,直到耗尽为止,如for
循环或list()
函数中所述。)
创建生成器对象后:
- 第一次使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu()
方法返回第一次yield
语句的值
- 第二次使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu()
方法返回第二次yield
语句的值
- 依此类推-直到没有额外的
yield
语句,在这种情况下,生成器对象被耗尽(并且无用
),因为它从此时起给出的是异常StopIteration
,而不是下一个值
比较
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
与
gen=偶数([1,2,3,4,5,6])
>>>
>>>下一代
2.
>>>下一代
4.
>>>下一代
6.
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
下一代
停止迭代
>>>
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
下一代
停止迭代
在第一种情况下,一个生成器被一次又一次地创建,而在第二种情况下,它被创建一次,然后重复使用,直到耗尽为止(还有一次-仅用于图示)。一个生成器对象具有方法\uuuuuuuuuuuuuuu()
必须调用此方法(显式或隐式)以获取其下一个值
(通过在某些上下文中使用generator对象隐式地重复调用它,直到耗尽为止,如for
循环或list()
函数中所述。)
创建生成器对象后:
- 第一次使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu()
方法返回第一次yield
语句的值
- 第二次使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu()
方法返回第二次yield
语句的值
- 依此类推-直到没有额外的
yield
语句,在这种情况下,生成器对象被耗尽(并且无用
),因为它从此时起给出的是异常StopIteration
,而不是下一个值
比较
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
>>> even([1, 2, 3, 4, 5, 6]).__next__()
2
与
gen=偶数([1,2,3,4,5,6])
>>>
>>>下一代
2.
>>>下一代
4.
>>>下一代
6.
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
下一代
停止迭代
>>>
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
下一代
停止迭代
在第一种情况下,发电机会一次又一次地创建,而在第二种情况下,发电机会创建一次,然后重复使用,直到用完为止(还有一次,仅用于图示)。请看一看