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

时间:2011-11-29 15:53:47

标签: python iterator list-comprehension multiple-resultsets

我试图做一个“奇怪的”(但在我的情况下很有用)函数,它可以返回一个动态列表,其len取决于接收器的数量。

例如:

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

我认为这可能是通过生成器理解或迭代器完成的,但我被阻止了如何获得接收量。也许我的方向错了。你能告诉我一些提示吗?

任何帮助将不胜感激。

很多谢谢,

Tiezhen

6 个答案:

答案 0 :(得分:3)

这在Python中是不可能的。右侧站点上的函数不知道它被调用的上下文。在任何名称绑定发生之前评估右侧站点。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

不幸的是,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 ...

在Python 3中,您可以按照自己的要求进行操作,但负担在于调用者,而不是被调用的函数。该函数应始终返回相同数量的结果,但我们将使用extended tuple unpacking捕获剩余结果,如this StackOverflow question所示。

使用这种方法,您可以根据需要返回尽可能多的结果,但在最大的情况下,您需要始终返回至少所需数量的结果。其余的被打包成一个尾随元组。

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

答案 3 :(得分:0)

试试这个:

def f(n):
    return (None, ) * n

例如:

a, b, c = f(3)

......这就是你能得到的,因为在Python中,没有办法知道赋值左侧有多少变量。

答案 4 :(得分:0)

无法完成。

Python中的函数仅返回一个值。虽然它有时可能看起来更像,但它仍然只是一个值:一个元组。然后,多个赋值是元组解包的过程。

然后可以重申您的问题:我们是否可以创建一个对象,其行为类似于不同长度的元组,具体取决于需要解压缩的值的数量?而这根本没有作为选项提供。

我能想到的最接近的可能是使用生成器并使用itertools.islice获得所需数量的项目:

a = itertools.count()
x, y, z = itertools.islice(a, 3) # 0, 1, 2
u, v = itertools.islice(a, 2)    # 3, 4

但这与希望的相差甚远。

答案 5 :(得分:0)

非常不错,但也许这有助于你:

def f(x):
    for i in x:
        globals()[i] = None

f(['a','b','c'])