zoukankan      html  css  js  c++  java
  • Python开发【第十三篇】高阶函数、递归函数、闭包

    函数式编程是指用一系列函数解决问题
    好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题
    函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态

    函数之间的可重入性

    当一个函数的输入实参一定,结果也必须一定的函数为可重入函数
    

    例子:

    #可重入函数
    def myadd(x,y):
    	return x+y
    #不可重入函数
    s = 0
    def myadd2(x,y):
    	global s
    	s+= x+y
    	return s
    

    高阶函数

    • map
    • filter
    • sorted

    什么是高阶函数

    ​ 满足下列条件中个任意一个的函数就是高阶函数

    ​ 条件一:函数接收一个或多个函数中用参数传入

    ​ 条件二:函数返回一个函数

    map函数

    ​ map(func,*iterable)

    ​ map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

    例子:

    对于list[1,2,3,4,5,6,7,8,9]

    如果希望把list的每个元素都做平方,就可以用map()函数

    因此,我们只需要传入函数f(x)==x*x,就可以利用mnap()函数完成这个计算

    def f(x):
    	return x*x
    print(map(f,[1,2,3,4,5,6,7,8,9]))
    输出结果:
    [1.4.9.10.25.36.49.64.81]
    注意:map函数是不改变原有的list的,而是生成一个新的list
    

    map()函数是python内置的高阶函数,对传入的list的每一个元素进行映射,返回一个新的映射之后的list

    python3中,map函数返回的是一个map对象,需要list(map(fun,itor))来将映射之后的map对象转换成列表

    map(func, *iterable) 返回一个可迭代对象,此可迭代
    对象用函数 func对可迭代对象iterable中的每一个
    元素作用参数计算后得一结果,当最短的一个可迭代对
    象不再提供数据时可迭代对象生成数据结束

    def mypower2(x, y):
        return x ** y
    
    for x in map(mypower2,[1,2,3,4],[4,3,2,1]):
        print(x)
    # 看懂下面程序在做什么:
    for x in map(pow, [1,2,3,4], [4,3,2,1],
                 range(5, 10)):
        print(x)
    

    filtert函数

    filter(function,iterable)返回一个可迭代对象

    ​ 此可迭代对象将iterable提供的数据用函数function进行筛选

    ​ function将对iterable中的每个元素求值

    ​ 返回False将此数据丢弃,返回True则保留

    示例:

    def isood(x):
        return x % 2 == 1
    

    打印0~10之间的所有奇数

    for x in filter(isood,range(11)):
        print(X)
    for x in filter(lambda x:x%2,range(11)):
    	print(X)
    L  = [x for x in filter(isood,range(11))]
    

    sorted函数

    作用:

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

    格式说明:

    sorted(iterable,key=None,reverse=False)

    返回一个新的包含所有可迭代对象中数据的列表,新的列表是排序过的列表

    参数说明:

    • iterable —–>可迭代对象
    • key———>函数是用来提供一个值,这个值将作为排序的依据
    • reverse—–>标志用来设置是否降序排序(默认为升序)

    示例:

    L = [5,-2,-4,0,3,1]
    L2 = sorted(L)
    k3 = sorted(L,keys=abs)
    names= ['Tom','Jerry','Spike','Tyke']
    sorted(names)
    sorted(names,key=len,reverse=True)
    

    递归函数

    ​ 什么叫递归函数?

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

    示例:

    #函数直接调用自身
    def f():
        f()#调用自己
    #函数间接调用自身
    def fa():
        fb()
     def fb():
        fa()
     fa()
    
    

    递归说明:

    • 递归一定要充值递归的成熟,当符合某一条件时要终止递归调用,几乎所有的递归都能用while循环来代替

      优点:递归可以把问题简单化,让思路清晰,代码简洁

      缺点:递归因系统环境影响大,当递归深度太大时,可以得到不可预知的结果

    • 递归函数的执行分为两个阶段

    • 递推阶段:调用进入函数内部

    • 回归阶段:返回结果,得到最终结果

    闭包

    什么是闭包?

    • 闭包是指引用了次函数外部变量的函数
      • (外部变量指:外部嵌套函数作用域内的变量)

    闭包必须满足三个条件

    • 必须有一个内嵌函数
    • 内嵌函数必须引用外部函数的变量
    • 外部函数返回值 必须为内嵌函数

    注意:

    由于闭包会使函数中的变量都保存在内存中,计算机的内存消耗比较大,所以不能滥用闭包

    示例

    # 此示例示意闭包的定义及调用
    def make_power(y):
        def fn(x):  # fn绑定一个闭包函数
            return x ** y
        return fn
    
    pow2 = make_power(2)  # pow2绑定一个闭包函数
    print("5的平方是:", pow2(5))
    
    pow3 = make_power(3)
    print("6的立方是:", pow3(6))
    
    fp = make_power(100)
    fp = make_power(10000)
    

    闭包测试题:
    试看下列程序的执行结果是什么?

      def get_funs(n):
          L = []
          for i in range(n):
              L.append(lambda x: x * i)
          return L
    
      funs = get_funs(4)
      print(funs[0](10))  # 30
      print(funs[1](10))  # 30
      print(funs[2](10))  # 30
      print(funs[3](10))  # 30
    
  • 相关阅读:
    DLL注入之Appinit_Dlls
    VC下遍历文件夹中的所有文件的几种方法
    Windows下C语言的Socket编程例子(TCP和UDP)
    Windows进程间共享内存通信实例
    window下线程同步之(Mutex(互斥器) )
    如何安装win10和linux [ubuntu14]双系统
    Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
    Windows驱动中通过MDL实现用户态与核心态共享内存
    C# Label显示多行文本及换行(WinForm/WebForm)
    使用delegate实现简单的查询功能
  • 原文地址:https://www.cnblogs.com/pyliuwei/p/11846668.html
Copyright © 2011-2022 走看看