下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 31 | 装饰器的使用
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

零基础学Python

共71讲 · 71课时·约540分钟
16024
免费
01 | Python语言的特点
免费
02 | Python的发展历史与版本
免费
03 | Python的安装
免费
04 | Python程序的书写规则
免费
05 | 基础数据类型
免费
06 | 变量的定义和常用操作
07 | 序列的概念
08 | 字符串的定义和使用
09 | 字符串的常用操作
10 | 元组的定义和常用操作
11 | 列表的定义和常用操作
12 | 条件语句
13 | for循环
14 | while循环
15 | for循环语句中的if嵌套
16 | while循环语句中的if嵌套
17 | 字典的定义和常用操作
18 | 列表推导式与字典推导式
19 | 文件的内建函数
20 | 文件的常用操作
21 | 异常的检测和处理
22 | 函数的定义和常用操作
23 | 函数的可变长参数
24 | 函数的变量作用域
25 | 函数的迭代器与生成器
26 | Lambda表达式
27 | Python内建函数
28 | 闭包的定义
29 | 闭包的使用
30 | 装饰器的定义
31 | 装饰器的使用
32 | 自定义上下文管理器
33 | 模块的定义
34 | PEP8编码规范
35 | 类与实例
36 | 如何增加类的属性和方法
37 | 类的继承
38 | 类的使用-自定义with语句
39 | 多线程编程的定义
40 | 经典的生产者和消费者问题
41 | Python标准库的定义
42 | 正则表达式库re
43 | 正则表达式的元字符
44 | 正则表达式分组功能实例
45 | 正则表达式库函数match与s...
46 | 正则表达式库替换函数sub...
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹...
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumP...
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代...
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式ge...
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链...
68 | Beautiful Soup的安装和...
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下...
71 | 如何分析源代码并设计合理...
本节摘要

课程源码、课件及课后作业地址:

https://github.com/wilsonyin123/geekbangpython

精选留言(12)

  • 2018-07-29
    视屏 2’45” 输出结果为:
    start
    9
    stop
    None
    请问老师,最后一行“None”是哪来的?感谢!
    展开

    作者回复: print(add())一般会输出add函数的返回内容,但因为我们的add函数是被tips函数装饰的,所以函数nei()返回值为口时,print函数会打印None,那么我们试着将程序改成这样,猜猜会有什么输出呢?
    def tips(func):
        def nei(a,b):
            print('start')
            func(a,b)
            print('stop')
            return 'I am here!!!!'
        return nei

    @tips
    def add(a,b):
        print(a+b)

    print(add(4,5))

    5
  • 2019-11-26
    def new_tips(argv):
        def tips(func):
            def nei(a,b):
                start_time = time.time()
    #这里加个变量接收返回值
                result= func(a,b)
                end_time=time.time()
                print('%s 运行时间: %s ' %(argv,end_time-start_time))
    #这里再返回
                return result
            return nei
        return tips

    @new_tips('sum_model')
    def sum(a,b):
       return a+b

    @new_tips('sub_model')
    def sub(a,b):
       return a-b

    print('求和 ',sum(3,4))
    print('求差',(sub(7,4)))
    展开

    作者回复: o( ̄▽ ̄)d

  • 2019-11-26
    def tips(func):
        def nei(a,b):
            start_time = time.time()
            return func(a,b)
            end_time=time.time()
            print('运行时间: %s' %(end_time-start_time))
        return nei

    @tips
    def sum(a,b):
       return a+b


    print('求和 ',sum(3,4))

    已经搞定了,有返回值的函数,直接 return func(a,b)
    展开
  • 2019-11-26
    def tips(func):
        def nei(a,b):
            start_time = time.time()
            func(a,b)
            end_time=time.time()
            print('运行时间: %s' %(end_time-start_time))
        return nei

    @tips
    def sum(a,b):
       return a+b
    有返回值的话,为None,该怎么操作
    展开

    作者回复: 返回值为None,而sum() 函数很简单,问题应该出现在 tips装饰器里面, 装饰器里最后获得的返回值是 nei, 而nei 和 func(a,b) 之间没有任何关联,所以 nei 没办法获得 func() 的返回值。考虑改为:
    def tips(func):
        def nei(a,b):
            start_time = time.time()
            result = func(a,b)
            end_time=time.time()
            print('运行时间: %s' %(end_time-start_time))
            return result
        return nei
    将结果返回给 nei , 就组成了 sum() 返回值给 func(), func() 给 nei() , nei()给tips()返回,最终使用nei函数名,返回给 调用sum()函数

  • 2019-07-03
    讲的非常清晰,一遍就听懂了,谢谢老师!之前写Typescript被装饰器困扰了好久,但是Typescript有类的装饰器,类成员函数以及类的成员变量的装饰器,不知道python有没有这块的内容?

    作者回复: Typescript 不懂,不敢乱比较;python 是有类和类成员装饰器的,比如经典的@property 特性装饰器

  • 2019-03-31
    老师,装饰器函数如果里面定义了两个闭包函数,用装饰器的时候会调用哪个闭包函数呢

    作者回复: 没太理解你的问题,把你的想法用代码实现出来?
    我的理解是这样的:

    def 外():
        def 内1(内参1):
             def 内2():
                     return 内参1
             return 内2
    return 内1

    按顺序调用的啊

  • 2018-12-22
    import signal

    def func_exit(x,y):
        print('程序已经超时')
        exit()

    def time_out(num):
        def timer(func):
            def wapper(x):
                signal.signal(signal.SIGALRM, func_exit)
                signal.alarm(num)
                start = time.time()
                func(x)
                stop = time.time()
                print('函数执行了 %d'%(stop-start))
                return '计算完成'
            return wapper
        return timer

    @time_out(3)
    def func(i):
        time.sleep(5)
        data = 0
        for x in range(i):
            data += x
        print('结果是%d'%data)

    print(func(1000))
    老师看看我这作业代码是不是太累赘了
    展开

    作者回复: 代码实现的需求很少,不用考虑过度封装。

  • 老师你好,关于装饰器的课后作业不理解,可以讲解一下吗

    作者回复: 说一说具体哪里不理解呢?通过搜索引擎或者技术网站找到了什么答案?对答案有哪些质疑?通过自己的程序得出哪些不一样的结论?

  • 2018-11-12
    这样写是不是更有意义了?

    def new_tips(p_func, a_func):
        def tips(func):
            def nei(a, b):
                p_func()
                func(a, b)
                a_func()

            return nei

        return tips


    def pre_func():
        print("pre_func")


    def after_func():
        print("after_func")


    @new_tips(pre_func, after_func)
    def add(a, b):
        print(a + b)


    add(1, 2)
    展开

    作者回复: 要根据需求看实现代码的价值,不能以复杂度看待

  • 2018-09-28
    刚开始实在是摸不着头脑,看了两边,看到后面 add、sub各种骚操作后,才明白到底哪个是“装饰函数”(添加一些小功能)、哪些是“主体函数”(重点考虑的结构)。为什么呢?因为被装饰函数比装饰函数还要短、还要简单,初学者如我根本反应不过来,难道不是长一些的才是重点么?!教程里面还真不是。。。。。。我水平不够,不知道如何轻松调整这方面的疑惑,但是这个一定得修改修改!(一般不用惊叹号的)
  • 2018-09-28
    说一下留言里面 None 的问题:因为定义的函数就已经是 print 了,而不是 return,所以最后调用的时候再 print 的时候,就没有内容打印了,所以python 提示为“None”。

    其实学习这个,使用这个简单的例子讲解,并没有感受到装饰器的威力,希望老师能说一说到底学习这个功能,可以大致解决什么样的问题,我们以后遇到问题,也有回忆的参考。

    作者回复: 为了照顾初学编程及没有计算机基础的同学简化了大量的代码,建议了解一下flask web框架的 “路由”功能,应该会有所帮助。
    参考网站:
    http://docs.jinkan.org/docs/flask/quickstart.html

  • 2018-07-19
    老师,返回的none是哪儿啊?

    作者回复: 再详细一点描述你的问题?