Hello,大家好,小编最近在学习廖雪峰老师官网的Python3,想通过解答每节知识点后的练习题的的方式来检验自己的学习成果,也希望能帮助和小编一样的小白解决心中的疑惑,大家共同进步。
(1)返回函数:
利用闭包返回一个计数器函数,每次调用它返回递增整数:
代码部分:
第一种:在python3之前没有直接的解决办法,只能间接地通过容器类型来解决,因为容器类型不是存放在栈空间的。
def createCounter():
s = [0]
def counter():
s[0] = s[0]+1
return s[0]
return counter
第二种:python3中通过nonlocal关键字来解决,该语句显示的指定x不是闭包的局部变量。
def createCounter():
x =0
def counter():
nonlocal x # 把x声明为非局部变量
x=x+1
return x
return counter
# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA())# 1 2 3 4 5
注意:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。return返回的变量指向内部函数,所以调用的时候实际上是调用的内部函数。
(2)匿名函数:
请用匿名函数改造下面的代码:
def is_odd(n):
return n % 2 == 1
L = list(filter(is_odd, range(1, 20)))
修改之后:
L =list(filter(lambda x:x%2==1,range(1,20)))
(3)装饰器:
请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
代码部分:
def metric(fn):
def wrapper(*args, **kw): #可接受任意参数
t1 = time.time()
r = fn(*args, **kw) #r指向被metric装饰的函数
print('%s excute in %s ms' % (fn.__name__,1000 * (time.time() - t1)))
return r
return wrapper
调用时用@metric
综上这就是在廖雪峰老师的官网Python3中的函数式编程练习题了。大家有什么不懂得地方欢迎留言,如果小编哪里写错了或者您有更好的解决方案,请联系小编吧!小编期望与您共同进步。
网友评论