python - 如何从生成器中获取元组?最佳实践

标签 python syntax tuples generator

我是一名新手程序员,我想创建一个生成器,它会返回两个值,我将在另一个函数中将其用作元组。

我不明白为什么 tuple(function_1(a,b)) 返回 ((1, 2),)tuple(function_2(a ,b)) 将返回一个正确的元组。

我想知道这里发生了什么,什么是最好的语法,并最终知道是否可以从 function_1 中检索元组。

提前感谢您的任何解释!

>>> def function_1(a,b):
...     yield a,b
...
>>> def function_2(a,b):
...     yield a
...     yield b
...
>>> a = 1
>>> b = 2
>>>
>>> function_1(a,b)
<generator object function_1 at 0x1007931b0>
>>> function_2(a,b)
<generator object function_2 at 0x1007931f8>
>>> tuple(function_1(a,b))
((1, 2),)
>>> tuple(function_2(a,b))
(1, 2)
>>> for item in function_1(a,b):
...    print(item)
...
(1, 2)
>>> for item in function_2(a,b):
...    print(item)
...
1
2

最佳答案

您的第一个生成器只生成一次,并生成一个元组:

>>> gen = function_1(1, 2)
>>> gen = function_1(1, 2)
>>> next(gen)
(1, 2)
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

next() function如果可用,从迭代器(生成器是一种特定类型的迭代器)获取下一个值。 StopIteration 异常表明生成器已完成,无法生成更多值。

你的第二个生成器产生两次不同的时间,每次都是一个整数:

>>> gen = function_2(1, 2)
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

在生成器上调用 tuple() 将提取生成器生成的 所有 值,因此对于 function_1 你会得到一个元组一个元素,另一个元组。对于第二个生成器,您将得到一个包含两个元素的元组,即两个整数。将其与在两个生成器上使用 list() 进行比较:

>>> list(function_1(1, 2))
[(1, 2)]
>>> list(function_2(1, 2))
[1, 2]

现在我们有两个列表,但第一个只包含一个元素,一个元组,因为这是生成器生成的所有内容。

因此,这两个生成器具有根本不同的行为。选择你需要的行为;要么产生完整的元组,要么产生单独的值,但不要尝试将两种类型的输出视为同一事物。

关于python - 如何从生成器中获取元组?最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32201872/

相关文章:

python - 绘制垂直于坐标的箭头

javascript - 如何让 Facebook 登录按钮显示 "Logout"

bash - 在 shell 脚本中使用 $() 代替反引号有什么好处?

haskell - 运行程序时出错

c++ - ISO C++ 禁止声明没有类型的 ‘tuple’

python - 从 python 中的嵌套 URL 中抓取并解析表

python - Pycharm:预期类型 'Integral' ,取而代之的是 'str'

Ruby Object#send 与否定相等

c# Linq 查询与元组列表

c# - 从其子类初始化 C# Tuple<T, T> 以便在 WPF 中使用