• 12.python中高阶函数以及内建函数(map,filter,sorted),和闭包


    day12.txt
    函数式编程
        函数式编程是用一系列函数解决问题

    函数是一等公民
    说明:
        用每一个函数完成细小的功能,一系列函数的任何组成可解决大问题
        函数仅接受输入并尝试输出,不包括任何可能影响输出的内部状态

    函数的可重入性
        当一个函数没有访问除局部变量以外的变量,则此函数为可重入函数
    示例:
        #可重入 函数
        def myadd1(x,y)
            return x+y
        #不可重入函数
        s=0
        def myadd2(x,y):
            global s
            s+=x+y
            return s
    高阶函数 High Order Function
        什么是高阶函数
            满足下列调节中一个的函数即为高阶函数
                函数接受一个或多个函数作为参数传入
                函数返回一个函数
    python 内建函数的高阶函数
        map ,filter,sorted
    map 函数:
        map (func,*iterables) 返回可迭代对象,此可迭代对象用func对可迭代对象iterable中的每个元素作为
        参数计算后得到结果,再返回,当最短的一个可迭代对象不再提供数据时迭代结束
    def power2(x):
        return x**2
    #生成一个可迭代对岸死昂,此可迭代对象可以生成1~9的自然是的平方
    for x in map(power2,range(1,10)):
        print(x)

    #生成一个可迭代对象,此可迭代对象可以生成
    # 1××4, 2**3, 3**2 ,
    for  x in map(pow,range(1,5),range(4,0,-1),range(5,100)):
        print(x)
    练习:
        求:1**2+2**2+3**2+...9**2的和
        求:1**3+2**3+3**3+...9**3的和
        求:1**9+2**8+...9**1的和
    # def pow1(x):
    #     return x**2
    # s=0
    # for x in map(pow1,range(1,10)):
    #     s=s+x  
    # print(i)
    print(sum(map(pow2(x),range(1,10))))
    print(sum(map(lambda x:x**3,range(1,10))))
    print(sum(map(lambda x,y:x**y,range(1,10),range(9,0,-1)))) 
                 <=>等价于 pow,

    filter函数
        filter(func,iterable)返回一个可迭代对象,此可迭代对象将对iterable获取的数据用函数func进行筛选
        :func将iterable中的每个元素进行求值,返回false 则丢弃,返回true 则保留此数据
        示例:
    def isodd(x):
        return x%2 ==1
    #判断x是否是奇数,如果是奇数返回true,否则
    #生成1~100的奇数
    for x in filter(isodd,range(100)):
        print(x) 
    #生成1~100以内的偶数放到列表内
    even=[x for x in filter((lambda x:x%2),range(1,100))]
    print(even)
    练习:
    1,把1~100之间的全部素数放在列表primes中
    def isprime(x)
        if x<2:
         return False
        for i in range(2,x):
            if x%2==0:
                return False
            else:
                return True
    prime=[x for x in filter(isprime,range(100))]
    print(prime)

    sorted函数
        作用:
        将原可迭代对象的数据进行排序,生成排序后的列表
        格式:
            sorted(iterable,key=None,reverse=False)
        说明:
            iterable 是可迭代对象
            key函数是用来提供比较值的函数,这个值将作用排序的依据
            reverse标志用来设置是否降序排列
    此示例示意sorted函数的用法
    l=[5,-2,-4,0,3,1]
    l2=sorted(l)#[-4,-2,0,1,3,5]
    print('l2=',l2)
    l3=sorted(l,reverse=True)
    print('l3=',l3)#[5,3,1,0,-2,-4]
    l4=sorted(l,key=abs)    #[0,1,-2,3,-4,5]
    练习
    name=['Tom','Jerry','Spike','Tyke']
    排序的依据是’moT 'yerrJ','ekipS' 'ekyT'
    结果是:
    name=['Tom','Jerry','Spike','Tyke']
    def x(a):
        r=a[::-1]
        print('222222',r)
        return r
    l=sorted(name,key=x)
    print(l)

    递归函数 recursion
    示例:
        #函数直接调用子句
        def f1():
            f1()
    递归说明:
        递归一定要空值递归的层数,当复合一定条件时要终止递归调用
        几乎所有的递归都能用while循环来代替
    优缺点:
        优点是可以把问题简单化,让思路更为清晰,代码更简洁
        缺点是因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果  #当递归次数多时,会崩溃
    递归函数调用分为两个阶段:
        1,递推阶段
            从原问题除非,按递归公式递推从未知到已知,组中到达递归终止条件
        2.回归阶段
            按递归终止条件求出结果,逆向逐步代入递归公式,回归原问题求解
    示例:
    #此示例示意递归调用和根据条件结束递归
    def fx(n):
        print("递归进入第",n,"层")
        if n==3:
            return
        print("递归退出第",n,"层")
    fx(1)
    print('程序结束')

    def myfac(n):
        #如果
        if n==1:
            return 1
        return n*myfac(n-1)

    print(myfac(50))

    练习:用递归方式算1+2+3+4...n的和
    def mysum(n):
        if n==1:
            return 1
        return n+mysum(n-1)
    print(my(100))
    思考题:
    已知有5位朋友在一起
        第五位朋友说他比第四位朋友大两岁
    第四位朋友说他比第三位朋友大两岁
    第三位朋友说他比第二位朋友大两岁
    第二位朋友说他比第一位朋友大两岁
    第一位朋友说他10岁
    def getage(n):  #求第n个人的 年级
        if n==1:
            return 10
        return getage(n-1)+2
    print(getage(5))

    闭包 closure
      什么是闭包


        闭包是指引用了此函数外部变量的函数
        如果一个内嵌函数访问了外部嵌套函数的变量,则这个内嵌函数就是闭包

      闭包必须满足三个条件:
        1. 必须有一个内嵌函数
        2. 内嵌函数必须引用外部函数中的变量
        3. 外部函数返回值必须是内嵌函数
    示例:
        def make power(x)
    Y用闭包创建的任意的
    #   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))

    练习;
        1,编写程序求1~20的阶乘的和
        1!+...10!
    def
      2. 改写之前的学生信息的程序,要求添加四个功能:
          | 5)  按学生成绩高-低显示学生信息 |
          | 6)  按学生成绩低-高显示学生信息 |
          | 7)  按学生年龄高-低显示学生信息 |
          | 8)  按学生年龄低-高显示学生信息 |
     3. 已知有列表:
            L = [[3, 5, 8], 10, [[13, 14], 15, 18], 20]
        1) 写一个函数 print_list(lst) 打印出所有的数字
            print_list(L)  # 3 5 8 10 13 ....
        2) 写一个函数 sum_list(lst) 返回列表中所有数字的和
            print(sum_list(L))  # 106
        注:
           type(x) 函数可以返一个对象的类型
           如:
              >>> type(20) is int  # True
              >>> type([3, 5, 8]) is list  # True
              >>> type(20) is list  # False
    def print_list(list):
        for x in lsit:
            #当x是数字时,打印这个数字,
            if type(x) is int:
                print(x)
            #当x是列表,则打印列表
            else:
                print_list(x)
    print_list(l)
    def sum_list(list):
        s=0
        for x in list:
            if type(x) is list:
                s+=x
            else:
                s+=sum_list(x)
    print(sum_list(l))

  • 相关阅读:
    如何设置QT的窗口图标和exe应用程序图标(两步搞定操作)
    怎么打包发布QT程序(图文详解)
    QT实现读取sps文件并将数据显示在TableView中(复习)
    LeetCode第一题——两数之和
    大型数据库复习
    Android复习
    C#桌面程序设计复习
    WordCount扩展与优化
    第二次作业(WordCount)重制版
    第二次作业(WordCount)
  • 原文地址:https://www.cnblogs.com/sky-ai/p/9687475.html
Copyright © 2020-2023  润新知