• Python之返回函数


    高阶函数可以把函数作为一个结果值返回

    举例说明

    普通的求积函数是

    vim day5-6.py

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    def product(*arg):      #定义求积函数
         a = 1              #初始值
         for i in arg:      #迭代循环传递的列表
             a = a * i
         return a           #返回值
    
    f = product(1,2,3,4)
    
    print f
    

    运行结果24

    如果不需要立即运算而是要在以后的程序中有需要的时候在运算,可以不返回结果而是返回函数

    vim day5-7.py

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    def lazy_product(*arg):
        def product():
            a = 1
            for i in arg:
                a = a * i
            return a
        return product
    
    f = lazy_product(1,2,3,4)
    
    print f
    

    执行结果

    可以看出返回是一个函数体没有执行,并且每次运行返回的值是不一样的即使每次传递的参数是一样的

    修改代码最后加一行 

    print f()

    加了()函数才会执行

     这种程序结构成为闭包

    为了更好理解函数返回的是函数体只有在调用的时候才会执行,在来看一个例子

    vim day5-8.py

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    print f1(),f2(),f3()
    

    输出会是什么呢

    首先来分析函数的执行过程

    1,def count():把函数count放入内存

    2,f1, f2, f3 = count()调用函数把函数生成的列表分别返回给f1,f2,f3

       count函数是执行一个循环并且把循环生成的函数体返回

    3,执行f1,f2,f3

    有人认为返回应该是1,4,9 其实返回是9,9,9

    原因在于函数内引用了变量i但是没有立即执行,知道调用的时候才执行,这个时候i的值已经变为3了

    为了更好了看清楚执行过程,修改一下代码,把每一步的执行结果输出

    vim day5-9.py

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    def count():
        fs = []
        for i in range(1,4):
            def f():
                return i*i
            fs.append(f)
            print fs,i,fs[i-1]()    #输出每一次循环时候得到的函数体f,i的值(1,2,3)以及执行这个函数的结果
        print fs,i                  #三次循环结束以后得到的fs列表           
        return fs                   #把列表作为函数的返回值,列表内容为函数体
    f1,f2,f3 = count()              #调用count函数把结果返回给f1,f2,f3
    print f1,f2,f3                  #查看f1,f2,f3得到的函数体
    print f1(),f2(),f3()            #执行查看结果
    

    执行结果

    输出的前面三行的执行三次循环得到的fs以及i的值及i*i的值,第四行是循环结束后得到的fs列表和i的值 第五行是count函数返回的列表fs赋值给f1,f2,f3

    第六行是执行的时候输出的结果,因为这个时候i的值已经是3了所以得到的结果是9,9,9

    
    
    
  • 相关阅读:
    社区专家谈 12306
    一致性Hash算法(分布式算法)
    ASP.NET二级域名站点共享Session状态
    树莓派2 安装 win10Iot 和 Ubuntu mate
    Maven运行时异常java.lang.UnsupportedClassVersionError的解决方案
    Ubuntu安装steam游戏平台的解决方案
    Spring配置JNDI的解决方案
    Intellij Idea无法从Controller跳转到视图页面的解决方案
    电话激活windows server 2012的解决方案
    如何下载Red Hat Enterprise Linux系统
  • 原文地址:https://www.cnblogs.com/minseo/p/6838893.html
Copyright © 2020-2023  润新知