Python技巧——list comprehension 与 functools.reduce

本文通过对比循环迭代和reduce函数,展示了在特定场景下reduce函数的简洁性和高效性。特别是对于由numpy.ndarray组成的复杂列表进行累加求和操作时,reduce函数能够避免循环并简化基准值的设定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Guido(python的设计者)说,每当我看到reduce函数作用于一个non-trivial function(函数功能不那么直观的函数),我就想问自己,我当初为什么要设计如此蹩脚的内置函数,以至于我需要拿出纸和笔勾勾画画才能搞明白reduce函数的真正意图,而且效率不见得比list comprehension高。所以,他一怒之下,在python3中,将reduce贬为二等公民,也即,从内置函数降级为functools内的一个函数。

这里我想为reduce函数说几句话,有些情况下,reduce函数比list compression以及循环迭代,简洁强大的多的多。

考虑如下的需求,我们需要将由numpy.ndarray构成的sub_lists,再由这些sub_lists构成的list,进行累加(同等ndarray进行相加)求和时,我们该如何做?

不使用reduce函数的情形:

topology = [3, 2, 1]
biases = [np.random.randn(y, 1) for y in topology[1:]]
                    # 由ndarray构成的sub_lists
bs = [biases, biases, biases]
                    # 由sub_lists构成的list
t = [np.zeros(b.shape) for b in biases]
                    # 基准值
for b in bs:
    t = [x+y for x, y in zip(b, t)]
            # 第一层从list中取出sub_lists
            # 第二层从sub_lists中取出ndarray
print(t)

我们来看reduce函数的做法:

import functools 
def zip_sum(x, y):
    return [a+b for a, b in zip(x, y)]
print(functools.reduce(zip_sum, bs))

所以reduce

  1. 避免了循环

  2. 避免了基准值的手动定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值