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



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

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

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

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

_,_,three = func_123(0)

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

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

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

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

通过这种方式,延迟地求值并返回值,换句话说,仅在需要时才返回值。通过这种方式,您可以编写函数,使它们按照您想要的顺序返回。

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

我想尝试一些不同的使用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
>>>

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

对于未使用的变量使用_只是一种惯例。因此,函数中的所有语句都会被求值。

最新更新