Python:有效地调用多个返回函数的子集变量

时间:2015-06-02 16:53:26

标签: python performance multiple-return-values

如果我只对它返回的一个(或少于全部)变量感兴趣,我想知道是否可以阻止我的功能完成所有常规工作。

为了阐明,假设我有一个具有(一个元组)多个回报的函数:

def func_123(n):
    x=n+1
    y=n+2
    z=n+3
    return x,y,z

如果我只对第三个值感兴趣,我可以这样做:

_,_,three = func_123(0)

但我想知道它在函数中是如何工作的。

我的功能是否执行三次计算,然后才选择“删除”#39;前两个并给我一个我想要的或者它认识到如果只执行返回我想要的值所需的子程序它可以做很少的工作?如果是第一个,有没有办法绕过这个(当然,除了为每个计算创建函数并释放一个独特的函数来组织所有子程序)?

4 个答案:

答案 0 :(得分:5)

它将计算并返回所有值。例如

<local:CustomButton AutomationProperties.AutomationId="CallButton"
                    x:Name="CallButton"
                    Style="{StaticResource ButtonStyle}"
                    IconAutomationId="CallIcon"
                    LabelAutomationId="CallLabel"
                    TextAutomationId="CallText"
                    Symbol="Phone"
                    Label="Call"
                    Text="123-456-7890"/>

当我调用此函数时

def foo(x):
    return x+1, x+2

请注意,>>> foo(1) (2, 3) >>> _, a = foo(1) >>> a 3 >>> _ 2 是一个完全有效且可用的变量名称。它仅使用按惯例来暗示您不希望使用该变量。

与您描述的最接近的是将您的函数编写为生成器。例如

_

通过这种方式,可以懒惰地评估和返回值,换句话说,只有在需要时才会这样。通过这种方式,您可以制作您的功能,以便按照您想要的顺序返回。

答案 1 :(得分:3)

它没有&#34;选择&#34;或&#34;掉落&#34;任何东西。你正在使用的是元组赋值;具体而言,您将返回值分配给元组(_,_,three)_变量只是一个&#34;扔掉的约定&#34;变量

答案 2 :(得分:2)

我想使用functools内置模块尝试不同的东西(这可能不是你想要的,但你可以重新考虑你在做什么。)

>>> import functools
>>> def func_123(n, m):
...     return n + m
...
>>> func_dict = dict()
>>> for r in [1,2,3]:
...     func_dict[r] = functools.partial(func_123, r)
...
>>> for k in [1,2,3]:
...     func_dict[k](10)
...
11
12
13
>>> func_dict[3](20)
23
>>>

OR

>>> func_1 = functools.partial(func_123, 1)
>>> func_2 = functools.partial(func_123, 2)
>>> func_3 = functools.partial(func_123, 3)

>>> func_1(5)
6
>>> func_2(5)
7
>>> func_3(5)
8
>>> func_3(3)
6
>>>

因此,您无需担心在元组中返回输出并选择所需的值。

答案 3 :(得分:1)

对于未使用的变量,只使用_的约定。因此,函数中的所有语句都会被评估。