Python函数中的动态输出

Dynamical output in Python Functions

当我们使用def时,可以使用**kwargs和*args来定义函数的动态输入。

是否有类似的返回元组,我一直在寻找这样的行为:

1
2
3
4
5
6
7
8
def foo(data):
    return 2,1

a,b=foo(5)
a=2
b=1
a=foo(5)
a=2

但是,如果我只声明一个要解包的值,它会将整个元组发送到那里:

1
2
a=foo(5)
a=(2,1)

我可以使用"if"语句,但我想知道是否有一些不那么麻烦的东西。我也可以使用一些hold变量来存储这个值,但是我的返回值可能很大,只需要一些占位符就可以了。

谢谢


如果需要完全归纳返回值,可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
def function_that_could_return_anything(data):
    # do stuff
    return_args = ['list', 'of', 'return', 'values']
    return_kwargs = {'dict': 0, 'of': 1, 'return': 2, 'values': 3}
    return return_args, return_kwargs

a, b = function_that_could_return_anything(...)
for thing in  a:
    # do stuff

for item in b.items():
    # do stuff

在我看来,返回字典,然后使用get()访问参数会更简单:

1
2
3
4
dict_return_value = foo()
a = dict_return_value.get('key containing a', None)
if a:
    # do stuff with a

我不太明白你到底在问什么,所以我猜几下。

如果有时要使用单个值,请考虑一个namedtuple

1
2
3
4
5
6
7
8
9
10
11
12
from collections import namedtuple

AAndB = namedtuple('AAndB', 'a b')

def foo(data):
    return AAndB(2,1)

# Unpacking all items.
a,b=foo(5)

# Using a single value.
foo(5).a

或者,如果您使用的是python 3.x,那么可以使用扩展的iterable解包来轻松解包以下一些值:

1
2
3
4
5
6
def foo(data):
    return 3,2,1

a, *remainder = foo(5) # a==3, remainder==[2,1]
a, *remainder, c = foo(5) # a==3, remainder==[2], c==1
a, b, c, *remainder = foo(5) # a==3, b==2, c==1, remainder==[]

有时名称_用于表示您放弃了该值:

1
a, *_ = foo(5)