zoukankan      html  css  js  c++  java
  • 035 高阶函数

    • 把函数作为参数使用的函数,叫高阶函数

    引子

    • 函数名可以类似变量那样使用

    例1

    >>> a = 10
    >>> b = a
    >>> b
    10
    >>> 
    >>> def func():
    ...   print("abc")
    ...
    >>> func()
    abc
    >>> new_func = func
    >>> new_func()
    abc
    >>> type(new_func)
    <class 'function'>
    >>> 
    

    例2

    • 在一个函数里调用另一个函数
    >>> def funcA(n):
    ...   return n + 1
    ...
    >>> def funcB(n):
    ...   return funcA(n) * 2
    ...
    >>> def funcC(n, f):
    ...   return f(n) % 5
    ...
    >>> funcC(5, funcB)
    2
    >>> 
    

    系统提供的高阶函数

    • Python2 与 Python3 用法有些许不同

    map

    • 映射,即把序列中每个元素都按照一定规则进行操作,生成一个新的序列的迭代对象

    例1 不用 map

    >>> a = list(range(10))
    >>> b = []
    >>> for i in a:
    ...   b.append(i * 10)
    ...
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> b
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> 
    

    例2 使用 map

    >>> mul_ten = lambda x: 10 * x
    >>> it = map(mul_ten, [1, 2, 3])
    >>> it
    <map object at 0x000002AD0F8C00B8>
    >>> for i in it:
    ...   print(i)
    ...
    10
    20
    30
    >>> 
    

    例3 map 配合 list

    >>> a = [1, 2, 3]
    >>> b = [4, 5, 6, 7]
    >>> list(map(lambda x, y: x + y, a, b))  # 类似 zip
    [5, 7, 9]
    >>> 
    

    例4 map 生成的迭代器只能迭代一次

    >>> a = map(lambda x: x * x, [1, 2, 3])
    >>> for i in a:
    ...   print(i)
    ...
    1
    4
    9
    >>> for i in a:
    ...   print(i)
    ...
    >>> 
    >>> b = map(lambda x: x * x, [1, 2, 3])
    >>> [i for i in b]
    [1, 4, 9]
    >>> [i for i in b]
    []
    >>> 
    

    filter

    • 过滤函数,对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
    • map 相比
      • 同:都对序列的每个元素逐一进行操作
        • map 会生成一个跟原来数据相对应的新序列
        • filter 不一定,只有符合条件的才会进入新的数据集合
    • filter 函数的写法
      • 利用给定函数进行判断
      • 返回值一定是个布尔值
      • 调用格式:filter(f, data)
        • f 过滤函数
        • data 数据
    >>> list(filter(lambda x: x % 2, [1, 2, 3, 4, 5]))
    [1, 3, 5]
    >>> 
    

    reduce

    • functools 包提供
    • 把一个可迭代对象归并成一个结果
    • 对于作为参数的函数要求
      • 必须有两个参数
      • 必须要返回结果
    • reduce(f, [1, 2, 3]) 可以理解成 f(f(1, 2), 3)
    >>> from functools import reduce
    >>> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
    15
    >>> 
    

    排序

    • 把一个序列按照给定算法进行排序
    • 格式:sorted(iterable, /, *, key=None, reverse=False)
    • key: 在排序前,对每一个元素进行 key 函数运算,可以理解成按照 key 函数定义的逻辑进行排序

    例1

    >>> sorted([1, 3, 5, 7, 9], reverse=True)
    [9, 7, 5, 3, 1]
    >>> 
    

    例2

    >>> sorted([9, -3, 0, 4, 8], key=abs)
    [0, -3, 4, 8, 9]
    >>> 
    

    例3

    >>> names = ["Tony black", "amy green", "Johnny Lee"]
    >>> sorted(names)
    ['Johnny Lee', 'Tony black', 'amy green']
    >>> sorted(names, key=str.lower)
    ['amy green', 'Johnny Lee', 'Tony black']
    >>> 
    
  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/yorkyu/p/12070111.html
Copyright © 2011-2022 走看看