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

看这个函数的定义是将func1()下定义的函数fun2()进行返回,当将func1(2)的地址赋给pow2后当运行pow2(9)的时候才运行了fun1()内定义并返回的函数即fun2(),所以fun2(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。

猜你喜欢

转载自www.cnblogs.com/miaorn/p/11622355.html