零基础学 Python(2018 版)
尹会生
前游戏公司技术总监,前新浪网技术经理
80146 人已学习
新⼈⾸单¥68
课程目录
已完结/共 72 讲
第一章 :Python介绍和安装 (3讲)
第二章 :Python基础语法 (3讲)
第四章 :条件与循环 (5讲)
第五章 :映射与字典 (2讲)
第六章 :文件和输入输出 (2讲)
第七章 :错误和异常 (1讲)
第九章 :模块 (1讲)
第十章 :语法规范 (1讲)
第十一章 :面向对象编程 (4讲)
第十二章 :多线程编程 (2讲)
第十六章 :综合案例 & 结课测试 (1讲)
特别放送 (1讲)
零基础学 Python(2018 版)
登录|注册
留言
27
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 31 | 装饰器的使用
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
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与search的区别
46 | 正则表达式库替换函数sub()的实例
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹操作
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumPy安装
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代码
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式get和post
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链接
68 | Beautiful Soup的安装和使用
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下载图片
强势回归:零基础学Python2022版来啦!
71 | 如何分析源代码并设计合理的代码结构&结课测试
本节摘要

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

https://gitee.com/geektime-geekbang/geekbangpython

登录 后留言

全部留言(27)

  • 最新
  • 精选
森淼
视屏 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))

2018-07-29
10
IRON ARMOR·Maud Caesar
import time def timmer(func): def timmer_one(a,b,c): def timmer_two(x): start_time=time.time() func(a,b,c(x)) stop_time=time.time() print('函数运行时间是%s秒'%(stop_time-start_time)) return timmer_two return timmer_one while True: try: @timmer def parabola(a,b,c):return lambda x:a*x**2+b*x+c one = parabola(int(input('请输入a=')),int(input('请输入b=')),int(input('请输入c='))) two = one(int(input('请输入x='))) print(two) except ValueError: print('由于您输入的是字母所有导致程序结束运行!') break 最后我在输入x的值后它给我报出一个TypeError: 'int' object is not callable 为什么int对象不可调用啊?

作者回复: func(a,b,c(x)) 这行对func第三个参数进行了函数方式的调用 c() 但是传参数用了下面这行 one = parabola(int(input('请输入a=')),int(input('请输入b=')),int(input('请输入c='))) 这行会传一个整数int(input('请输入c=')) , 例如我给参数传递10 ,就会让 func(a,b,c(x)) 变成 func(a,b,10(x)), 那么10(x)肯定不能执行,所以看到了你所得到的异常。 另外程序逻辑要再拆分一下,目前逻辑不清晰,不清楚要实现什么功能

2020-08-01
2
2
贾艳荣
def tips(func): def nei(a,b): func(a,b) return('') return nei @tips def add(a,b): return (a+b) print(add(3,5)) 老师为什么 定义add函数中使用 return ,结果不显示求和值。只有将return改为print,才能显示结果8 呢?

作者回复: 问题出现在这两行: func(a,b) return('') --- func(a,b) 执行之后是add(3,5) 的返回结果8 , 但是 nei(a,b) 函数对 func()函数并没有进行返回值的接收, 而是使用了return('') 返回 “空”, 所以最后看不到结果,改为 return func(a,b) # return('') 就可以了

2020-08-11
1
Exile
这样写是不是更有意义了? 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-11-12
1
硕杨Sxuya
说一下留言里面 None 的问题:因为定义的函数就已经是 print 了,而不是 return,所以最后调用的时候再 print 的时候,就没有内容打印了,所以python 提示为“None”。 其实学习这个,使用这个简单的例子讲解,并没有感受到装饰器的威力,希望老师能说一说到底学习这个功能,可以大致解决什么样的问题,我们以后遇到问题,也有回忆的参考。

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

2018-09-28
1
刘楠
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() 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-11-26
海绵宝宝
讲的非常清晰,一遍就听懂了,谢谢老师!之前写Typescript被装饰器困扰了好久,但是Typescript有类的装饰器,类成员函数以及类的成员变量的装饰器,不知道python有没有这块的内容?

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

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

作者回复: 没太理解你的问题,把你的想法用代码实现出来? 我的理解是这样的: def 外(): def 内1(内参1): def 内2(): return 内参1 return 内2 return 内1 按顺序调用的啊

2019-03-31
煎蛋
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-12-22
收起评论