zoukankan      html  css  js  c++  java
  • Python函数学习——匿名函数

    匿名函数

    匿名函数就是不需要显式的指定函数名。

    关键字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))

    匿名函数使用场景:

    主要与其他函数联合使用

    map函数

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

    遍历序列,对序列中每个元素进行函数操作,最终获取新的序列。

    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]
    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
    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]
    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)]
  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/8577727.html
Copyright © 2011-2022 走看看