zoukankan      html  css  js  c++  java
  • Python函数式编程

    ## 高阶函数
      - 接受函数为参数的函数称为高阶函数

    def fn(num):       # 接收参数并打印
        print(num)
    
    def run_fn(fn, num): # 接受函数为参数
        fn(num) # 执行
    
    run_fn(fn, 10)      # 10

      - 在Python中函数名也是变量,函数体就是这个变量的值,是变量就可以重新赋值,取代原有绑定

    def fn(num):     # 定义一个函数
        print(num)
    
    fn(10)       # 执行函数,输出10
    
    fn = 10        # 给函数名即变量fn重新赋值,解除fn与函数体的绑定
    fn(10)          # fn不指向函数体,无法调用
    """
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable # 报错,类型错误:整型对象无法被调用
    """

    ## 常用内建高阶函数

      - map(fn, iterable)
        - 此函数接受两个参数,第一个参数为函数,第二个参数为可迭代对象
        - map()函数执行时,将可迭代对象参数中逐一取出一个值作为参数传入第一个函数参数并执行该参数函数      

    def fn(n):
        return n * n
        
    map(fn, [1, 2, 3])       # 计算列表元素的平方
    # <map object at 0x7f5ee58e5b00>
    
    list(map(fn, [1, 2, 3]))
    # [1, 4, 9]
    
    list(map(str, [1, 2, 3]))  # 将列表中所有值都转换为字符串
    # ['1', '2', '3']

      - reduce(fn, iterable),使用前需要从functools导入
        - 此函数接受两个参数,第一个参数为函数,第二个参数为可迭代对象
        - 将第二个参数的元素按照第一个参数函数的语句逐一累积为一个值,并返回结果

    from functools import reduce
    
    def add(a, b):
        return a + b
        
    reduce(add, [1, 2, 3, 4])     # 相当于(((1 + 2) + 3) + 4)
    # 10    

      - filter(fn, iterable)
        - 过滤器
        - 将第二个参数的元素按照第一个参数函数的条件逐一检查,若参数函数返回True,则保留该元素,否则则舍去该元素

    def even(n):
        if n % 2 == 0:
            return True
        return False
        
    filter(even, [1, 2, 3, 4, 5, 6])
    # <filter object at 0x7f57c68cc550>
    
    list(filter(even, [1, 2, 3, 4, 5, 6]))
    # [2, 4, 6]

      - sorted():排序

    numbers = [-50, -43, 23, 188, 20]
    sorted(numbers, key=abs)         # 按照绝对值大小排序
    # [20, 23, -43, -50, 188]
    sorted(numbers, key=abs,reverse=True)  # 排序后反序
    # [188, -50, -43, 23, 20]

      - functools.partial():偏函数(Partial function)
        - 以原有函数为基础,添加常用关键字参数生成新函数

    import functools
    
    # 创建将二进制数字字符串转换为十进制整型的新函数
    int2 = functools.partial(int, base=2) 
    
    int2("10000000")
    # 128

    ## 内部函数
      - Python允许在函数内部定义函数

    def outer(name):
        def inner():
            return "Hi, {0}".format(name)
        return inner()
        
    outer("Stanley")
    # 'Hi, Stanley'

    ## 闭包
      - 内部函数可以看作一个闭包,闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值

    def times(num):
        def inner(a):
            return num * a  # 内部函数可以使用外部函数的值
        return inner     # 返回内部函数
        
    times10 = times(10)     # 动态生成一个参数乘10的函数
    type(times10)
    # <class 'function'>
    
    >>> times10(5)
    # 50
    
    times5 = times(5)     # 动态生成一个参数乘10的函数
    times5(5)
    # 25

    ## 匿名函数:lambda()函数
      - lambda函数是用一条语句表达的匿名函数,可以用来代替短小的函数
        - 语法:
          lambda 参数: 返回值

    lambda x: x * 2 

        相当于:

    def double(x):
        return x * 2

      - 之前的高阶函数也可一直接使用lambda作为参数传递

    list(map(lambda x: x * 2, [1, 2, 3, 4]))
    # [2, 4, 6, 8]

    本文参考:
    [美]Bill Lubanovic 《Python语言及其应用》
    https://www.liaoxuefeng.com 廖雪峰的官方网站

  • 相关阅读:
    使用环信WebIm实现一个客服功能
    html中的下拉框—select和input方式
    [LeetCode] 206. Reverse Linked List
    visual studio 2019安装配置可编写c/c++语言的IDE环境
    JS判断数据类型是不是undefined
    idea微服务架构出现 Run Dashboard 按钮方法
    docker 常用命令
    配置docker镜像加速
    linux安装docker
    linux安装redis
  • 原文地址:https://www.cnblogs.com/hycstar/p/9249188.html
Copyright © 2011-2022 走看看