zoukankan      html  css  js  c++  java
  • Python map/reduce/filter/sorted函数以及匿名函数

    1. map() 函数的功能:

    map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)]

    def f(x):
    return x*x
    a = map(f, [1, 2, 3, 4, 5])
    b = map(f, (6, 7, 8, 9))
    print a
    print b
    # [1, 4, 9, 16, 25]
    # [36, 49, 64, 81]
    
    # a = map(f, 1,2,3,4,5,6,7)
    # print a
    # Traceback (most recent call last):
    # File "C:/workplace/SVC/DiskVideoTask/modules/test_mapReduce.py", line 8, in <module>
    # a = map(f, 1,2,3,4,5,6,7)
    # TypeError: argument 2 to map() must support iteration

    2. reduce()的用法:
    reduce(f, [x1, x2, x3]) = f(f(f(x1,x2),x3),x4).

    def add(x,y):
      return x+y
    
    print reduce(add,[1,2,3,4,5])
    # 15
    
    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))
    
    print str2int('9876')
    
    # 9876

    3. filter()的用法

    filter(f, [x1,x2,x3]) = [x1], f(x1)=True, f(x2)=False, f(x3)=False
    注意: filter参数中f函数返回的是布尔类型的值, filter根据f(x1)返回的值是否是True而决定是否返回x1.

    def is_odd(n):
        return n % 2 == 1
    
    print filter(is_odd, [1,2,3,4,5,6,7])
    
    def not_empty(s):
        return s and s.strip()
        # 若 s and s.strip() 这个与命题结果为空字符,那么结果为False.
        # 若 s and s.strip() 这个与命题结果为非空字符串,那么结果为True.
    
    print filter(not_empty, ['A', 'B ', '', None, ' '])
    # ['A', 'B ']

    4. sorted()的用法
    内建函数sorted()默认排序顺序为:
       对于两个元素x和y,如果x<y,则返回-1;
              如果x==y,则返回0;
              如果x>y, 则返回1.

    print sorted([36,5,11,9,22])
    # [5, 9, 11, 22, 36]
    # 如果是数字,默认按从小到到的顺序排列.
    print sorted(['I','Hello','Gim', 'you', 'him', 'apple', 'banana'])
    # ['Gim', 'Hello', 'I', 'apple', 'banana', 'him', 'you']
    # 如果是字符串,默认先比较大写字符串的大小,然后再比较小写字符创的大小。都是从小到大顺序排列。

    sorted()函数也是一个高阶函数。可以接收一个自定义的排序函数,从而来为给出的序列排序。
    若希望数字从大到小排列。那么自定义一个函数revered_cmp

    def revered_cmp(x,y):
        if x > y:
            return -1
        if x < y:
            return 1
        return 0
    
    print sorted([36,5,11,9,22], revered_cmp)
    # [36, 22, 11, 9, 5]        

    若希望字符串忽略大小写来排序。那么字定义一个函数cmp_ignore_case.

    def cmp_ignore_case(s1,s2):
        u1 = s1.upper()
        u2 = s2.upper()
        if u1 > u2:
            return 1
        if u1 < u2:
            return -1
        return 0
    print sorted(['I','Hello','Gim', 'you', 'him', 'apple', 'banana'], cmp_ignore_case) # ['apple', 'banana', 'Gim', 'Hello', 'him', 'I', 'you']

    显然,map, reduce, filter, sorted都是高阶函数。分别实现了映射,连续计算,过滤,排序。

    高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。

    匿名函数

    Python有两种函数,一种是用def定义的,另一种则是接下来要谈的匿名函数,用lambda定义的。

    为什么要用匿名函数?

    1. 有些程序代码只出现一次,即一次性的,那么用匿名函数,不需要定义函数名,节省内存中的变量空间。

    2. 使代码更加简洁。

    1 result = filter(lambda x: x>3, [1,2,3,4,5])
    2 print result
    3 #[4, 5]

    若filter函数中的匿名函数所起的作用是一次性的,我们就用匿名函数来实现这个函数功能。

    匿名函数的几个规则:

    1. 不用函数名

    2. 可以没有参数,可以有多个参数,参数可以带默认值。

    3. 函数中只能写一个表达式。

    4. 不用写return, 返回值就是表达式的结果

    应用:

    匿名函数一般应用于函数式编程。常和map, reduce 和 filter函数结合使用。

  • 相关阅读:
    了解运行时类型信息(RTTI)
    linux培训笔记1
    Delphi 的各种错误信息(中英文)
    delphi XML 原来可以玩接口
    wxWidgets初学者导引(2)——下载、安装wxWidgets
    Delphi中ADO异步执行方式
    模态运行EXE程序
    window.setTimeout()函数的使用
    应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
    Dll方式的线程,需要引用这个
  • 原文地址:https://www.cnblogs.com/haoshine/p/5098088.html
Copyright © 2011-2022 走看看