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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
564人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • 以前我计算一个东西的时候,是先用一个数值,输入到一个过程中,启动这个过程,才能得到我的数值。现在出现了闭包,我只要把这个数值输入到闭包中,它能把我的数值和想要进行的过程组装成一个无参的函数,只要我在任意时刻启动这个无参函数,那么它就能输出我想要的结果。 以前想吃饭的时候,我要把米和水加到电饭锅里,煮熟得到饭。后来出现了一个机器,我把米和水加进去,它生产了一台装着我的米和水的电饭锅。虽然我现在不饿,但是只要任何时候我饿了,我按下按钮(启动电饭锅开始煮饭),那么我就可以吃到饭了。 这个新的电饭锅的优点就是你想吃随时米都可以成为饭,不吃的时候米就保持米的状态。 带闭包的函数就是能够生产电饭锅的机器,普通函数就是电饭锅
  • str.upper()把字符串 str 任意字符变成大写 str.lower()把字符串str任意字符变成小写 str.capitalize()返回一个首字符大写其他字符小写的str的副本 map(f,L)把L相应数据均通过f()函数转换为一个新的list map(func_name,list_obj)高阶函数:返回list_obj中每个元素分别经过func_name作用过的新的list,例子如下: def formate_name(s): return str.capitalize(s) print map(formate_name,['adam','LINDA','jany']) 输出结果为:['Adam','Linda','Jany']
  • 一开始没有理解f1,f2,f3=count()的意义,按照老的思路讲f1f2f3作为指向数值的变量即[f1,f2,f3]=[1,4,9]。 后来发现新瓶装旧酒这样浪费了老师出题的思路,不学习新的永远得不到新的方法。 原题是函数的指向,,f1指向的不应该是数值,而是函数<function g at 0x01EC5F70>,f1()才应该是具体的值,最终print的是f1(),f2(),f3()。故f1,f2,f3=count()这个过程应该使得f1,f2,f3分别指向了三个函数。 print count()输出的是一个list,中间元素都是函数,f1,f2,f3=count()使得其三个函数对应。 >>count() >><function f at 0x0000000002191978>, <function f at 0x00000000021919E8>, <function f at 0x0000000002191A58>] 引用老师的话:“返回函数不要引用任何循环变量,或者后续会发生变化的变量。”
  • 格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。 'call %s() in %fs'是模板,%s为第一个格式符,表示一个字符串和%f为第二个格式符,表示一个浮点数,(f.__name__, (t2 - t1))中的两个元素'f.__name__和t2-t1为替换%s和%f的真实值。
  • 方法:问题的产生是因为函数只在执行时才去获取外层参数i,若函数定义时可以获取到i,问题便可解决。而默认参数正好可以完成定义时获取i值且运行函数时无需参数输入的功能,所以在函数f()定义中改为f(m = i),函数f返回值改为m*m即可.
    查看代码快照
  • ypes.MethodType,它接受三个参数,第一,你要绑定的函数,第二,对象,第三,绑定的类 方法和函数的区别 方法是在类的内部定义的,只能通过实例化之后使用;而函数是在程序内定义的,可以不必实例化,直接用。举个例子,如果有个方法和函数都叫func,方法的调用方法必须是a.func()(其中,a为类的实例);函数的调用方法为func() print p1.get_grade() 这里其实是传入了p1作为self参数的,只是不是显式传入。 而没有括号只是 p1.get_grade 的话就只是一个函数名了,只代表一个函数
  • 解释器内部会将**kw拆分成对应的dict. setattr()方法接受3个参数:setattr(对象,属性,属性的值) setattr(self,k,v)相当于self.k = v kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v
    查看代码快照
  • *args: 任意数量参数,传递的是一个list **kw: 任意数量k-v值,传递的是一个dict
  • p1,p2,p3存储的是地址,即"Bart","Adam","Lisa"的地址为别对应 [<__main__.Person object at 0x1e964450>, <__main__.Person object at 0x1e97e7d0>, <__main__.Person object at 0x1e97ea10>] 因此如果直接使用sorted(L1),那么则是对地址进行大小排序,所以对各项的name的输出的结果则是"Bart","Adam","Lisa",乍看一眼会觉得代码并没有错,但是不知道结果为什么是错的,原因就在于排序的对象搞错了。 所以为了对名字大小进行排序,需要在sorted内添加内建的cmp函数,即sorted(L1,lambda x,y:cmp(x.name,y.name))
    查看代码快照
  • def __init__(self,name): self.name=name Person.count+=1 (self.count+=1) 区分这两个 一个是给类属性赋值 一个是给类下面的实例,跑了一下,结果不一样的。
  • 这是我弄懂之后做的笔记,大家可以参考一下: 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. 望采纳,共勉~
  • 我想一定不止我一个人把f.__name__中的双下划线看成是单下划线!!一定不止我一个人!!!!!!!!!!
  • 带参数的decorator需要三层嵌套,是因为: 最里一层,必然是一个参数列表为(*args,**kw)的wrapper,执行自身逻辑与运行目标函数,返回的是目标函数的执行结果; 倒数第二层,必然是一个参数列表为(f)的函数,用来接受目标函数,以供wrapper调用(闭包),并返回wrapper; 如果是无参数decorator,这时已经够了,python解释器会自动把@decorator转换成 f=decorator(f); 但如果是有参数decorator,还需要最后一层,因为还有一个decorator自身的参数要传递以供内部闭包使用。因此,最外一层就是decorator,参数列表为decorator自身需要的参数列表,返回的其实还是内部的wrapper。(因为外两层只为传递参数,并没有自身逻辑实现)
  • 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符 s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符 注意: 当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ') 去掉 文本中句子开头与结尾的符号的。因为在文本中每行开头都有个"/n",代表换行。(印象中是这样的) 一般是 for line in file: line.strip().split() 这样就把每行的每个字符一个个分开,变成一个list。
  • import time #调用函数参数 def performance(f): #定义装饰器函数 def fn(*args,**kw): #定义接收任何参数的子函数 t1=time.time() #获取当前电脑时间 r=f(*args,**kw) #传入并运行factorial()函数 t2=time.time() #获取当前电脑时间 print 'call %s() in %fs' % (f.__name__,(t2-t1)) #%s表示该位置应填入字符串,%f表示该位置应填入浮点型数字(即包含小数尾数的数字),()和s没任何意义(还是()和s),(f.__name__,(t2-t1))以元组形式表示需要填入的字符串(本处f.__name__=factorial)和浮点型数字 return r #返回执行factorial()函数后的值 return fn #返回子函数fn @performance #定义装饰器 def factorial(n): #定义原函数factorial() return reduce(lambda x,y: x*y, range(1, n+1)) #以匿名函数定义原函数运算规则和返回值 print factorial(10) #此时的factorial经过装饰器@performance包装,已经是performance(factorial),该命令等价于 print performance(factorial)(10) #输出fn()运算结果:1、给出装饰器添加的部分:call factorial() in 0.0000s;2、给出原函数factorial(10)元算结果,3628800
首页上一页1234567下一页尾页

举报

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