python学习之返回函数
Posted miaorn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习之返回函数的主要内容,如果未能解决你的问题,请参考以下文章