1

我想知道如果我只对它返回的变量中的一个(或少于总数)感兴趣,我是否可以阻止我的函数完成其所有例程。

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

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

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

_,_,three = func_123(0)

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

我的函数是否执行了三个计算,然后才选择“删除”前两个并给我我想要的那个,或者它是否认识到如果它只执行返回我想要的值所需的子例程,它可以做更少的工作?如果是第一种,有没有办法解决这个问题(当然,除了为每个计算创建函数并放弃一个独特的函数来组织所有子例程)?

4

4 回答 4

5

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

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

当我调用这个函数

>>> foo(1)
(2, 3)
>>> _, a = foo(1)
>>> a
3
>>> _
2

请注意,这_是一个完全有效且可用的变量名。它只是按惯例用于暗示您不希望使用该变量。

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

def func_123(n):
    for i in range(1,4):
        yield n + i

>>> a = func_123(1)
>>> next(a)
2
>>> next(a)
3
>>> next(a)
4

通过这种方式,这些值被延迟评估和返回,或者换句话说,只有在需要它们时才返回。通过这种方式,您可以制作您的函数,以便它们按您想要的顺序返回。

于 2015-06-02T16:55:26.727 回答
3

它不会“选择”或“丢弃”任何东西。您使用的是元组赋值;具体来说,您将返回值分配给 tuple (_,_,three)。该_变量只是“丢弃”变量的约定。

于 2015-06-02T16:56:07.347 回答
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
>>>

或者

>>> 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
>>>

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

于 2015-06-02T17:15:15.207 回答
1

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

于 2015-06-02T16:58:51.480 回答