• python学习之返回函数


    在学习返回函数的时候,函数只是在调用的时候才会运行一直不理解,隔天后在来看的时候明白了一些,记录一下。

    看代码

    >>> def fun1(n):
    ...   def fun2(x):
    ...     return pow(x,n)
    ...   return fun2
    ...
    >>> pow2=fun1(2)
    >>> pow2
    <function fun1.<locals>.fun2 at 0x7f8bdfe2e378>
    >>> pow2(9)
    81

    看这个函数的定义是将fun1()下定义的函数fun2()返回fun2()地址,当将fun1(2)的返回的fun2地址赋给pow2后当运行pow2(9)的时候才运行了fun1()内定义的函数即fun2(),即fun1(9,2)。

    还有就是返回函数中的在一个内部函数里对外部作用域(但不是全局作用域)的变量进行引用,内部函数称为闭包(closure)。其中用到了循环

    def count():
        fs=[]
        for i in range(1,4):
            def f():
                return i*i
            #把函数f地址追加至列表fs
            fs.append(f)
        #返回为一个包含3个函数f地址的列表
        return fs
     
    print('count函数返回一个列表,列表分别为函数f地址',count())
    f1,f2,f3 = count()
    print(f1,'f1执行结果是',f1())
    print(f2,'f2执行结果是',f2())
    print(f3,'f3执行结果是',f3())
    count函数返回一个列表,列表分别为函数f地址 [<function count.<locals>.f at 0x7fc5d30cac80>, <function count.<locals>.f at 0x7fc5d30cad08>, <function count.<locals>.f at 0x7fc5d30cad90>]
    <function count.<locals>.f at 0x7fc5d30cac80> f1执行结果是 9
    <function count.<locals>.f at 0x7fc5d30cad08> f2执行结果是 9
    <function count.<locals>.f at 0x7fc5d30cad90> f3执行结果是 9

    结果全是9,而不是所希望的1,4,9

    在这个函数中i是count函数的局部变量

    当i= 1时,i指向了1,结果返回了函数的地址放在了fs的第一个位置。

    当i = 2时,又将i 指向了2,函数地址返回到了fs的第二个位置上。

    当i = 3 时,i 指向了3,然后返回了函数地址在fs的第三个位置。

    所以当调用函数显示的时候,i 已经是3,所以得到的结果是一样的。

    def count():
        fs=[]
        for i in range(1,4):
            def f(j):
                def g():
                    return j*j
                return g
            fs.append(f(i))
        #返回为一个包含3个函数f地址的列表
        return fs
     
    print('count函数返回一个列表,列表分别为函数f地址',count())
    f1,f2,f3 = count()
    print(f1,'f1执行结果是',f1())
    print(f2,'f2执行结果是',f2())
    print(f3,'f3执行结果是',f3())
    count函数返回一个列表,列表分别为函数f地址 [<function count.<locals>.f.<locals>.g at 0x7ff488311d08>, <function count.<locals>.f.<locals>.g at 0x7ff488311c80>, <function count.<locals>.f.<locals>.g at 0x7ff488311d90>]
    <function count.<locals>.f.<locals>.g at 0x7ff488311c80> f1执行结果是 1
    <function count.<locals>.f.<locals>.g at 0x7ff488311d08> f2执行结果是 4
    <function count.<locals>.f.<locals>.g at 0x7ff488311d90> f3执行结果是 9

    这样修改后就得到了希望的结果。

    代码中f(j)将循环中i的值传给了j,当i处于循环中时返回的函数并不是指向i,而是将它的数值传给了j并指向j。

  • 相关阅读:
    Spring sprint @ ninth day
    微软面试:找水王问题
    Spring sprint @ first day
    软件工程概论 购书最低价格问题
    网络助手的NABCD分析
    记初学net-SNMP
    求二维数组联通子数组和的最大值 (联通涂色) beta!
    二维数组环状最大子矩阵
    一维数组中的最大子数组(环状)
    图书助手冲刺第七天
  • 原文地址:https://www.cnblogs.com/miaorn/p/11622355.html
Copyright © 2020-2023  润新知