C++程序员Python notes(二)

2014-11-24 08:43:24 · 作者: · 浏览: 2
\',与C相同,第二种不推荐,因为任何第二种的情况都可使用()来代替
Python中的switch/case可用多个if/elif/else代替,或者个人感觉可以使用dictionary结合lambda表达式,如:
choice = 'inc'
g = {'inc' : lambda x: x + 1,
'dec' : lambda x: x - 1}
g[choice](x)
Python中的while和for都可带else子句,注意break是不会跳到else中的,只有循环的判断表达式为False方可。
12. map(function, seq1, seq2, ...) 对seq列表中的所有的的seq每项依次调用function,将其返回值构建列表,如果functon为None则直接返回seq中的值
map(lambda x, y: y / x, time, ratio) #每个时刻点的平均ratio
13. zip就是把2个数组糅在一起
x=[1, 2, 3, 4, 5 ]
y=[6, 7, 8, 9, 10]
zip(x, y)就得到了
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
比如你有2组坐标,你想两两对应的相加,那么zip函数就很有用了。
再比如,你有2个数组A,B,A存了班级里的人的名字,B是每个人的考试分数,你需要通过某个人的名字来查考试分数,那你需要一个字典,zip可以很方便地帮你建立字典:
>>> x=['bob','tom','kitty']
>>> y=[80,90,95]
>>>d=dict(zip(x,y))
[('bob', 80), ('tom', 90), ('kitty', 95)]
>>> d['bob']
返回80,多方便啊
14. 在Python中所有的都是对象,函数也不例外。
def定义一个函数对象,定义的对象可赋值,lambda函数同理。
if x ==0:
def npower(n): x**2
else:
def npower(n): x**3
nload = npower
nload(5)
L = [npower, nload]
15. 命名空间
第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的地点决定标识符所处的命名空间。
第二,函数定义(包括def和lambda)产生新的命名空间。
第三,python搜索一个标识符的顺序是"LEGB"。
所谓的"LEGB"是python中四层命名空间的英文名字首字母的缩写。最里面的一层是L(local),表示在一个函数定义中,而且在这个函数里面没有再包含函数的定义。第二层E(enclosing function),表示在一个函数定义中,但这个函数里面还包含有函数的定义,其实L层和E层只是相对的。第三层G(global),是指一个模块的命名空间,也就是说在一个.py文件中定义的标识符,但不在一个函数中。第四层B(builtin),是指python解释器启动时就已经具有的命名空间,之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数的就处于B层的命名空间中。
其实只要在
编程
的时候注意一下,不要使用相同的标识符,基本上就可以避免任何与命名空间相关的问题。还有就是在一个函数中尽量不要使用上层命名空间中的标识符,如果一定要用,也最好使用参数传递的方式进行,这样有利于保持函数的独立性。
16. 函数传参方式
关键字赋值法:不像C/C++,形参的顺序是可根据传参顺序改变,如:F(arg2 = 2, arg1 = 1)
F(arg1,arg2,...)
F(arg2=,arg3=...) #带默认值的函数定义,如果需要用到默认值的参数在前面,则使用关键字赋值法
F(*arg1) #参数不管多少个都被存放在以形参名为标识符的tuple中
F(**arg1) #参数不管多少个都被存放在以形参名为标识符的dictionary中,调用时需要采用F(x = 1, y = 2)类似的形式, 则arg1 = {('x' : 1), ('y' : 2)}
17. lambda函数
C++不同,lambda在 Python中只能是一行,可以使用';',但不能使用for/while/if,虽然使用某些技巧可以实现但不推荐, 系统自带的map/reduce/filter等函数比较好用。
lambda x, y: x + y; print x, y; x + y + 1
18. 类相关
__init__(self) 类的构造函数,如果传参可写为__init__(self, arg1, arg2...),类似于c++中的bind。
__del__(self) 类的析构函数
__call__(self, arg1, ...) 类似于C++中的重载括号运算符
类中的权限完全根据_和__来区分,即直接命名的为public函数
派生类需要手动调用基类的__init__,否则继承将不起作用
class Animal(object):
name = 'unname' # member varieble
def __init__(self, voice = 'hello', name = 'default'):
self.voice = voice
print 'animal::__init__, name: ', name
def __call__(self, voice)
self.voice = voice
def say(self):
print self.voice
print self.name
class Dog(Animal):
def __init__(self):
#Animal.__init__(self) # 手动调用
super(Dog, self).__init__() #代替上面的写法
self.dogName = 'dogName'
Dog d
d('wangwang') # invoke __call__
d.say()