zoukankan      html  css  js  c++  java
  • 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核心编程第二版

  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/crwy/p/6748069.html
Copyright © 2011-2022 走看看