• Python之高阶函数



    高阶函数

    简单来说,把函数作为参数传入的函数称为高阶函数

    map()映射函数

    内置函数,一般接收两个参数(也可多个,取决于传入函数的接收个数),第一个是作用的函数,第二个为可迭代对象

    def f(x):
        return x*x
    lst = [1,2,3,4,5]
    result = map(f,lst)		# 返回迭代器
    print(list(result))
    
    lst2 = [100,200,300]
    result =  map(lambda x,y:x+y, lst, lst2)	# 一句话函数可用匿名函数;两个lst长度不同时,不报错,但结果与最短lst的长度相同
    
    result = map(str,lst)	# 传入str函数,将lst中的数字转换为字符串
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    filter()过滤函数

    用于过滤序列,同map类似,接收一个函数和一个序列,只接收两个参数

    将传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    返回的仍是一个迭代器,也就是惰性序列

    # 过滤出200以内开平方是整数的数
    import math
    def f(x):
    	return math.sqrt(x) % 1 == 0	# 返回的bool值
    print(list(filter(f,range(1,200))))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    sorted()排序函数

    同样接收函数和序列,先对序列进行处理后再排序,并且不会对原序列进行修改

    >>> lst = [2,1,-8,34,5,-32]
    >>> print(sorted(lst, key=abs))		# 按绝对值来排序
    [1, 2, 5, -8, -32, 34]
    
    • 1
    • 2
    • 3
    对于包含元组和True、False的列表
    #列表里面包含元组,不支持元组和数字混合的列表排序
    >>> lst = [(True,2), (False,2), (1,0), (True,0)]
    >>> print(sorted(lst))		# 对于元组排序,先对所有元组比较第一个元素进行排序,再对有争议的比较第二个元素,依次类推
    [(False, 2), (1, 0), (True, 0), (True, 2)]		# 其中True转换为1,False转换为0来进行比较
    
    • 1
    • 2
    • 3
    • 4

    应用:

    # ------第一题------
    lst1=[7,-8,5,4,0,-2,-5]
    #·正数在前负数在后
    #·正数从小到大
    #·负数从大到小
    print(sorted(list1,key=Lambda x:(x<0,abs(x)))
    # --- 也可以这样 ---
    def trans(x):
            if x>=0:
                    x = (0,abs(x))
            else:
                    x = (1,abs(x))
            return x
    print(sorted(lst,key=trans))
          
    # ------第二题------
    # 这是一个字符串排序,排序规则:小写<大写<奇数<偶数
    # s ='asdf234GDSdsf23'
    s = 'asdf234GDSdsf23'
    def trans2(x):		# 这里分成了1*4种类别,有时如果有嵌套关系,可以分为2*2种类别来进行排序
            if x.isupper():
                    x = (1,x)
            elif x.islower():
                    x = (0,x)
            elif x.isdigit():
                    if int(x) % 2 == 0:
                            x = (4,x)
                    else:
                            x = (3,x)
            return x
    print(sorted(s,key=trans2))		# ['a', 'd', 'd', 'f', 'f', 's', 's', 'D', 'G', 'S', '3', '3', '2', '2', '4']
          
    # 或者更简洁的写法,虽然会增加一些判断
    print(sorted(s,key=lambda x:(x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x)))
          
    # ------第三题------
    # 实现cat test.txt |grep hello |sort |uniq -c |sort -r的效果
    d1={}
    with open("test.txt")as fp:
    	for line in fp:
    		if "hello"in line:
    			d1[line] = d1.get(line,0) + 1
    print(d1.items())
    print(sorted(d1.items(), key=lambda x:x[1], reverse=True))	# 这样就实现了按出现次数进行排序,次数多的排前面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    reduce()迭代运算函数

    • reduce把一个函数作用在一个序列[x1, x2, x3, …]上

    • 这个函数必须接收两个参数

    • reduce把结果继续和序列的下一个元素做累积计算

    • reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x3), x4)

    需要从funtools中导入reduce模块

    示例:

    # 用Python-reduce代码实现:将列表[1,3,5,7,9],变成整数13579
    from functools import reduce
    def fn(x,y):
        return x * 10 + y
    print(reduce(fn,[1,3,5,7,9]))
    
    # 将列表[1,3,5,7,9],变成字符串13579
    print(reduce(lambda x,y:str(x)+str(y),[1,3,5,7,9]))
    print(''.join(map(str,[1,3,5,7,9])))	# 用map实现的第二种方法
    
    # 实现阶乘
    print(reduce(lambda x,y:x*y,[1,2,3,4]))
    print(reduce(lambda x,y:x*y,range(1,5)))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    20.Redis系列之高可用集群模式
    maven配置jib-maven-plugin插件构建java应用docker镜像
    TST嘉硕车规晶振应用场景大全|KOYUELEC光与电子
    【已解决】Qt无法追踪到mouse移动事件
    SQL 优化有哪些技巧?
    网站安全防护措施有哪些
    计算机网络:数据链路层
    算法竞赛进阶指南 搜索 0x24 迭代加深
    oracle学习20-ora-00604和ora-00018
    ARM的七种工作模式与异常
  • 原文地址:https://blog.csdn.net/fruitless/article/details/133027263