程序员

Python3函数式编程习题解析

2018-07-09  本文已影响0人  阿Q说代码

        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中的函数式编程练习题了。大家有什么不懂得地方欢迎留言,如果小编哪里写错了或者您有更好的解决方案,请联系小编吧!小编期望与您共同进步。

上一篇下一篇

猜你喜欢

热点阅读