zoukankan      html  css  js  c++  java
  • 10. 高阶函数

    • 函数名也是变量

    • 传入函数

      既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    一个最简单的高阶函数:

    def add(x, y, f):
    	return f(x) + f(y)
    

    当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:

    x = -5
    y = 6
    f = abs
    f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
    return 11

    >>> add(-5, 6, abs)
    11
    

    编写高阶函数,就是让函数的参数能够接收别的函数。

    小结

    把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

    map/reduce

    Python内建了map()和reduce()函数。

    • map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
    >>> def f(x):
    ... 	return x * x
    ...
    >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> list(r)
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

    • reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

      reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

    比方说对一个序列求和,就可以用reduce实现:

    >>> from functools import reduce
    >>> def add(x, y):
    ... 	return x + y
    ...
    >>> reduce(add, [1, 3, 5, 7, 9])
    25
    

    当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

    但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

    >>> from functools import reduce
    >>> def fn(x, y):
    ... 	return x * 10 + y
    ...
    >>> reduce(fn, [1, 3, 5, 7, 9])
    13579
    

    把str转换为int的函数:

    >>> from functools import reduce
    >>> def fn(x, y):
    ... 	return x * 10 + y
    ...
    >>> def char2num(s):
    ... 	return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    ...
    >>> reduce(fn, map(char2num, '13579'))
    13579
    

    整理成一个str2int的函数就是:

    from functools import reduce
    def str2int(s):
    	def fn(x, y):
    		return x * 10 + y
    	def char2num(s):
    		return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    	return reduce(fn, map(char2num, s))
    
  • 相关阅读:
    mini2440移植uboot 2014.04(四)
    mini2440移植uboot 2014.04(三)
    【这些年】Linux C/C++软件开发用过的工具
    Valgrind的Memcheck快速入门
    《浪潮之巅》读后感
    三层浅析及示例分析
    C语言的代码内存布局详解
    超级立方体小记
    如何和项目经理沟通产品的交付?
    CentOS配置smaba与Windows共享文件
  • 原文地址:https://www.cnblogs.com/BigMario/p/13577650.html
Copyright © 2011-2022 走看看