Python技巧——list comprehension 与 functools.reduce

来源:互联网 发布:网络安全工程入门书籍 编辑:程序博客网 时间:2024/05/21 06:01

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_listsbs = [biases, biases, biases]                    # 由sub_lists构成的listt = [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中取出ndarrayprint(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. 避免了基准值的手动定义

0 0
原创粉丝点击