Eti*_* P. 8 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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 11
你的第一个生成器只生成一次,并产生一个元组:
>>> 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
Run Code Online (Sandbox Code Playgroud)
该next()函数从迭代器获取下一个值(生成器是特定类型的迭代器)(如果可用).该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
Run Code Online (Sandbox Code Playgroud)
调用tuple()生成器将拉入生成器生成的所有值,因此function_1您将获得一个元素,另一个元组的元组.对于第二个生成器,你将获得一个包含两个元素的元组,即两个整数.将其list()与两台发电机的使用情况进行比较:
>>> list(function_1(1, 2))
[(1, 2)]
>>> list(function_2(1, 2))
[1, 2]
Run Code Online (Sandbox Code Playgroud)
现在我们有两个列表,但第一个只包含一个元素,一个元组,因为这就是生成器生成的所有元素.
因此,两个发电机具有根本不同的行为.选择你需要的行为; 要么产生完整的元组,要么产生单独的值,但不要尝试将两种类型的输出视为相同的东西.