• Python: 高阶函数与lambda表达式


    缘由:

    python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟。

    翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记录所思。

    1. 高阶函数

    所谓高阶函数,即是能接受函数做参数的函数。函数做参,与c#委托、c++函数指针、Delphi事件有类似之处

    比如:

    def my_func(f, *args):
        f(args)
    
    def my_print(s):
        print ', '.join(s)
    
    my_func(my_print, 'liujw', 'male')

    它打印出:

    liujw, male

    如此定义函数,它能接受函数做参数,并能处理其它参数,我们就说它高阶函数。

    2. lambda表达式

    lambda表达式返回可调用的函数对象,并且在运行时返回它们,通常是在需要一个函数,但是又不想去命名一个函数的场合下使用。

    比如,我们定义数相加函数:

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

    它用lambda表达式表示为:

    lambda x, y: x + y

    它以一个表达式,替代了常规def方法中return语句。

    lambda可以支持0至多个参数,但没见有支持可变参数,即*args、**args,应该是不支持。

    3. 内置高阶函数

    3.1 apply(func[, nkw][, kw]):

    用可选的参数来调用func,nkw 为非关键字参数,kw 关键字参数;返回值是函数调用的返回值。此函数已于python 1.6中摈弃

    用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数。现在版本python已允许直接调用作为参数的函数,因此它已淡出

    def my_fun1():
        print "my_fun"
      
    def my_fun2(x, y):
        print x + y
      
      
    apply(my_fun1)
    apply(my_fun2, (3, 5))

    输出为:

    my_fun
    8

    3.2 filter(func, seq):

    调用一个布尔函数func 来迭代遍历每个seq 中的元素, 返回一个使func 返回值为ture 的元素的序列。

    这个好用,我就是看到它才复习其用法,并成此文的。而youtube_dl中,大量用作为字典类判断,诸如:

    matches = list(filter(lambda f: f['ext'] == ext, formats))

    比如下面代码,求数组中的偶数:

    lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   
    lst = filter(lambda x: x % 2 == 0, lst)
    print lst

    它返回为:

    [2, 6, 10, 12, 18]

    3.3 map(func, seq1[,seq2...])

    将函数func 作用于给定序列(s)的每个元素,并用一个列表来提供返回值,如果func 为None,func 表现为一个身份函数,返回一个含有每个序列中元素集合的n 个元组的列表。

    比如上面列表元素做翻倍如处,可写代码如此:

    lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   
    lst = map(lambda x: x + x, lst)
    print lst

    返回结果为:

    [2, 4, 6, 12, 14, 18, 20, 24, 30, 36]

    3.4 reduce(func, seq[, init]):

    将二元函数作用于seq 序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续的将现有的结果和下雨给值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init 给定,第一个比较会是init 和第一个序列元素而不是序列的头两个元素。

    Python核心编程PDF版翻译令人蛋疼,什么是下雨给值作用在?

    简而言之就是返回func对后所面参数执行结果,通常用在数学计算上,当然其用处不止如此。

    比如求上面列表所有元素之和,可写代码如下:

    lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   
    result = reduce(lambda x, y: x + y, lst)
    print result

    其结果为:

    83

    3.5 sorted(iterable, cmp=None, key=None, reverse=False):

    顾名思义,它是用来排序的。接受一个传入参数,其它可选参数为排序规则、排序key值、是否反转等。

    如果cmp为空,则默认升序排列列表,cmp返回值决定排序方式,>0为升序,=0不变,<0降序,cmp须得有两个参数。

    比如降序排列如下列表:

    lst = [1, 7, 5, 2, 3, 6, 9]
    lst = sorted(lst, lambda x, y: y - x)
    print lst

    结果为:

    [9, 7, 6, 5, 3, 2, 1]

    其为冒泡排序法,x为后面元素,y为前面元素。若升序排列,置x - y为结果即可。

    参考资料:Python核心编程第二版

  • 相关阅读:
    setStyleSheet来设定窗口部件的样式
    Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
    Qt编程—去掉标题栏和设置窗口透明用法
    php设计模式总结
    典型的MVC架构图
    搜索引擎设计分析
    社区论坛设计分析
    (二) vim的Tabbar插件
    目录结构设计分析
    用户注册系统分析
  • 原文地址:https://www.cnblogs.com/crwy/p/6748069.html
Copyright © 2020-2023  润新知