我想知道如果我只对它返回的一个(或少于总数)变量感兴趣,我是否可以阻止我的函数完成所有例程。
为了说明,假设我有一个函数(一个元组)多次返回:
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
>>>
因此,您不需要担心以元组的形式返回输出并选择您想要的值。
对于未使用的变量使用_只是一种惯例。因此,函数中的所有语句都会被求值。