Python 如何在列表中正确捕获生成器输出?
我对在python中用于创建平方和的生成器感到有些困惑。本质上,我是迭代字典中存储的向量,然后用另一个目标向量找到SS 我试图通过使用列表理解和生成器来编写更具Python风格的代码,但我很难理解这是如何工作的。“生成”的函数只返回一个字符串Python 如何在列表中正确捕获生成器输出?,python,generator,Python,Generator,我对在python中用于创建平方和的生成器感到有些困惑。本质上,我是迭代字典中存储的向量,然后用另一个目标向量找到SS 我试图通过使用列表理解和生成器来编写更具Python风格的代码,但我很难理解这是如何工作的。“生成”的函数只返回一个字符串 <generator object distance.<locals>.operation at 0x00000181748E2048> 您想使用列表(操作(v,l))。生成器作为生成器对象生成,因此必须使用list()显式地将它
<generator object distance.<locals>.operation at 0x00000181748E2048>
您想使用列表(操作(v,l))
。生成器作为生成器对象生成,因此必须使用list()
显式地将它们转换为列表
举例说明。您想使用列表(操作(v,l))
。生成器作为生成器对象生成,因此必须使用list()
显式地将它们转换为列表
举例说明。您使用发电机的方式不对。无论如何,
yield
只执行一次(前提是将返回值转换为列表)。结果是,它甚至没有在生成器表达式中使用
您可以将该代码更改为以下内容:
def operation(orig, nbr):
for orig, nbr in zip(orig, nbr):
yield math.sqrt(abs(orig - nbr))
for k in sorted(dv):
l = dv[k]
value = sum(operation(v,l))
print(value)
现在,这是正确使用生成器功能。每次
sum()
函数需要下一个值时,将执行operation()
函数内的循环1步,它将产生下一个sqrt
值,直到用完为止。您使用生成器的方式错误。无论如何,yield
只执行一次(前提是将返回值转换为列表)。结果是,它甚至没有在生成器表达式中使用
您可以将该代码更改为以下内容:
def operation(orig, nbr):
for orig, nbr in zip(orig, nbr):
yield math.sqrt(abs(orig - nbr))
for k in sorted(dv):
l = dv[k]
value = sum(operation(v,l))
print(value)
现在,这是正确使用生成器功能。每次sum()
函数需要下一个值时,将执行operation()
函数中的for
循环1步,它将生成下一个sqrt
值,直到它用完为止。返回列表时不需要yield
。操作
中的下面的求和
函数实际上是一个可以完成相同任务的函数
因此,sum([x**0.5表示某些列表中的x])
使用占用较少内存的生成器表达式成为sum(x表示某些列表中的x)
def distance(v, dv):
def operation(orig, nbr):
return sum(abs(orig - nbr) ** 0.5 for orig, nbr in zip(orig, nbr))
return [operation(v, dv[l]) for l in sorted(dv)]
>>> distance(v, dv)
[5.974691494688162, 6.8818192885643805, 4.0, 3.414213562373095, 5.0]
当您返回列表时,不需要yield
。操作
中的下面的求和
函数实际上是一个可以完成相同任务的函数
因此,sum([x**0.5表示某些列表中的x])
使用占用较少内存的生成器表达式成为sum(x表示某些列表中的x)
def distance(v, dv):
def operation(orig, nbr):
return sum(abs(orig - nbr) ** 0.5 for orig, nbr in zip(orig, nbr))
return [operation(v, dv[l]) for l in sorted(dv)]
>>> distance(v, dv)
[5.974691494688162, 6.8818192885643805, 4.0, 3.414213562373095, 5.0]
这不是发电机应该如何使用的。你可以在那里把yield
改成return
,没有任何效果。你想要的结果是什么?@RohitJain:你评论的第二部分是不真实的。将yield
更改为return
会导致发生ValueError:math domain error
。生成器不应该这样使用。你可以在那里把yield
改成return
,没有任何效果。你想要的结果是什么?@RohitJain:你评论的第二部分是不真实的。将yield
更改为return
会导致发生ValueError:math domain error
。OP的代码中永远不会执行yield
语句。第一次调用生成器函数时,它返回一个生成器对象。yield
语句永远不会在OP的代码中执行。第一次调用generator函数时,它返回一个generator对象。我认为OP需要类似于返回和(abs(orig-nbr)**0.5表示orig,nbr in zip(orig,nbr))
(或者等价地返回和(math.sqrt(abs(orig-nbr))表示orig,nbr in zip(orig,nbr))
。另外,distance()
函数本身不会在OP的代码中返回任何内容。感谢您温和的SO预言。我接受了亚历山大的简洁,但两个答案都很好。我认为自己再一次受到教育:“我认为OP需要类似于<代码>返回总和(ABS(ORIG-NBR)** 0.5用于ORIG,NBR在ZIP(ORIG,NBR))<或代码>(或等效地<代码>返回总和(Maq.Sqt(ABS(OrgG-NBR)),用于ORIG,NBR在ZIP(ORIG,NBR))< /代码>)。另外,distance()
函数本身不会在OP的代码中返回任何内容。感谢您温和的SO预言。我接受亚历山大斯的简洁,但这两个答案都很好。我认为自己又受过教育了: