Python基础学习(四),,菜鸟咀嚼python
Python基础学习(四),,菜鸟咀嚼python
菜鸟咀嚼python基础之继续。
一、返回函数
第三章已经简单操作了Python的高阶函数,目前继续练手函数作为返回值的特效;通常,高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回。
案例:通常我们写一个求和的函数会这样写
#通常我们写一个求和的函数会这样写def get_sum(*param): count = 0; for item in param: count = count + item return countprint( get_sum(1,2,3,4) )
输出: 10
#但是,如果不去求和,而是在后面的代码根据需要在计算可以吗,可以的。它可以不用返回求和结果,而是返回求和函数。def last_sum(*param): def sum(): num = 0 for n in param: num = num + n return num return sumfun = last_sum(1,2,3,4)print( fun )print( fun() )
输出结果:
<function last_sum.<locals>.sum at 0x7f4a2d3b58c8>10
说明:由此可见单纯的输出返回的函数是没有结果的,只有调用返回的函数,才能将求和打印出来
另外,如果多次调用last_sum函数,每次返回的都是一个新的函数,即使传入相同的参数;
例如:
fun1 = last_sum(1,2,3,4)fun2 = last_sum(1,2,3,4)print( fun1 == fun2 )
返回:False
说明:fun1() 和fun2()的调用互不影响
闭包
def count(): fs = [] for i in range(1,4): def f(): return i * i fs.append( f ) return fsf1, f2, f3 = count()print( f1() )print( f2() )print( f3() )
输出:9,9,9
说明:这是因为当一个函数返回了一个函数后,i这个内部局部变量还被新的函数引用,等到三个函数都返回时,函数i已经比变成3了,所以执行的函数输出 9, 9, 9
注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量
可以这样写:
def count2(): def f(i): def g(): return i * i return g fs = [] for i in range(1,4): fs.append( f(i) ) return fsf11, f22, f33 = count2()print( f11() )print( f22() )print( f33() )
返回结果:1,4,9
说明:方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
也就是说当我们必须要调用循环变量的时候,需要多加一个局部函数,在每次执行循环变量 i的时候去调用那个新的函数并将i作为它的一个参数达到立刻被执行,则 i无论后期怎么变都不会受到影响。
二、匿名函数
匿名函数就是没有名字的函数,有些时候为了简洁方便可以不去定义函数,而是直接使用匿名函数,案例:
#匿名函数mylist = list( map(lambda y:y*y, [1,2,3,4]) )print( mylist )
输出:[1, 4, 9, 16]
说明:匿名函数lambda y:y*y 其实就是匿名函数,用lambda去表示一个匿名函数,第一个y代表匿名函数的参数,冒号后面是匿名体,可以表示函数处理的功能。
匿名函数就是一个表达式,不用写returen返回值就是表达式结果,同时,匿名函数还可以是一个变量,例如:
#匿名函数-变量mytest = lambda y:y*ymylist = list( map( mytest , [1,2,3,4]) )print( mylist )
输出:[1, 4, 9, 16] 效果同上;
三、装饰器
其实函数就是一个对象。而且函数对象可以被赋值给变量,所以,通过变量也就相当于调用了那个函数。
例如:
def myFun(a): return a*atest = myFunprint( test(5) )
输出:25
其实函数有一个__name__的属性,可以验证出他真正的函数是谁。例如:
print( test.__name__ )
输出:myFun
Python基础学习(四)
评论关闭