
| 
1 
2 
3 | defadd(x,y,z):    returnz(x)+z(y)printadd(-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  #下载piptar-xzvf pip-1.5.4.tar.gzcdpip-1.5.4 #(会提示安装setuptools,yum install python-setuptools 即可)python setup.py installpip installpymongo #可以使用pip安装第三方模块了 | 
| 
1 
2 | classPerson(object):    pass | 
| 
1 
2 
3 
4 
5 | classPerson(object):    def__init__(self, name, gender, birth):        self.name =name        self.gender =gender        self.birth =birth | 
| 
1 
2 
3 
4 
5 
6 | classPerson(object):    def__init__(self, name):        self.__name =name     defget_name(self): #它的第一个参数永远是 self,指向调用该方法的实例本身        returnself.__name | 
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 | classPerson(object):    count =0    @classmethod    defhow_many(cls): #类方法,不用self?        returncls.count    def__init__(self, name):        self.name =name        Person.count =Person.count +1printPerson.how_many()p1 =Person(‘Bob‘)printPerson.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 | classPerson(object):    def__init__(self, name, gender):        self.name =name        self.gender =gender | 
| 
1 
2 
3 
4 | classStudent(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