Answers:
一种常见的约定是对您要忽略的元组的元素使用“ _”作为变量名。例如:
def f():
return 1, 2, 3
_, _, x = f()
您可以使用x = func()[0]
返回第一个值,x = func()[1]
返回第二个值,依此类推。
如果您想一次获取多个值,请使用x, y = func()[2:4]
。
func()[2:4]
只需要一些返回值的方法。
_, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
没有多次调用该函数还不清楚,但这只是我的看法。如果您的函数返回那么多项目,我认为使用numpy将是更可取的:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...
x, __, y = func()
如果您使用的是Python 3,则可以在变量(在作业的左侧)之前使用星号,以使其成为解压缩列表。
# Example 1: a is 1 and b is [2, 3]
a, *b = [1, 2, 3]
# Example 2: a is 1, b is [2, 3], and c is 4
a, *b, c = [1, 2, 3, 4]
# Example 3: b is [1, 2] and c is 3
*b, c = [1, 2, 3]
# Example 4: a is 1 and b is []
a, *b = [1]
a, *_ = f()
忽略后的任意数量的返回值a
。
通常的做法是使用哑变量_
(单个下划线),正如前面在此处指出的那样。
但是,为了避免与该变量名的其他用法冲突(请参阅此响应)__
,如ncoghlan所指出的那样,最好使用(双下划线)代替一次性变量。例如:
x, __ = func()
a, _, _ = 1,8,9
。在此之前,它将存储最后执行的语句的结果,如果要捕获该语句,通常会使用变量来存储该值。这就是为什么'_'是建议的变量名称以捕获垃圾值的原因。_值在执行另一条语句后很快被覆盖。在“ _ _”的情况下,值将一直保留在那里,直到GC将其清除为止。
三个简单的选择。
明显
x, _ = func()
x, junk = func()
可怕
x = func()[0]
并且有许多方法可以通过装饰器来实现。
def val0( aFunc ):
def pick0( *args, **kw ):
return aFunc(*args,**kw)[0]
return pick0
func0= val0(func)
_
变量。很明显,您正在忽略一个值
x, _ = func()
很丑陋,x = func()[0]
很明显。分配给变量然后不使用它?该函数返回一个元组;像元组一样对其进行索引。
;)
列表访问器(例如a[0]
,a[:]
(列表副本),a[::2]
(每两个元素)和a[i:] + a[:i]
(旋转列表))确实是显而易见的并且是规范的。
最好的解决方案可能是命名事物,而不是返回无意义的元组。除非返回的项目的顺序背后有逻辑。
def func():
return {'lat': 1, 'lng': 2}
latitude = func()['lat']
如果您想添加有关返回内容的更多信息,甚至可以使用namedtuple(不仅仅是字典,这些是坐标):
from collections import namedtuple
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])
def func():
return Coordinates(lat=1, lng=2)
latitude = func().lat
如果字典/元组中的对象紧密地绑在一起,那么甚至最好为其定义一个类。这样,您还可以定义此类型对象之间的交互,并提供有关如何使用它们的API。接下来的自然问题是:什么时候应该在Python中使用类?。
这不是问题的直接答案。而是回答了这个问题:“如何从许多可能的选项中选择特定的函数输出?”。
如果您能够编写该函数(即它不在库中,则无法修改),则添加一个输入自变量,以指示您要从该函数中获取的内容。将其设为具有默认值的命名参数,这样,在“普通情况”下,您甚至不必指定它。
def fancy_function( arg1, arg2, return_type=1 ):
ret_val = None
if( 1 == return_type ):
ret_val = arg1 + arg2
elif( 2 == return_type ):
ret_val = [ arg1, arg2, arg1 * arg2 ]
else:
ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 )
return( ret_val )
该方法为所需的输出提供了“高级警告”功能。因此,它可以跳过不需要的处理,仅执行获得所需输出的必要工作。同样因为Python进行动态类型化,所以返回类型可以更改。请注意,示例如何返回标量,列表或元组……随您便!
当您从一个函数获得许多输出并且不想多次调用它时,我认为选择结果的最简单方法是:
results = fct()
a,b = [results[i] for i in list_of_index]
作为最低限度的工作示例,还演示了该函数仅被调用一次:
def fct(a):
b=a*2
c=a+2
d=a+b
e=b*2
f=a*a
print("fct called")
return[a,b,c,d,e,f]
results=fct(3)
> fct called
x,y = [results[i] for i in [1,4]]
和值是预期的:
results
> [3,6,5,9,12,9]
x
> 6
y
> 12
为了方便起见,还可以使用Python列表索引:
x,y = [results[i] for i in [0,-2]]
返回:a = 3和b = 12
~
用作忽略特定返回变量的语法