zoukankan      html  css  js  c++  java
  • 10. 函数-lambda函数及高阶函数

    一、匿名函数解析

    ​ 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    ​ 用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。

    # 这段代码
    def calc(x,y):
        return x**y
    
    # 换成匿名函数
    calc = lambda x,y:x**y
    print(calc(2,5))
    
    def calc(x,y):
        if x > y:
            return x*y
        else:
            return x / y
        
    # 三元运算换成匿名函数
    calc = lambda x,y:x * y if x > y else x / y
    print(calc(2,5))
    

    二、高阶函数

    1. map()

    ​ map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。遍历序列,对序列中每个元素进行函数操作,最终获取新的序列。

    def func(x):
    	return x*x
     
    r = map(func, [1, 2, 3, 4, 5])
    print(type(r))
    r = list(r)
    print(r)
    
    输出结果:
    <class 'map'>
    [1, 4, 9, 16, 
    
    # 1.求列表[1,2,3,4,5,6,7,8,9],返回一个n*n 的列表
    
    #一般解决方案
    li = [1,2,3,4,5,6,7,8,9]
    for ind,val in enumerate(li):
        li[ind] = val * val
    print(li)
    # [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    # 高级解决方案
    li = [1,2,3,4,5,6,7,8,9]
    print(list(map(lambda x:x*x,li)))
    # [1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    2. reduce()

    ​ reduce把一个函数作用在一个序列 [x1, x2, x3, ...] 上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:reduce(func,[1,2,3]) 等同于 func(func(1,2),3)对于序列内所有元素进行累计操作。

    #接受一个list并利用reduce()求积
    from functools import reduce
    li = [1,2,3,4,5,6,7,8,9]
    print(reduce(lambda x,y:x * y,li))
    # 结果=1*2*3*4*5*6*7*8*9 = 362880
    

    3. filter()

    ​ filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。对于序列中的元素进行筛选,最终获取符合条件的序列

    # 在一个list中,删掉偶数,只保留奇数
    li = [1, 2, 4, 5, 6, 9, 10, 15]
    print(list(filter(lambda x:x % 2==1,li)))  # [1, 5, 9, 15]
    
    # 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数
    li = list(range(1, 200))
    print(list(filter(lambda x:int(str(x))==int(str(x)[::-1]),li)))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
    

    4. sorted()

    sorted(iterable, /, *, key=None, reverse=False)
    
    • 接收一个key函数来实现对可迭代对象进行自定义的排序

    • 可迭代对象:主要与列表,字符串,元祖,集合和字典

    • key:接受一个函数,根据此函数返回的结果,进行排序

    • reverse:排序方向,默认为从小到大,reverse=True为逆向

    # 对列表按照绝对值进行排序
    li= [-21, -12, 5, 9, 36]
    print(sorted(li, key = lambda x:abs(x)))
    # [5, 9, -12, -21, 36]
    
    """
    sorted()函数按照keys进行排序,并按照对应关系返回list相应的元素:
    keys排序结果 => [5, 9,  12,  21, 36]
                    |  |    |    |   |
    最终结果     => [5, 9, -12, -21, 36]
    """
    
    # 把下面单词以首字母排序
    li = ['bad', 'about', 'Zoo', 'Credit']
    print(sorted(li, key = lambda x : x[0]))
    # 输出['Credit', 'Zoo', 'about', 'bad']
    """
    对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。
    """
    
    # 假设我们用一组tuple表示学生名字和成绩:
    
    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    # 请用sorted()对上述列表分别按名字排序
    print(sorted(L, key = lambda x : x[0]))
    # 输出[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
    
    # 再按成绩从高到低排序
    print(sorted(L, key = lambda x : x[1], reverse=True))
    # 输出[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
    
  • 相关阅读:
    编程习题05
    java初始化顺序
    项目开发问题
    hibernate相关知识
    工作使用到的SQL语句
    对于时间的灵活操作
    StringBuffer 和 StringBuilder的区别
    在WebService中处理IP地址
    使用web创建监听器
    工作笔记系列-学习的零零碎碎的技术
  • 原文地址:https://www.cnblogs.com/hq82/p/11708466.html
Copyright © 2011-2022 走看看