zoukankan      html  css  js  c++  java
  • python之高阶函数和匿名函数

    map()

    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    1 def func(x):
    2     return x*x
    3 
    4 r = map(func, [1, 2, 3, 4, 5])
    5 print(type(r))
    6 r = list(r)
    7 print(r)

    输出结果:

    <class 'map'>
    [1, 4, 9, 16, 25]

    可以看出,map让函数func作用于列表的每一项,使列表的每一项都被函数func执行一次,即列表的每一项都进行平方。其返回值是map类型。

    reduce()

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

    1 from functools import reduce
    2 
    3 def fn(x, y):
    4     return x * 10 + y
    5 
    6 f = reduce(fn, [1, 3, 5, 7, 9])   # 把序列变为整数
    7 print(f)
    8 print(type(f))

    输出结果:

    13579
    <class 'int'>

    和map不同,虽然reduce也是作用于每个元素,但是reduce的作用结果要用在下次和另一个元素做累积计算。

    map()和reduce()的结合使用

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

    输出结果:

    13579

    可以将字符串类型转换为int类型

    filter()

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

    1 def not_empty(s):
    2     return s and s.strip()  # 不能直接写s.strip()
    3 
    4 f = filter(not_empty, ['A', '', 'B', None, 'C', '  '])
    5 print(type(f))
    6 print(list(f))

    输出结果:

    <class 'filter'>
    ['A', 'B', 'C']

    sorted()

    sorted()函数也是一个高阶函数,在列表的学习中初步接触了sorted(),但其实它还可以接收一个key函数来实现自定义的排序

    key指定的函数将作用于被排序对象的每一个元素上,并根据key函数返回的结果进行排序。

     1 l = sorted([36, 5, -12, 9, -21], key=abs)   # 按绝对值大小排序
     2 print(l)
     3 
     4 s = sorted(['bob', 'about', 'Zoo', 'Credit'])       # 按ASCII大小排序
     5 print(s)
     6 
     7 sl = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)   # 忽略大小写排序
     8 print(sl)
     9 
    10 sr = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)     # 反向排序
    11 print(sr)

    输出结果:

    [5, 9, -12, -21, 36]
    ['Credit', 'Zoo', 'about', 'bob']
    ['about', 'bob', 'Credit', 'Zoo']
    ['Zoo', 'Credit', 'bob', 'about']

    同样的,sorted()也可以对元组和字典进行排序

    1 from operator import itemgetter    # 需要使用operator模块
    2 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    3 print(sorted(L, key=itemgetter(0)))

    输出结果:

    [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

    当然,也能以values的值来排序,对字典的排序与元组类似,但返回值不同。

    1 from operator import itemgetter
    2 
    3 dic = {"Bob": 75, "Adam": 92, "Lisa": 88}
    4 
    5 print(sorted(dic,key=itemgetter(0)))
    6 
    7 print(sorted(dic, key=itemgetter(1)))

    输出结果:

    ['Adam', 'Bob', 'Lisa']
    ['Adam', 'Lisa', 'Bob']

    可以看到,不管是以key值进行排序,还是以value值进行排序,排序结果只返回对应顺序的key值。

    匿名函数

    1 f = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    2 print(f)

    输出结果:

    [1, 4, 9, 16, 25, 36, 49, 64, 81]

    上面就是一个匿名函数的使用,匿名函数 lambda x: x * x 实际上就是:

    1 def f(x):
    2     return x * x

    只是在这里没有显式地定义函数,这样因为函数没有名字,不必担心函数名冲突,而且代码看起来也简洁。

  • 相关阅读:
    Python 参数设置
    python日志模块logging
    推荐一种快速提高英语口语的方法
    Windows 远程桌面文件传输的方法
    敏捷术语
    Timeout watchdog using a standby thread
    ZFS -世界上最高级的文件系统之一
    Linux下创建和删除用户
    linux 学习之路
    Difference between a Hard Link and Soft (Symbolic) Link
  • 原文地址:https://www.cnblogs.com/zuoxide/p/10557870.html
Copyright © 2011-2022 走看看