如何使用具有多个返回值的python赋值运算符
Posted
技术标签:
【中文标题】如何使用具有多个返回值的python赋值运算符【英文标题】:How to use python assignment operator with multiple return values 【发布时间】:2021-02-10 16:19:38 【问题描述】:我有一个 Python 函数,它接受一个参数并返回 2 个输出。我想为列表中的所有元素调用它,并将每个调用的返回值组合如下:
a1, b1 = func(p[0])
a2, b2 = func(p[1])
a3, b3 = func(p[3])
a = a1 & a2 & a3
b = b1 + b2 + b3
如何使用 Python 中的 +=
、 &=
和 reduce
运算符将其重构为单行?
谢谢
【问题讨论】:
您为什么要专门要求+=
、 &=
和 reduce
运算符?根据设计,您不能在同一语句中使用 +=
和 &=
(即,出于实际目的,同一行)。
【参考方案1】:
既然你想要一个单线,这样的事情应该可以帮助你:
a,b = int(all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0])),sum(list(zip(*map(func,p)))[-1])
细分:
map
函数将函数应用于可迭代对象。
list(map(func,p))
打印:
[(1, 3), (2, 4), (3, 5)]
这个:
list(zip([(1, 3), (2, 4), (3, 5)]))
打印:
[((1, 3),), ((2, 4),), ((3, 5),)]
在map
之前添加*
将转置list
:
list(zip(*map(func,p)))
打印:
[(1, 2, 3), (3, 4, 5)]
all
函数与简单的列表推导相结合,以查找子列表 1 的所有元素是否相等。这是一个更简单的版本:
all(ele == lst[0] for ele in lst)
在这种情况下也是如此:
all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0])
打印:
False
为了将True
/False
转换为1
/0
,我使用了int()
函数:
int(all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0]))
打印:
0
它的第二部分,即:sum(list(zip(*map(func,p)))[-1])
计算第二个子列表的总和。
sum(list(zip(*map(func,p)))[-1])
打印:
12
这里是完整的代码:
def func(a):
return a,a+2
p = [1,2,3]
a,b = all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0])),sum(list(zip(*map(func,p)))[-1])
print(a,b)
输出:
(0, 12)
【讨论】:
这似乎无法回答问题。 感谢您添加缺少的代码(我假设您将修复它以使其完全可运行且正确)。虽然说实话,我不知道它实际上是如何工作的——具体来说,将&
操作转换为all
、==
和几个list(zip(...)[0]...
部分对我来说并不明显。也许您可以编辑答案以解释您的方法是如何工作的?
当然...我会这样做的。
查看我的最新编辑,让我知道解释是否充分。我会得到你的支持吗?【参考方案2】:
我们可以把这个问题分解成单独的任务:
在可迭代/序列p
的元素p[0]
、p[1]
...之间映射函数func
是map(func, p)
。
这已经提供了(a1, b1)
、(a2, b2)
的可迭代对象,因此分配不需要特殊处理。
序列/可迭代a
的操作链a1 & a2 & ...
是reduce(lambda new, total: new & total)
,+
也是如此。
由于我们有一对(a1, b1), ...
流,而不是一对流a1, ...
和b1, ...
,我们必须同时对两者进行操作。
减少对流的结果是单个对,我们可以将其分配给两个变量 a, b = result
。
from functools import reduce
def func(a): return a, a
p = range(1, 5, 2)
def reduction(new, total):
return new[0] & total[0], new[1] + total[1]
mapped = map(func, p)
reduced = reduce(reduction, mapped)
a, b = reduced
如果需要,这可以写在一个语句/行中。
>>> a, b = reduce(lambda new, total: (new[0] & total[0], new[1] + total[1]), map(func, p))
>>> a
1
>>> b
4
【讨论】:
你的归约函数不应该是return new[0] & total[0], new[1] + total[1]
吗?以上是关于如何使用具有多个返回值的python赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章
在Java中,如何返回对对象的引用,以便可以使用赋值运算符修改对象