标签:
1
2
3
|
def add(x,y,z): return z(x) + z(y) print add( - 2 , - 3 , abs ) |
特点 是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。举例如下:
# 希望一次返回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
因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。
>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]
通过对比可以看出,匿名函数lambda x: x * x 实际上就是:
def f(x): return x * x
关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数
(匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果,返回函数的时候,也可以返回匿名函数:)
1
2
3
4
5
|
wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificate #下载pip tar -xzvf pip-1.5.4. tar .gz cd pip-1.5.4 #(会提示安装setuptools,yum install python-setuptools 即可) python setup.py install pip install pymongo #可以使用pip安装第三方模块了 |
1
2
|
class Person( object ): pass |
1
2
3
4
5
|
class Person( object ): def __init__( self , name, gender, birth): self .name = name self .gender = gender self .birth = birth |
1
2
3
4
5
6
|
class Person( object ): def __init__( self , name): self .__name = name def get_name( self ): #它的第一个参数永远是 self,指向调用该方法的实例本身 return self .__name |
1
2
3
4
5
6
7
8
9
10
11
12
|
class Person( object ): count = 0 @ classmethod def how_many( cls ): #类方法,不用self? 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类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
要定义关键字参数,使用 **kw;
除了可以直接使用self.name = ‘xxx‘设置一个属性外,还可以通过 setattr(self, ‘name‘, ‘xxx‘) 设置属性。
参考代码:
class Person(object): def __init__(self, name, gender, birth, **kw): self.name = name self.gender = gender self.birth = birth for k, v in kw.iteritems(): setattr(self, k, v) xiaoming = Person(‘Xiao Ming‘, ‘Male‘, ‘1990-1-1‘, job=‘Student‘) print xiaoming.name print xiaoming.job
1
2
3
4
|
class Person( object ): def __init__( self , name, gender): self .name = name self .gender = gender |
1
2
3
4
|
class Student(Person): def __init__( self , name, gender, score): super (Student, self ).__init__(name, gender) self .score = score |
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/jerome_s/article/details/47264541