Python 控制函数中返回变量的数量
是否有一种方法可以定义一个函数,该函数根据用户期望的输出数量知道要返回多少个变量 让我举例说明这个想法。承担以下功能:Python 控制函数中返回变量的数量,python,python-3.x,return,idl-programming-language,multiple-variable-return,Python,Python 3.x,Return,Idl Programming Language,Multiple Variable Return,是否有一种方法可以定义一个函数,该函数根据用户期望的输出数量知道要返回多少个变量 让我举例说明这个想法。承担以下功能: def function(): a = 1 b = 2 c = 3 return a, b, c 然后,我希望我的函数表现为: >>> x = function() >>> x 1 >>> x, y = function() >>> x 1 >>> y
def function():
a = 1
b = 2
c = 3
return a, b, c
然后,我希望我的函数表现为:
>>> x = function()
>>> x
1
>>> x, y = function()
>>> x
1
>>> y
2
>>> x, y, z = function()
>>> x
1
>>> y
2
>>> z
3
python中是否有一个函数或概念可以帮助我实现这一点?也许是装修工
欢迎任何意见
PD:我的Python水平仍然很基础
编辑: 我目前正在从IDL迁移到Python。因此,我错过了IDL中的一个很好的特性,您可以通过如下操作选择返回所需的任意多个变量:
FUNCTION function, a=a, b=b, c=c
a=1
b=2
c=3
RETURN, a
然后你可以简单地问你想得到什么
IDL> x=function()
IDL> print, x
1
IDL> x=function(y=b)
IDL> print, x
1
IDL> print, y
2
IDL> x=function(y=b, z=c)
IDL> print, x
1
IDL> print, y
2
IDL> print, c
3
与其返回不同的值,不如以不同的方式调用它:
x, *_ = function()
x, y, *_ = function()
x, y, z, *_ = function() # *_ is optional here if it only returns 3 things
执行此操作会将所有未使用的返回值分配给
变量,因此,如果您希望这些值尽早得到gc,则必须del而不是返回不同的值,您可以用不同的方式调用它:
x, *_ = function()
x, y, *_ = function()
x, y, z, *_ = function() # *_ is optional here if it only returns 3 things
这样做会将所有未使用的返回值分配给\uu
变量,因此,如果您希望它们提前得到gc,则必须del您只能返回单个对象。注意,函数返回的是一个元组
。但是,Python支持灵活解压变量的语法
x,_,_ = function()
或
或者,即使使用扩展的拆包:
x, *_ = function()
请注意,将\uu
用作一次性变量只是一种惯例。您只能返回单个对象。注意,函数返回的是一个元组
。但是,Python支持灵活解压变量的语法
x,_,_ = function()
或
或者,即使使用扩展的拆包:
x, *_ = function()
注意,将\uu
用作一次性变量仅仅是一种惯例。除了检查调用者的字节码以查看其期望值的疯狂技巧之外,这是不可能的:解释器不会接受任何数量不匹配的值(它会检查并捕获额外值).除了检查调用方字节码以查看其期望值等疯狂技巧之外,这是不可能的:解释器不会接受任何数量不匹配的值(它会检查并捕获额外的值)。虽然不像解包那样像python一样,您可以创建装饰器并指定允许的返回值的数量:
def filter_results(val):
def outer(f):
def wrapper(*args, **kwargs):
v = f(*args, **kwargs)[:val]
return v[0] if len(v) == 1 else v
return wrapper
return outer
@filter_results(1)
def function():
a = 1
b = 2
c = 3
return a, b, c
r = function()
输出:
1
全部结果:
@filter_results(2)
def function():
...
x, y = function()
最后:
@filter_results(3)
def function():
...
x, y, z = function()
虽然不像解包那样Pythonic,但您可以创建装饰器并指定允许的返回值的数量:
def filter_results(val):
def outer(f):
def wrapper(*args, **kwargs):
v = f(*args, **kwargs)[:val]
return v[0] if len(v) == 1 else v
return wrapper
return outer
@filter_results(1)
def function():
a = 1
b = 2
c = 3
return a, b, c
r = function()
输出:
1
全部结果:
@filter_results(2)
def function():
...
x, y = function()
最后:
@filter_results(3)
def function():
...
x, y, z = function()
语言限制。您必须声明如何处理output.language限制。您必须声明如何处理输出。