函数如何返回依赖于Python中接收器数量的动态值?

2024-10-04 09:21:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图做一个“奇怪”(但在我的例子中很有用)的函数,它可以返回一个动态列表,其长度取决于接收者的数量。你知道吗

例如:

f()返回一个无的动态列表,因此我可以执行以下操作:

a = f()  => a = None
a, b = f()  => a=b= None
(a, b) = f() => a=b= None
(a, b, c, d, e, f) = f()  => a=b=c=d=e=f= None

我认为这可以通过生成器理解或迭代器来实现,但是我在如何获取receiver的数量上遇到了障碍。也许我走错了方向。你能给我一些建议吗?你知道吗

任何帮助都将不胜感激。你知道吗

非常感谢

铁镇


Tags: 函数none列表数量动态方向建议例子
3条回答

不幸的是,Python使用Pythonic的“请求原谅比允许更容易”方法来解压返回的元组。也就是说,如果你有一个声明:

a,b,c = f()

在幕后,它在做一些事情:

try:
    a = returned[0]
    b = returned[1]
    c = returned[2]
except IndexError:
    raise ValueError('need more than k values to unpack')

try:
    _ = returned[4]
except IndexError:
    pass
else:
    raise ValueError('too many values to unpack')

所以它动态地发现返回的值的数量。不幸的是,这使我们无法聪明地创建一种处理可变回报的新类型:

class VariableReturn(object):
    def __getitem__(self, index):
        return ...

在Python3中,您可以按自己的要求做一些事情,但负担在调用者身上,而不是被调用的函数。函数应该总是返回相同数量的结果,但是我们将使用extended tuple unpacking捕获剩余的结果,如this StackOverflow question所示。你知道吗

使用这种方法,您可以返回任意多的结果,但在最大情况下,您需要始终至少返回所需的结果。其余的被压缩成一个尾随的元组。你知道吗

a,*others = f()
a,b,*others = f()
a,b,c,*others = f()

如果不介意使用Python 3,可以忽略不需要的内容,例如:

a, b, c, d, *_ = (x for x in range(100))

这在Python中是不可能的。右边站点上的函数不知道调用它的上下文。在进行任何名称绑定之前,都会对右侧站点进行求值。你知道吗

相关问题 更多 >