• Python进阶【第五篇】函数式编程及某些特殊函数


    一、函数式编程——Functional Programming

    函数式=编程语言定义的函数+数学意义的函数

    在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。
    而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。
    对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言
    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
    Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

     二、高阶函数

    两点性质:

    1.函数本身也可以赋值给变量,变量可以指向函数

    >>> f = abs
    >>> f(-10)
    10
    

     #说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。

    2.“函数即变量”

    函数名其实就是指向函数的变量!例如,对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数!

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

    def add(x, y, f):
        return f(x) + f(y)
    print(add(-5, 6, abs))#abs函数作为一个参数传给add函数
    

     高阶函数的意义就是,让函数接受的参数也是一个函数名

    三、map(),filter(), reduce()

    1.map()函数

    map函数接收两个参数,一个是函数,一个是可迭代对象(列表、元组、字符串等),map将传入的函数依次作用到序列的每个元素,并把结果作为新的迭代对象返回。

    注意:传到函数是函数名,如果写成了函数()形式,就成了传入函数的返回值做参数

    具体实例

    >>> 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

    实际上:map函数就是执行了一个for循环操作,处理序列中的每个元素,得到的结果是一个“可迭代对象(原来是什么数据类型,得到就是什么)”,该可迭代对象中元素的个数及位置与原来一样

    2.filter()函数

    filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    具体实例:在一个list中,删掉偶数,只保留奇数

    def is_odd(n):
        return n % 2 == 1
    list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    # 结果: [1, 5, 9, 15]
    

     可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
    注意到filter()函数返回的是一个可迭代序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

    注意:filter()函数遍历序列中的每个函数,判断每个元素并得到布尔值,如果结果是true,就保留下来

    3.reduce()函数

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

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

     具体实例:把序列[1, 3, 5, 7, 9]变换成整数13579

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

     改进:配合map(),我们就可以写出把str转换为int的函数

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

     注:reduce()函数处理一个序列,然后把序列进行合并操作

    四、匿名函数

    当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便,

    >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    

     通过对比可以看出,匿名函数lambda x: x * x实际上就是:

    def f(x):
        return x * x
    

     关键字lambda表示匿名函数,冒号前面的x表示函数参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    同样,也可以把匿名函数作为返回值返回。

    def build(x, y):
        return lambda: x * x + y * y
    
  • 相关阅读:
    UiPath鼠标操作文本的介绍和使用
    UiPath鼠标操作元素的介绍和使用
    UiPath循环活动Do While的介绍和使用
    UiPath循环活动Do While的介绍和使用
    UiPath循环活动While的介绍和使用
    设计模式之: Decorator(装饰器)模式
    C语言深度解剖读书笔记(1.关键字的秘密)
    HDU 4341 Gold miner (分组背包)
    HDU 3496 Watch The Movie( 二维费用背包)
    Mahout源码MeanShiftCanopyDriver分析之一初识
  • 原文地址:https://www.cnblogs.com/bep-feijin/p/8697981.html
Copyright © 2020-2023  润新知