我试图做一个“奇怪的”(但在我的情况下很有用)函数,它可以返回一个动态列表,其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
答案 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'])