假设我有一个Python函数,它返回一个元组中的多个值:
def func():
return 1, 2
除了仅将其分配给临时变量外,是否有一种好的方法来忽略其中一个结果?例如,如果我只对第一个值感兴趣,是否有比这更好的方法:
x, temp = func()
您可以使用 x = func()[0]
来返回第一个值,x = func()[1]
来返回第二个值,依此类推。
如果您想一次获取多个值,请使用类似 x,y = func()[2:4]
的方式。
func()[2:4]
等类似方法。 - endolith- teeks99def test(): ... print "这里" ... return 1,2,3 ... a,b = test()[:2] 这里 [编辑:对不起,该代码没有出现,显然在评论中只能得到一行。对于不熟悉的人,">>>"和"..."是Python shell中新行的开头]
_, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
没有调用函数多次来得清晰,但这只是我的意见。如果您的函数返回这么多项目,则我认为使用numpy会更好:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
- endolithresult = func()
a = result[13]
b = result[25]
...
- Tyler Liux, __, y = func()
。 - ndemou常见的惯例是使用 "_" 作为要忽略的元组元素的变量名。例如:
def f():
return 1, 2, 3
_, _, x = f()
# 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()
来忽略f()
返回的任意数量的值,只保留第一个值赋给变量a
。 - THNa,_,_ = 1,8,9
)。在此之前,它会存储执行的最后一个语句的结果,如果您想要捕获它,通常需要使用一个变量来存储该值。这就是为什么建议使用''来捕获无用的值。''的值很快会被另一个语句覆盖。对于“__”情况,值将保留,直到GC将其清除。 - Archit请记住,当您返回多个项时,实际上您返回的是一个元组。因此,您可以像这样做:
def func():
return 1, 2
print func()[0] # prints 1
print func()[1] # prints 2
def func():
return {'lat': 1, 'lng': 2}
latitude = func()['lat']
from collections import namedtuple
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])
def func():
return Coordinates(lat=1, lng=2)
latitude = func().lat
如果字典/元组中的对象之间有强烈的关联,那么为其定义一个类可能是一个好主意。这样你还可以定义更复杂的操作。一个自然的问题是:我应该在什么时候在Python中使用类?
最近版本的Python(≥ 3.7)具有dataclasses,你可以使用它来用非常少的代码定义类:
from dataclasses import dataclass
@dataclass
class Coordinates:
lat: float = 0
lng: float = 0
def func():
return Coordinates(lat=1, lng=2)
latitude = func().lat
dataclass相较于namedtuple的主要优势在于更容易扩展,但还存在其他区别。请注意,默认情况下,dataclass是可变的,但您可以使用@dataclass(frozen=True)
代替@dataclass
以强制使其成为不可变。
这里有一个视频可能会帮助您选择适合您使用情况的正确数据类。还有一个关于attrs vs. dataclass的视频,它揭示了一些关于为什么attrs可能很有意思的有趣细节。
三个简单选择。
显而易见的。
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]
则很明显。赋值给变量后却没有使用它?该函数返回一个元组,像处理元组一样索引即可。 - endolith;)
。诸如 a[0]
、a[:]
(列表拷贝)、a[::2]
(每隔两个元素)以及 a[i:] + a[:i]
(旋转列表)等列表访问方法确实也很明显并且经典。 - cod3monk3yval1, val2, ignored1, ignored2 = some_function()
val1, val2, *ignored = some_function()
- vineet gundechaval1, val2, *ignored = some_function()
- undefined这不是对问题的直接回答,而是回答了这个问题:“如何从许多可能的选项中选择特定的函数输出?”。
如果您能够编写该函数(即它不在您无法修改的库中),则添加一个输入参数,指示您想要从函数中获取什么。将其作为命名参数添加,并设置默认值,以便在“常见情况”下甚至不需要指定它。
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采用动态类型,返回类型可以发生变化。请注意,示例返回标量、列表或元组...任何你想要的!
lambda
创建一个没有第二个返回值的函数别名会更加简洁。def func():
return 1, 2
func_ = lambda: func()[0]
func_() # Prints 1
~
来表示忽略特定的返回变量。请问你需要翻译什么内容? - jxramos