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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.17
567人评价 查看评价
9.6 内容实用
9.0 简洁易懂
8.9 逻辑清晰
  • 以前我计算一个东西的时候,是先用一个数值,输入到一个过程中,启动这个过程,才能得到我的数值。现在出现了闭包,我只要把这个数值输入到闭包中,它能把我的数值和想要进行的过程组装成一个无参的函数,只要我在任意时刻启动这个无参函数,那么它就能输出我想要的结果。 以前想吃饭的时候,我要把米和水加到电饭锅里,煮熟得到饭。后来出现了一个机器,我把米和水加进去,它生产了一台装着我的米和水的电饭锅。虽然我现在不饿,但是只要任何时候我饿了,我按下按钮(启动电饭锅开始煮饭),那么我就可以吃到饭了。 这个新的电饭锅的优点就是你想吃随时米都可以成为饭,不吃的时候米就保持米的状态。 带闭包的函数就是能够生产电饭锅的机器,普通函数就是电饭锅
  • 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 的话就只是一个函数名了,只代表一个函数
  • 这是我弄懂之后做的笔记,大家可以参考一下: 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. 望采纳,共勉~
  • 解释器内部会将**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) 区分这两个 一个是给类属性赋值 一个是给类下面的实例,跑了一下,结果不一样的。
  • 高阶函数:能接受函数做参数的函数 1.变量可以指向函数 例:f=abs 2.函数的参数可以接收变量 例:abs=len(此时的abs作为len函数存在,求字符的长度) 3.一个函数可以接收另一个函数作为参数 例:add(1,2,abs),表示对1和2先取绝对值再求和
  • 我想一定不止我一个人把f.__name__中的双下划线看成是单下划线!!一定不止我一个人!!!!!!!!!!
  • 带参数的decorator需要三层嵌套,是因为: 最里一层,必然是一个参数列表为(*args,**kw)的wrapper,执行自身逻辑与运行目标函数,返回的是目标函数的执行结果; 倒数第二层,必然是一个参数列表为(f)的函数,用来接受目标函数,以供wrapper调用(闭包),并返回wrapper; 如果是无参数decorator,这时已经够了,python解释器会自动把@decorator转换成 f=decorator(f); 但如果是有参数decorator,还需要最后一层,因为还有一个decorator自身的参数要传递以供内部闭包使用。因此,最外一层就是decorator,参数列表为decorator自身需要的参数列表,返回的其实还是内部的wrapper。(因为外两层只为传递参数,并没有自身逻辑实现)
  • reduce()函数 reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。 例如,编写一个f函数,接收x和y,返回x和y的和: def f(x, y): return x + y 调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算: 先计算头两个元素:f(1, 3),结果为4; 再把结果和第3个元素计算:f(4, 5),结果为9; 再把结果和第4个元素计算:f(9, 7),结果为16; 再把结果和第5个元素计算:f(16, 9),结果为25; 由于没有更多的元素了,计算结束,返回结果25。 上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。 reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算: reduce(f, [1, 3, 5, 7, 9], 100) 结果将变为125,因为第一轮计算是: 计算初始值和第一个元素:f(100, 1),结果为101。
首页上一页1234567下一页尾页

举报

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

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