为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • 首先要明白,装饰器是为了避免代码的重复编写而产生的。 下面面先写一个装饰器 可以假想,要写很多代码,里面都要用到一个叫做work的函数,假如要在里面添加一个打印print函数,那岂不是要每个函数每个函数一个个去修改,显然这样效率十分低下,于是就诞生了装饰器这种东西。 #下面是work函数 def work(x): return x*x 如果我们要在里面打印一个hello,那就可以改成 def work(x): return x*x print 'hello' 一个函数感觉还好,但是要改写一百个就不这么容易了。 于是 def test(f):#这里的f传入上面写的work原始函数。 def ww(x): print 'hello'#添加了我们要打印hello的要求。 return f(x)#ww的返回值是f函数,也就是传入的work函数被原封不动返回 return ww#返回的ww函数里面添加了打印要求,也将work函数一并返回 #上面便定义了一个完整的装饰器,可以传入任何一个函数,都会添加上打印hello的功能,相当于装饰了东西。 至于@test来简化装饰器,是基于以下代码。 def test(f): def ww(x): print 'hello' return f(x) return ww @test等价于 f=test(f) 函数名f本身就是一个变量,相当于将f函数传入test,在里面添加了想要的功能之后,返回给f,f是一个变量,他现在已经不是最开始的f了,而是添加了功能之后的f,因此最原始的f已经被隐藏。
    查看全部
  • 帮大家理解下,下面这段代码我觉得已经能够理解运算意思了。 r1 = Rational(1, 3) r2 = Rational(1, 2);类的实例化,自动执行__init__方法. (p、q)分别为(1、3)和(1、2);(注意:后面的运算中self代表r1,r代表r2) print r1 + r2 (注意:这里的+号表示执行__add__方法!!!内置的!) 讲下print输出顺序: 第一个print:先输出 1 1; 然后第二个print输出:1*2+3*1,3*2(注意:return又继续调用Rational,也就是递归,里面的值变为(5,6)) 然后又是回到第一个print:输出5!(这时注意:__add__方法不会再次执行,这个方法是通过+号才执行的) 然后第三个print输出5/6;(通过__str__方法运算而来,里面return的%s/%s中有'/'符号!) class Rational(object): def __init__(self, p, q): self.p = p print p self.q = q def __add__(self, r): print self.p,'*',r.q,'+',self.q,'*',r.p,',',self.q,'*',r.q return Rational(self.p * r.q + self.q * r.p, self.q * r.q) def __str__(self): return '%s/%s' % (self.p, self.q) __repr__ = __str__ r1 = Rational(1, 3) r2 = Rational(1, 2) print r1 + r2 注:还不理解__add__怎么执行的,你先把print r1 + r2里的+号改成-号,执行后报错,然后再把__add__改成__sub__,再次执行,你就懂了(*与/符号同理)
    查看全部
  • *args:接收参数类似f(1,2,3,4,5,6,7,'a','b') **kw: 接收参数类似f(a=1,b=2,c='d')
    查看全部
  • 先定义一个函数f,再定义一个函数g,g里包含了具体的用途算法,最后函数f返回g.
    查看全部
  • reduce()与map()函数的不同在于:reduce()对list中的每个元素反复调用函数,而map()仅对list中的每个元素单独作用
    查看全部
  • super().__init__() ,super的括号里写的是子类名和self...
    查看全部
    3 采集 收起 来源:python中 __slots__

    2017-02-08

  • 能接收函数做参数的函数称之为高级函数 def add(x,y,f) #定义一个add函数,参数包括两个数值x,y。f先不理。 return f(x)+f(y) #返回一个表达式,f可以看出是个函数 add(-5,8,abs) #f = abs,相当于自定义add函数中的f有着abs()函数的功能。 13 #输出-5的绝对值和8之和
    查看全部
  • 这里有一个通过迭代函数来实现求解最大公约数的函数,这算是算法的范畴了,欠的帐啊: def gcd(a, b): if b == 0: return a return gcd(b, a % b)
    查看全部
  • *args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。 'call %s() in %fs' 中%后面的s()和fs分别引用后面的f.__name__和t2-t1, 常用的python字符串格式化符号: %s表示格式化字符串,%f表示格式化浮点数,%d表示格式化整数 详细介绍地址:http://www.runoob.com/python/python-strings.html
    查看全部
  • 多种导入方式 1、import os 使用os.path.isdir...... 2、import os.path 使用os.path.isdir...... 3、from os import path 使用path.isdir...... 4、from os.path import isdir,isfile 使用isdir.....
    查看全部
  • lambda: 'A'等价于return'A',相当于一个函数f,那么f()='A'.因此,p1.get_grade=f,p1.get_grade()=f() 就是这个意思,但没有说全 p1.get_grade是属性,只不过这里的属性是一个函数对象,即f p1.get_grade()是方法,前面的p1就是调用这个方法的对象,即实例,整句来说就是实例方法
    查看全部
  • f.__name__:__name__是一个特殊方法,存储的是函数的名称,每一个函数都会自动有这个方法 装饰器调用方法: 1、2、(下图) 3、Python内置的@语法就是为了简化装饰器的作用: @new_fn def f1(x): return x*2 相当于: def f1(x): return x*2 f1 = new_fn(f1) 装饰器的作用:可以极大地简化代码,避免每个函数编写重复代码 打印日志:@log 检测性能:@performance 数据库事务:@transaction url路由:@post('/register')
    查看全部
  • cmp:从小到大 -cmp:从大到小 注意: 如果list不仅仅包含 Student 类,则 __cmp__ 可能会报错: L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello'] print sorted(L) 请思考如何解决。 在__cmp__内增加一个判断s的类型就能解决 def __cmp__(self, s): if isinstance(s, Student) == False: return -1 if self.name < s.name: return -1 elif self.name > s.name: return 1 else: return 0
    查看全部
    3 采集 收起 来源:python中 __cmp__

    2018-03-22

  • 其实可以看出来f是个函数,而不是某个值,所以在fs.append(f)的时候,append的其实是一个函数,但是在这个时候f函数是没有进行任何计算的,而f1,f2,f3=count()是个混合赋值,其实相当于f1,f2,f3=[f,f,f],那么,这个时候就调用到了f,f开始参与计算,但是当f完全计算完之后i的值其实是3,所以最后的结果都是9--但是将fs.append(f)改写成fs.append(f())的时候返回的是一个数值而不是函数,此时把最后一行printf1()f2()f3()的括号去掉就可以的到相关值。不去掉括号会报错
    查看全部
    3 采集 收起 来源:python中闭包

    2016-08-05

  • 这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前 call %s() in %fs'是格式字符串,%s是参数待替换的位置 (f.__name__, (t2 - t1))是格式字符串传入的参数,参数用一个元组来表示 中间的%是分隔符 f.__name__:__name__是一个特殊方法,存储的是函数的名称,每一个函数都会自动有这个方法
    查看全部

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!