失恋的仙人掌 · Flink程序中Tuple类型使用+ ...· 1 周前 · |
谦和的乌冬面 · java Tuple ...· 1 周前 · |
曾深爱过的电池 · 列表、元组、字典和集合 - 雨点的名字 - 博客园· 3 天前 · |
从未表白的遥控器 · 【图】讲述英国赛车元素及文化_汽车之家· 3 周前 · |
英俊的小熊猫 · Amazon.com· 5 月前 · |
坐怀不乱的钥匙扣 · 让红色成为城市的鲜明底色(奋斗百年路 启航新 ...· 6 月前 · |
有胆有识的仙人掌 · 罗洗河夫妇一切缘于围棋 ...· 1 年前 · |
活泼的小马驹 · 手机如何下载ps - 百度· 1 年前 · |
假设我有一个Python函数,它在一个元组中返回多个值:
def func():
return 1, 2
有没有一种好的方法可以忽略其中一个结果,而不是只给一个临时变量赋值?假设我只对第一个值感兴趣,有没有比这更好的方法:
x, temp = func()
可以使用
x = func()[0]
返回第一个值,使用
x = func()[1]
返回第二个值,依此类推。
如果你想一次获得多个值,可以使用
x, y = func()[2:4]
这样的东西。
一种常见的约定是使用"_“作为要忽略的元组元素的变量名。例如:
def f():
return 1, 2, 3
_, _, x = f()
三个简单的选择。
显而易见
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)
请记住,当您返回多个项时,您实际上是在返回一个元组。所以你可以这样做:
def func():
return 1, 2
print func()[0] # prints 1
print func()[1] # prints 2
这对我来说似乎是最好的选择:
val1, val2, ignored1, ignored2 = some_function()
它既不神秘也不丑陋(就像func()index方法一样),并且清楚地说明了您的目的。
如果你使用的是Python3,你可以在变量前面使用星号(在赋值的左边),让它成为解包中的一个列表。
# 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]
这不是对这个问题的直接回答。相反,它回答了这个问题:“我如何从许多可能的选项中选择一个特定的函数输出?”
如果你能够编写函数(例如,它不在你不能修改的库中),那么添加一个输入参数,表明你想要从函数中得到什么。让它成为一个具有默认值的命名参数,这样在“常见情况”中,你甚至不需要指定它。
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
当一个函数有很多输出,并且你不想多次调用它时,我认为选择结果的最清晰的方法是:
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]
> 12
为方便起见,还可以使用Python列表索引:
x,y = [results[i] for i in [0,-2]]
返回:a=3和b= 12
最好的解决方案可能是命名对象,而不是返回无意义的元组(除非返回项的顺序背后有某种逻辑)。例如,您可以使用字典:
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
如果您的字典/元组中的对象紧密绑定在一起,那么甚至为其定义一个类可能是一个好主意。这样,您还可以定义更复杂的操作。接下来的一个自然问题是: When should I be using classes in Python?
大多数最新版本的python (≥3.7)都有 dataclasses ,您可以使用它来定义只需很少代码行的类:
from dataclasses import dataclass
@dataclass
class Coordinates:
lat: float = 0
曾深爱过的电池 · 列表、元组、字典和集合 - 雨点的名字 - 博客园 3 天前 |
从未表白的遥控器 · 【图】讲述英国赛车元素及文化_汽车之家 3 周前 |
英俊的小熊猫 · Amazon.com 5 月前 |
活泼的小马驹 · 手机如何下载ps - 百度 1 年前 |