假设我有一个方法返回两个变量,我想将这两个返回结果附加到两个列表中。如果我使用临时变量,这是可行的,还有更好的方法吗?只需一个电话?
例如:
def myfunc() :
return "myname", "mypos"
name_list = []
pos_list = []
# may I merge the following three lines in one call?
name, pos = myfunc()
name_list.append(name)
pos_list.append(pos)
答案 0 :(得分:7)
您的解决方案非常好。
如the Zen of Python中所述,“简单比复杂”和“可读性计数”更好,因此请专注于此而不是试图达到任意“最少线”或“最少使用的变量”的无意义目标。这些都不重要。
当然,你可以把它放在一条线上。机会是,它会变得非常花哨,虽然你今天可能会理解它,甚至可能明天,下个月它会给你带来困难。
此外,执行此操作的常见方法是滥用列表推导。列表推导用于创建列表,您可以在其中收集内容。将它们用于副作用是一种常见的反模式,你应该避免,因为你创建一个无意义的列表只是为了将更多的内容放入一行(再次损害可读性)。
所以,你的解决方案很好。在您的前提下,我会说这是将这两个值放入这两个单独列表中的完美解决方案:
name, pos = myfunc()
name_list.append(name)
pos_list.append(pos)
您可以轻松了解正在发生的事情。此外,您的临时变量有一个有用的名称,可以很容易地理解该函数的多个返回值是什么。
如果您没有此列表格式的要求,会有哪些替代方案?嗯,这很大程度上取决于你的用例,但是你也可以在同一个列表中收集结果,就像你的函数返回的元组一样。甚至可能从函数中返回一个命名元组,因此您可以获得语义信息的价值。或者返回自定义对象,或者如果只是将名称映射到位置,则将其存储在字典中......
但是同时返回多个东西的函数通常不是很容易理解的。因此,如果调用代码更有表现力,然后使用结果,那就没问题了。这样,即使在一年内也很容易理解。
答案 1 :(得分:1)
你可以做的一件事是:
lists = [list1, list2, list3, list4]
data = myfunc()
for x, ls in zip(data, lists):
ls.append(x)
然而,如果你的函数返回一个非常大的元组,那么这样做才有意义。如果您的示例中只有两个,那么您最好坚持使用当前的解决方案。
答案 2 :(得分:1)
我不知道你为什么要在一行中做到这一点,但这完成了任务:
list(map(lambda x: x[0].append(x[1]), zip([name_list, pos_list], my_func())))
请注意,此声明不会返回任何有用的内容,只会为您修改列表。
答案 3 :(得分:1)
如果function
返回的更多值可能是list comprehension
与enumerate
一起使用,那么实现这一目标的更长方法非常有用:
[lst.append(myfunc()[i]) for i, lst in enumerate([name_list, pos_list])]
这利用了python
lists
为mutable
的事实。