目录
返回函数
函数作为返回值
闭包
匿名函数
装饰器
偏函数
返回函数
函数作为返回值
python的函数可以作为返回值,
def sum(*args):def f():sum = 0for x in args:sum += xreturn sumreturn ff1 = sum(1,2.3,5,8,5)
f2 = sum(2,5,6,74,8,5,5,6,41)
print(f1())
print(f2())
内部函数可以调用外部函数的参数和局部变量,当返回函数f时,相关参数和变量都保存在返回的函数中,这种称为“闭包”。
该函数每次调用都会返回一个函数,这些函数之间互相独立。
闭包
返回闭包的时候不应该引变化的变量,因为返回的函数并不会立即执行,而是直到调用了才执行。比如下面这个闭包的调用结果全是9!虽然第一个返回的函数是在i=1的时候返回的,但是由于并不执行函数,它此时实际上并没有被赋值,依然是i,最后执行完后i就变成了3。
def count():fs = []for i in range(1, 4):def f():return i*ifs.append(f)return fsf1, f2, f3 = count()
print(f1(),f2(),f3())
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。
练习:利用闭包返回一个计数器函数,每次调用它返回递增整数:
def createCounter():def g():i = 0while True:i += 1yield if = g()def counter():return f.__next__()return countercounterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:print('测试通过!')
else:print('测试失败!')
def createCounter():s = [0]def counter():s[0] = s[0]+1return s[0]return countercounterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:print('测试通过!')
else:print('测试失败!')
匿名函数
lambda x:<关于x的函数式> 其中x可以是多个参数
比如
L &#61; [1,2,3,5,4,5,45]L2 &#61; map(lambda x: x**2,L)
print(L2.__next__())
print(L2.__next__())
print(L2.__next__())
print(L2.__next__())
用匿名函数有个好处&#xff0c;因为函数没有名字&#xff0c;不必担心函数名冲突。此外&#xff0c;匿名函数也是一个函数对象&#xff0c;它与一般的函数基本相同。
匿名函数也可以把匿名函数赋值给一个变量&#xff0c;再利用变量来调用该函数
L &#61; [1,2,3,5,4,5,45]
f &#61; lambda x:x**2
L2 &#61; map(f,L)
print(L2.__next__())
print(L2.__next__())
也可以把匿名函数作为返回值返回。
def f(x):return lambda :x*2f1 &#61; f(10)
print(f1())
Python对匿名函数的支持有限&#xff0c;只有一些简单的情况下可以使用匿名函数。
装饰器
在代码运行期间动态增加功能的方式&#xff0c;称之为“装饰器”&#xff08;Decorator&#xff09;。本质上&#xff0c;decorator就是一个接收一个函数并将该函数增加一些功能后返回一个函数的高阶函数。
这篇文章讲的真好&#xff01;
偏函数
把一个函数的某些参数给固定住&#xff08;也就是设置默认值&#xff09;&#xff0c;返回一个新的函数&#xff0c;调用这个新函数会更简单。当然在调用的时候还可以重新设定值。比如int()函数的默认值是base&#61;10&#xff0c;即十进制&#xff0c;我们可以用偏函数的方法将其默认值设置为2而得到一个新的函数。
import functools
int2 &#61; functools.partial(int, base&#61;2)
print(int2(&#39;101011110&#39;))
当函数的参数个数太多&#xff0c;需要简化时&#xff0c;使用functools.partial
可以创建一个新的函数&#xff0c;这个新函数可以固定住原函数的部分参数&#xff0c;从而在调用时更简单。