• 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
    
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/bep-feijin/p/8697981.html
Copyright © 2020-2023  润新知