1. 循环式用xrange代替range
我发觉在很多有关Python的书中都在循环中使用range,但很少涉及到xrange,其实
如果循环的次数很大的话,xrange的效率要要明显高于range,毕竟xrange的实现不需要维
护一个列表
2. Python的三元表达式
Python在诞生的时候的很长时间里,都没有加入类似于C++的三元操作符(?:),以至
于很多人都还认为Python中没有实现三元操作符,其实在Python 2.5之后,Python之父
Guido van Rossum加入了这个新的特性:正确的表达是:V1 if C else V2 (详见python核
心编程)
于很多人都还认为Python中没有实现三元操作符,其实在Python 2.5之后,Python之父
Guido van Rossum加入了这个新的特性:正确的表达是:V1 if C else V2 (详见python核
心编程)
其实还有很多方法可以模拟,我就很喜欢通过列表来模拟:
C++ : cout<<(n>=0)?"Positive":"Negative"<<endl;
print "Positive" if n>=0 else "Negative" # 标准的Python三元符
print ["Positive","Negative"][n>=0] # 列表模拟
3. 交换两个元素
在C++中交换两个元素我们往往采用下面的代码
Type tmp=x ; x=y ; y=tmp;
Python当然也可以这样实现,但这样显然没有很好利用Python的特性利用Python的
元祖赋值,我们可以直接写成下面更简洁的代码
元祖赋值,我们可以直接写成下面更简洁的代码
x,y = y,x (够简洁吧)
4. Python的变量是没有类型的,它可以与任意类型的内存对象绑定,这也是Python与大多
数语言的一个重要区别
数语言的一个重要区别
如 :a=1 #这时a与一个数值型绑定
a="Test" #a变为与一个字符型绑定
5. Python的可变(mutable)类型与不可变(immutable)类型
这个恐怕是Python初学者感到最头痛的问题之一了,Python把所有的类型划分为两
种:可变与不可变:从字面意思很好理解,可变类型就是指值可变的类型,不可变类型是
指值不可变的类型(就像C++的常量),可变数据类型有列表,字典,不可变的数据类型
有元祖,数值型和字符串,但慢慢深究,就会发现,其实里面大有奥秘
种:可变与不可变:从字面意思很好理解,可变类型就是指值可变的类型,不可变类型是
指值不可变的类型(就像C++的常量),可变数据类型有列表,字典,不可变的数据类型
有元祖,数值型和字符串,但慢慢深究,就会发现,其实里面大有奥秘
首先看一看这个例子:
a=1
a=2
这个运行不会出错,若按照前面所讲,a是一个数值型,应该是不可变的,那么这
里为什么没有错呢?其实上面的a与下面的a已经不是同一个对象了,可以通过id查看内
存对比更准确的说法是a抛弃旧的对象(1),而与新的对象(“Test”)绑定,原对象
(1)并没有改变
里为什么没有错呢?其实上面的a与下面的a已经不是同一个对象了,可以通过id查看内
存对比更准确的说法是a抛弃旧的对象(1),而与新的对象(“Test”)绑定,原对象
(1)并没有改变
赋值:不管是可变还是不可变类型,变量赋值都是把两个变量与同一个内存绑定
a=1
b=a
a is b #结果为True
a=[1,2,3]
b=a
a is b #结果也为True
参数传递:与C++的参数传递分为值传递和引用传递不同,Python没有区分,统一进
行赋值操作,也就是实参和形参都绑定到统一个对象中
行赋值操作,也就是实参和形参都绑定到统一个对象中
下面来看两个例子:
def fun(a):
def fun(a):
a=2
data=1
fun(data)
print data
# 输出结果为1,也就是形参的改变并没有对实参产生影响,我们再看
def fun(a):
a[0]=2
data=[1,2,3]
fun(data)
print data
# 输出结果为[2,2,3]
这里又该变了,那是否矛盾呢?当然不矛盾,对可变类型,形参与实参都绑定到同
一类型中,修改形参值当然会改变实参,但对不可变类型来说,正如前面说的:改变
形参其实是形参抛弃旧的对象,而与新的对象绑定
因此,要将可变类型进行参数传递,尤其要小心防止被修改,若不想修改应该传递副本
6. lambda的谨慎使用
lambda创建一个匿名函数,通常与map,reduce ,filter等联合使用,但只有当函
数很短(例如只有一个表达式时)才选择,不能有循环等语句,否则,应直接定义一个
函数
这里又该变了,那是否矛盾呢?当然不矛盾,对可变类型,形参与实参都绑定到同
一类型中,修改形参值当然会改变实参,但对不可变类型来说,正如前面说的:改变
形参其实是形参抛弃旧的对象,而与新的对象绑定
因此,要将可变类型进行参数传递,尤其要小心防止被修改,若不想修改应该传递副本
6. lambda的谨慎使用
lambda创建一个匿名函数,通常与map,reduce ,filter等联合使用,但只有当函
数很短(例如只有一个表达式时)才选择,不能有循环等语句,否则,应直接定义一个
函数
a=range(1,11)
b = filter( lambda x:x%3==0 , a)
b=[3,6,9] #返回能被3整除的数
总之,使用lambda只是使代码变得简洁,而不会带来性能上的提高
b = filter( lambda x:x%3==0 , a)
b=[3,6,9] #返回能被3整除的数
总之,使用lambda只是使代码变得简洁,而不会带来性能上的提高
总之,Python是一种灵活高效的语言,选择Python,就像以前曾经看过的一篇博客所说的,就要使Python有一种“一字值千金”的感觉
No comments:
Post a Comment