为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
python进阶_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值.
    查看全部
  • 大写字母upper(),小写字母lower()
    查看全部
  • map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. map()函数不改变原有的 list,而是返回一个新的 list.
    查看全部
  • 通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。
    查看全部
  • import math 引用数学模型函数 def add(x, y, f): return f(x) + f(y) print add(25, 9, math.sqrt)
    查看全部
  • 解释器内部会将**kw拆分成对应的dict. setattr()方法接受3个参数:setattr(对象,属性,属性的值) setattr(self,k,v)相当于self.k = v kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v
    查看全部
  • 1.decorator返回的新函数函数名已经不是'f2',而是@log内部定义的'wrapper'。这对于那些依赖函数名的代码就会失效 2.要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中 Python内置的functools可以用来自动化完成这个“复制”的任务 3. >>> import functools import functools def log(f): @functools.wraps(f) #这行代码本身也是一个装饰器,它表示了将原函数原始参数信息复制到wrapper中去 def wrapper(*args, **kw): print 'call...' return f(*args, **kw) return wrapper
    查看全部
  • map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 注意:map()函数不改变原有的 list,而是返回一个新的 list。 利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
    查看全部
  • import time def performance(unit): def f(k): def g(*args,**kw): t1=time.time() k(*args,**kw) t2=time.time() if unit=='ms': t=(t2-t1)*1000 else: t=(t2-t1) print 'call %s() in %f %s'%(k.__name__,t,unit) return k(*args,**kw) return g return f @performance('ms') def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) 1.@performance('ms') def factorial(n):............这两个语句,实际上就是: q=performance('ms') #把f的定义赋给q,并且f内的unit被初始化为‘ms' factorial=q(factorial) #调用q函数(也即半初始化的f函数),即执行f函数里面的语句,并且g内的k被初始化为factorial函数然后把g的定义赋给factorial。 注意深刻理解注释,重点是理解装饰器内的函数如果没有调用,就不会执行,而执行外层函数的时候,内层函数是不会执行的,可以理解为外部函数的算法是定义一个函数(只是定义,只是定义,只是定义,重要的事情说三遍),然后就return了。 !就!是!说!当执行一个函数时,遇到一个内部函数定义,只是做一个定义,而不会执行这个内部函数,任何函数的执行都是需要调用语句的! 但是!如果这个内部函数用到外部函数的参数时,执行外部函数就可以理解为定义内部函数并将其中用到的外部函数引入的参数设定为引入时的值。
    查看全部
  • 带参数的decorator需要三层嵌套,是因为: 最里一层,必然是一个参数列表为(*args,**kw)的wrapper,执行自身逻辑与运行目标函数,返回的是目标函数的执行结果; 倒数第二层,必然是一个参数列表为(f)的函数,用来接受目标函数,以供wrapper调用(闭包),并返回wrapper; 如果是无参数decorator,这时已经够了,python解释器会自动把@decorator转换成 f=decorator(f); 但如果是有参数decorator,还需要最后一层,因为还有一个decorator自身的参数要传递以供内部闭包使用。因此,最外一层就是decorator,参数列表为decorator自身需要的参数列表,返回的其实还是内部的wrapper。(因为外两层只为传递参数,并没有自身逻辑实现)
    查看全部
  • 格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。 'call %s() in %fs'是模板,%s为第一个格式符,表示一个字符串和%f为第二个格式符,表示一个浮点数,(f.__name__, (t2 - t1))中的两个元素'f.__name__和t2-t1为替换%s和%f的真实值。 import time #调用函数参数 def performance(f): #定义装饰器函数 def fn(*args,**kw): #定义接收任何参数的子函数 t1=time.time() #获取当前电脑时间 r=f(*args,**kw) #传入并运行factorial()函数
    查看全部
  • 装饰器”(Decorator): decorator可以接受一个函数作为参数,并返回一个新函数 def f1(x): #定义一个函数f1 return x*2 def new_fn(g): #这就是装饰器函数 def fn(x): print ('call %s()' %g.__name__) #g.__name__:代码作用提取函数名称 return g(x) return fn 装饰器函数的调用: g1 = new_fn(f1) #用装饰器函数对函数f1装饰,并将return 的新函数赋予g1 print g1(5) #调用函数g1,并计算5. 方法二 f1 = new_fn(f1) #将return 的新函数赋予f1,此时f1的原始定义被彻底隐藏。 print f1(5) 结果: call f1() 25 关于装饰器的调用:Python的@语法,把decorator置于函数的定义处: @new_fn def f1(x): retunr x*2 把@new_fn放到f1()函数的定义处,相当于执行了语句: f1 = new_fn(f1) 等同于上面所述的方法二
    查看全部
  • 匿名函数小记: map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。 1. 匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。 2. 使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码 3. 返回函数的时候,也可以返回匿名函数 print filter(lambda s: s and len(s.strip())> 0, ['test', None, '', 'str', ' ', 'END'])
    查看全部
  • f1, f2, f3 = count()中为何要有3个元素f1, f2, f3?因为count()返回的是fs,而fs是什么?是列表。什么列表?有3个元素的列表。为什么有3个元素?因为for语句的rang(1,4)。所以相当于 f1,f2,f3=[ 值,值 ,值 ]。所以f1, f2, f3中你不能多写一个f4或少写f1, f2, f3其中任何一个,因为你要分别匹配[ 值,值 ,值 ]3个。好,现在我问你列表里的值是什么?是[1,4,9]?哈哈,错了,不是,你可以看到r输出的是<function count.<locals>.f.<locals>.g at 0x10067bae8> 之类的(有3个)。我们来分析r = f(i)。首先第一个循环,i=1,那就是f(1),请问f(1)返回的给r的是什么?看到return g没有?是g,也就是g()函数的地址,f1-->r-->g,f1指向的是g的地址。剩下的i=2、i=3一样。所以r就是g()函数的地址。fs.append(r)就是将r追加到列表fs[]中,所以输出r你看到的是以下输出: [<function count.<locals>.f.<locals>.g at 0x10067bae8>, <function count.<locals>.f.<locals>.g at 0x10067ba60>, <function count.<locals>.f.<locals>.g at 0x10067bb70>] 看到了吗?[地址,地址,地址]。ps:g的地址为什么不同?因为你创建循环3次调用了f(),自然调用了3次g() 终于最后一步了:print(f1(),f2(),f3()),你会问为什么f1还要加上()。f1指向的是g的地址,所以f1()表示什么?表示是g()。i=1,传参数给j。所以g()就返回1*1(return j * j)。同理f2()=2*2,f3()=3*3.
    查看全部
    3 采集 收起 来源:python中闭包

    2018-03-22

  • 本教程是廖雪峰所写,但是看2-8并没有太明白返回函数的意思,看了廖雪峰的官网,才搞懂。 以廖雪峰官网的例子说明: def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum 当调用lazy_sum的时候: f=lazy_sum(1,3,5,7,9) 按照函数的要求,最后返回的是sum函数,虽然在lazy_sum中调用了sum进行计算,但是sum的最终计算结果都是放在函数sum中,这时候即f=sum(),再次调用f时: f() 这时候才将sum的计算结果进行展示。这种就称为闭包
    查看全部

举报

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

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