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

    函数式编程

    用一系列函数解决问题

    传入参数一定,结果必一定(只有一个输入一个输出)

    def myadd(x, y):# 不可重入函数:
        return x + y
    y = 200
    def myadd2(x):#可重入函数
        return x + y
    print(myadd2(10))  # 210
    y = 300
    print(myadd2(10))  # 310

    函数式编程的要求:

      创建函数最好不要访问局部作用域以外的变量,这样可以保证返回结果的唯一性(可重入性)

    高阶函数

    满足下面条件之一的为高阶函数:

      1、函数接受一个或者多个函数作为参数传入

      2、函数返回一个函数

    python内建的高阶函数:

      map、filter、sorted

    map函数

      第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表

      格式:

        map(func,iterables1,,iterables2,.........)

      参数:

    • function -- 函数,有一个或两个参数
    • iterable -- 一个或多个序列

      返回值

    • Python 2.x 返回列表。
    • Python 3.x 返回迭代器
    def power(x):
        return x**2
    # for x in map(power,range(1,10)):
    #     print(x)
    # for x in map(lambda x :x**2,range(1,10)):
    #     print(x)
    print(list(map(power,range(1,10))))
    #[1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    # 提供了两个列表,对相同位置的列表数据进行相加
    print(list(map(lambda x,y:x+y,[1,2,3,4],[4,3,2,1])))
    #[5, 5, 5, 5]
    #必须要加list,不加list返回的是内存地址
    #<map object at 0x0000022754376278>
    
    #求:1 ** 9 + 2 ** 8 + 3 ** 7 + ......9 ** 1
    s = 0
    for x in map(pow, range(1, 10), range(9, 0, -1)):
        s += x
    print(s)
    
    map(function,iterable...)

    filter函数

      函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表

      该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回  True 或 False,最后将返回 True 的元素放到新列表中

      语法:

        filter(function,iterable)

      参数:

        function——判断函数

        iterable——可迭代函数

    # def is_odd2(n):
    #     if n%2 ==1:
    #         return True
    #     return False
    
    def is_odd(n):
        return n%2 == 1
    #过滤出列表中的所有奇数
    list1 = filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
    print(list1)#[<filter object at 0x000001D43715A8D0>]   python3返回的是一个filter类,相当于迭代器
    list2 = list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10]))
    print(list2)
    L = [x for x in filter(is_odd,range(1,10))]
    print(L)# [1, 3, 5, 7, 9]
    
    filter(function)
    def is_prime(x):
        if x <2:
            return False
        for y in range(2,x):#当循环里面所有的值都不能整除x的时候,则返回True
            # if x==y:
            #     continue
            if x%y==0:
                return False
        return True
    L2 = [x for x in filter(is_prime,range(20,30))]
    print(L2)
    
    fliter(function,iterable)

    sorted函数

      将原可迭代对象的数据进行排序,生成排序后的列表

    sort与sorted区别:

      sort是应用在列表list上的方法,sorted可以对可迭代的对象进行排序操作,list 的 sort 方法返回的是对已经存在的列表进行操作,永久性的修改原始的list,,而内建函数 sorted 方法返回的是一个新的 list,原来的list顺序不变,而不是在原来的基础上进行的操作。

    参数:

    • sorted(iterable,key=None,reverse=False)
    • iterable:可迭代对象
    • key:主要用来进行元素比较,指定可迭代对象中的一个元素来进行排序
    • reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)

    返回值:

    • 返回重新排序的列表

    利用key进行倒序排序

    ex_list = [5,4,7,1,9,3,5,7,0]
    re_list = sorted(ex_list,key = lambda x : x*-1,reverse = False)
    print(re_list)  
    # [9, 7, 7, 5, 5, 4, 3, 1, 0]

    利用reverse来对可迭代对象进行倒序排序

    re_list = sorted(ex_list,reverse = True)
    print(re_list)  
    # [9, 7, 7, 5, 5, 4, 3, 1, 0]

    按字典的 key值对字典排序

    d = {"lilee":25, "wangyan":21, "liqun":32, "lidaming":19}
    print(sorted(d.keys()))
    # ['lidaming', 'lilee', 'liqun', 'wangyan']

    按字典的 value值对字典排序

    d = {"lilee":25, "wangyan":21, "liqun":32, "lidaming":19}
    print(sorted(d.items(), key=lambda item:item[1]))
    # [('lidaming', 19), ('wangyan', 21), ('lilee', 25), ('liqun', 32)]

    练习key排序

    同时可以利用key的值来进行数组字典的排序

    arry = [{"age":20,"name":"a","score":78},
            {"age":18,"name":"b","score":60},
            {"age":23,"name":"c","score":99}]
    array = sorted(arry,key = lambda x :x["age"])
    print(array)
    # [{'age': 18, 'name': 'b', 'score': 60}, 
    # {'age': 20, 'name': 'a', 'score': 78}, 
    # {'age': 23, 'name': 'c', 'score': 99}]

    再次练习用key来对可迭代对象来排序

    names = ["Tom","Jerry","Spike","Tyke"]
    def fun(x):     #x为可迭代对象中的值,传入了函数
        print("k()传入:",x, "返回去的",x[::-1])
        return x[::-1]  # 逆序
    name = sorted(names,key = fun)
    # k()传入: Tom 返回去的   moT
    # k()传入: Jerry 返回去的 yrreJ
    # k()传入: Spike 返回去的 ekipS
    # k()传入: Tyke 返回去的  ekyT
    print(name) 
    # ['Spike', 'Tyke', 'Tom', 'Jerry']

    递归函数

      函数直接或者间接的调用自身

    说明:

      递归一定要控制递归层数,当符合一定条件时要终止递归

      无return的函数递归,可理解为函数嵌套

    无return递归

    #函数嵌套  无return
    def fx(n):
        print("fx进入第", n, '')
        if n == 3:
            return
        fx(n + 1)
        print("fx退出第", n, '')
    
    fx(1)
    print("程序结束")
    
    # fx进入第 1 层
    # fx进入第 2 层
    # fx进入第 3 层
    # fx退出第 2 层
    # fx退出第 1 层
    # 程序结束

    有return的递归

    #有return
    def fx(n):
        print("fx进入第", n, '')
        if n == 3:
            return
        return fx(n + 1)
        print("fx退出第", n, '')
    
    fx(1)
    print("程序结束"
    
    # fx进入第 1 层
    # fx进入第 2 层
    # fx进入第 3 层
    # 程序结束

    递归阶乘

    def fac(n):
        # 此函数用递归的方式实现阶乘
        if n == 1:  # 1! 直接返回1
            return 1      #为什么return 1 因为这里return的是fac(n-1)=1
        return n * fac(n - 1)
    
    print(fac(5))  # 120

    递归和

    def mysum(n):
        if n ==1:
            return 1
        return n + mysum(n-1)   #函数用来递减,加公式
    print(mysum(100))

    闭包

      闭包是引用函数外部的变量的函数

      在本质上,闭包是将内部嵌套函数和函数外部的执行环境绑定在一起的对象

    闭包要接收外部函数的参数和内部函数的参数

    闭包需要满足三大条件:

      1,必须有一个内嵌函数

      2,内部函数需要引用外部函数中的参数

      3,外部函数返回值必须是内嵌函数

    1 调用闭包函数时,
    2 x = 闭包(外部参数),  #x绑定的是内部函数
    3 y = x(内部参数)

     求1**2 + 2 ** 2 + 3 ** 2 + .... 100 ** 2

    def make_power(y):
        def fn(arg):
            return arg ** y
        return fn
    
    
    y = make_power(2)  # y绑定的是fn
    print('5的平方是:', y(5))  
    
    print(sum(map(lambda x: x ** 2, range(1, 101))))
    print(sum(map(make_power(2), range(1, 101))))

    f(x) = a**x**2 + b*x + c

    def get_fx(a, b, c):
        def fx(x):
            return a * x ** 2 + b * x + c
        return fx
    
    f123 = get_fx(1, 2, 3)
    print(f123(20))
    print(f123(50))

    最强闭包

    #f(x) = a*x**2+b*x+c
    def hanshu0(a):
        def hanshu1(b):
            def hanshu2(c):
                def hanshu3(x):
                    return a*x**2+b*x+c
                return hanshu3
            return hanshu2
        return hanshu1
    powx = hanshu0(1)   #a的值
    powa = powx(2)
    powb = powa(3)
    powc = powb(20)
    print(powc)
  • 相关阅读:
    BZOJ4401 块的计数
    poj2914 Minimum Cut 全局最小割模板题
    无向图求最小割集
    HDU3232 Crossing Rivers 数学期望问题
    poj1386 字符串类型的一笔画问题 欧拉回路
    HDU3018 几笔画(非1笔)
    欧拉路&&欧拉回路 概念及其练习
    欧拉回路基础 HDU1878 欧拉回路||并差集
    我的明天在何处
    哈夫曼树讲解
  • 原文地址:https://www.cnblogs.com/LXP-Never/p/9321191.html
Copyright © 2011-2022 走看看