Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中正确捕获生成器输出?_Python_Generator - Fatal编程技术网

Python 如何在列表中正确捕获生成器输出?

Python 如何在列表中正确捕获生成器输出?,python,generator,Python,Generator,我对在python中用于创建平方和的生成器感到有些困惑。本质上,我是迭代字典中存储的向量,然后用另一个目标向量找到SS 我试图通过使用列表理解和生成器来编写更具Python风格的代码,但我很难理解这是如何工作的。“生成”的函数只返回一个字符串 <generator object distance.<locals>.operation at 0x00000181748E2048> 您想使用列表(操作(v,l))。生成器作为生成器对象生成,因此必须使用list()显式地将它

我对在python中用于创建平方和的生成器感到有些困惑。本质上,我是迭代字典中存储的向量,然后用另一个目标向量找到SS

我试图通过使用列表理解和生成器来编写更具Python风格的代码,但我很难理解这是如何工作的。“生成”的函数只返回一个字符串

<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预言。我接受亚历山大斯的简洁,但这两个答案都很好。我认为自己又受过教育了: