如何使用具有多个返回值的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]...之间映射函数funcmap(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赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

c++中为啥赋值运算符重载返回类型是引用

Python开发实用技巧:获取部分返回值的4种方式

在Java中,如何返回对对象的引用,以便可以使用赋值运算符修改对象

Python---基础知识

Python算术运算符赋值运算符关系运算符逻辑运算符条件运算符(三元运算符)

如何利用python的赋值运算符,判断表达式是不是等值?