如何对多个 return 值使用 python 赋值运算符

How to use python assignment operator with multiple return values

我有一个 Python 函数,它接受一个参数和 returns 2 个输出。我想为列表中的所有元素调用它,并将每个调用的 return 值组合如下:

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 运算符将其重构为单行代码?

谢谢

既然你想要一个 one-liner,像这样的东西应该可以帮助你:

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)

我们可以将这个问题分解成单独的任务:

  • p[0]p[1]、... iterable/sequence p 的元素之间映射函数 funcmap(func, p)
    • 这已经提供了 (a1, b1)(a2, b2) 的可迭代对象,因此赋值不需要特殊处理。
  • sequence/iterable 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

如果需要,可以写成一个statement/line。

>>> a, b = reduce(lambda new, total: (new[0] & total[0], new[1] + total[1]), map(func, p))
>>> a
1
>>> b
4