-
进阶学习内容
查看全部 -
这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。举例如下:
# 希望一次返回3个函数,分别计算1x1,2x2,3x3:def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果全部都是 9(请自己动手验证)。
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:
>>> f1() 9 # 因为f1现在才计算i*i,但现在i的值已经变为3
因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。
查看全部 -
关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。
查看全部 -
传入**kw 即可传入任意数量的参数,并通过 setattr() 绑定属性。
class Person(object): def __init__(self, name, gender, **kw): self.name = name self.gender = gender for k, v in kw.iteritems(): setattr(self, k, v) p = Person('Bob', 'Male', age=18, course='Python') print p.age print p.course
查看全部 -
有点意思呀
查看全部 -
中闭包。内部定义的函数和外部定义的函数一样,但是内部函数不能被外部访问。
查看全部 -
继承
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。
函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法
注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
查看全部 -
由于 f 可以被调用,所以,f 被称为可调用对象。
所有的函数都是可调用对象。
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。
我们把 Person 类变成一个可调用对象:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self, friend): print 'My name is %s...' % self.name print 'My friend is %s...' % friend
现在可以对 Person 实例直接调用:
>>> p = Person('Bob', 'male') >>> p('Tim') My name is Bob... My friend is Tim...
单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
查看全部 -
和属性类似,方法也分实例方法和类方法 通过标记一个@classmethod, 将方法绑定到类上,类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。 class Person(object): count = 0 @classmethod def how_many(cls): return cls.count def __init__(self, name): self.name = name Person.count = Person.count + 1 print Person.how_many() p1 = Person('Bob') print Person.how_many() 因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。
查看全部 -
现在可以对 Person 实例直接调用:
>>> p = Person('Bob', 'male') >>> p('Tim') My name is Bob... My friend is Tim...
单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
查看全部 -
class Person(object):
__slots__ = ('name', 'gender')
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
__slots__ = ('score',)
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
s = Student('Bob', 'male', 59)
s.name = 'Tim'
s.score = 99
print s.score查看全部 -
从Python3开始,双下划线开始的属性表示私有属性,禁止类外访问,私有属性在Python2里面是没有的。
你的代码里,没有score这个属性,所以返回self.score会报错,只有__score这个属性,所以设置,返回都要使用__score,
查看全部 -
__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
查看全部 -
sorted()函数接收一个比较函数来实现自定义排序。比较函数:传入两个待比较元素x,y 如果x排在y面前,返回-1;x 排在 y 的后面,返回 1;如果 x 和 y 相等,返回 0。
Ex:
def dxsc(x, y): if x > y: return -1 if x < y: return 1 return 0 L=[36,5,,12,9,21] print sorted(L,dxsc) //输出结果为36,21,12,9,5 //切记:sorted()函数有两个参数,第一个参数是定义的变量,第二个参数是定义的函数名。
查看全部 -
filter()函数接收两个参数,一个是函数f一个是list 函数f的功能是:对每个元素判断,返回True或者False 。 filter()函数会根据判断结果自动丢弃掉不符合条件的元素,然后返回由符合条件组成的新list。
Ex:'
def qs(x):
return x%2==1
L=[1,4,6,7,9]
print filter(qs,L)
.stipr()函数:删除指定位置的元素 左面第一个开始 不匹配的话直接从最后面的位置再开始匹配
Ex:
s='abc456ert'
print s.strip('abt') //结果为c456er
print s.strip('acr') //结果为bc456ert
查看全部
举报