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
|
try
:
from
cStringIO
import
StringIO
except
ImportError:
from
StringIO
import
StringIO
|
1
2
3
4
|
try
:
import
json
except
ImportError:
import
simplejson as json
|
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
|
xiaoming
=
Person()
xiaoming.name
=
'Xiao Ming'
xiaoming.gender
=
'Male'
xiaoming.birth
=
'1990-1-1'
|
1
2
3
4
|
xiaohong
=
Person()
xiaohong.name
=
'Xiao Hong'
xiaohong.school
=
'No. 1 High School'
xiaohong.grade
=
2
|
1
|
xiaohong.grade
=
xiaohong.grade
+
1
|
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
|
xiaoming
=
Person(
'Xiao Ming'
,
'Male'
,
'1991-1-1'
)
xiaohong
=
Person(
'Xiao Hong'
,
'Female'
,
'1992-2-2'
)
|
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
):
#类方法
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
|
1
|
>>>
isinstance
(p, Person)
|