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。

python学习之返回函数

评论关闭