优雅胜于丑陋 (Beautiful is better than ugly)
看下面例子:
一个带有数字参数的list函数其功能是返回参数中的奇数可以分开写:
Python
6#-----------------------------------------------------------------------
halve_evens_only=lambdanums:map(lambdai:i/2,\
filter(lambdai:noti%2,nums))
#-----------------------------------------------------------------------
defhalve_evens_only(nums):
return[i/2foriinnumsifnoti%2]
记住Python中那些非常简单的事
两个变量的交换:
Python
1
a,b=b,a
参数在切片操作中的步骤,如:
Python
1
2
3a=[1,2,3,4,5]
>>>a[::2]# 以步长为2的增量迭代整个list对象
[1,3,5]
Python
1
一个特殊的例子`x[::-1]`用来反转x的实用语法。
1
Python
1
2>>>a[::-1]
[5,4,3,2,1]
不要用可变对象作为默认参数值(Don’t use mutable as defaults)
Python
4deffunction(x,l=[]):# 不要这么干
deffunction(x,l=None):# 更好的一种方式
iflisNone:
l=[]
使用iteritems而不是items
iteriterms 使用的是 generators,所以当迭代很大的序列是此方法更好
Python
5d={1:"1",2:"2",3:"3"}
forkey,valind.items()# 调用items()后会构建一个完整的list对象
forkey,valind.iteritems()# 只有在迭代时每请求一次才生成一个值
此情景和range与xrange的关系相似。
使用isinstance而不是type
不要这样做:
1
Python
1
2
3iftype(s)==type(""):...
iftype(seq)==listor\
type(seq)==tuple:...
应该是这样:
1
Python
1
2ifisinstance(s,basestring):...
ifisinstance(seq,(list,tuple)):...
需要注意的是这里使用basestring而不是str是因为你可能会用一个unicode对象去检查是否为string,例如:
Python
5>>>a=u'aaaa'
>>>printisinstance(a,basestring)
True
>>>printisinstance(a,str)
False
因为在Python中3.0以下的版本存在两种字符串类型str和unicode
Python
1
object
Python
1
|
Python
1
basestring
Python
1
/\
Python
1
strunicode
学习各种集合(learn the various collections)
python有各种各样的容器数据类型,在特定情况下选择python内建的容器如:list和dict。通常更多像如下方式使用:
Python
6freqs={}
forcin"abracadabra":
try:
freqs[c]+=1
except:
freqs[c]=1
一种更好的方案如下:
Python
3freqs={}
forcin"abracadabra":
freqs[c]=freqs.get(c,0)+1
一种更好的选择 collection类型defautdict:
Python
4fromcollectionsimportdefaultdict
freqs=defaultdict(int)
forcin"abracadabra":
freqs[c]+=1
其它集合
Python
5namedtuple()# 用指定的域创建元组子类的工厂函数
deque# 类似list的容器,快速追加以及删除在序列的两端
Counter# 统计哈希表的dict子类
OrderedDict# 记录实体添加顺序的dict子类
defaultdict# 调用工厂方法为key提供缺省值的dict子类
当创建类时Python的魔术方法:
Python
6__eq__(self,other)# 定义相等操作的行为, ==.
__ne__(self,other)# 定义不相等操作的行为, !=.
__lt__(self,other)#定义小于操作的行为, <.
__gt__(self,other)#定义不大于操作的行为, >.
__le__(self,other)#定义小于等于操作的行为, <=.
__ge__(self,other)#定义大于等于操作的行为, >=.
条件赋值
Python
1
x=3if(y==1)else2
表达式请起来恰恰像:如果y等于1就把3赋值给x,否则把2赋值给x,当然同样可以使用链式条件赋值如果你还有更复杂的条件的话。
Python
1
x=3if(y==1)else2if(y==-1)else1
然而到了某个特定的点,它就有点儿过分了。
记住,你可以在任何表达式中使用if-else例如:
Python
1
(func1ify==1elsefunc2)(arg1,arg2)
func1将被调用如果y等于1的话,反之func2被调用。两种情况下,arg1和arg2两个参数都将附带在相应的函数中。
类似地,下面这个表达式同样是正确的
Python
1
x=(class1ify==1elseclass2)(arg1,arg2)
class1和class2是两个类
在有必要的时侯使用Ellipsis
创建类时,你可以使用__getitem__,让你的类像字典一个工作,拿下面这个类举例来说:
Python
8classMyClass(object):
def__init__(self,a,b,c,d):
self.a,self.b,self.c,self.d=a,b,c,d
def__getitem__(self,item):
returngetattr(self,item)
x=MyClass(10,12,22,14)
因为有了__getitem__,你就能够通过对象x的x[‘a’]获取a的值,这应该是公认的事实。
这个对象通常用于继承Python的切片(slicing)如果添加如下语句:
Python
5def__getitem__(self,item):
ifitemisEllipsis:
return[self.a,self.b,self.c,self.d]
else:
returngetattr(self,item)
我们就可以使用x[…]获取的包含所有项的序列
Python
1
2
3>>>x=MyClass(11,34,23,12)
>>>x[...]
[11,34,23,12]学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是301,还有056,最后是051,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。
学习是对自己最好的投资,而机会属于有准备的人,这是一个看脸的时代,但最终拼的是实力。人和人之间的差距不在于智商,而在于如何利用业余时间,所以没有等出来的辉煌,只有干出来的精彩。其实只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间,而你之所以还没有变强,只因你还不够努力,要记得付出不亚于任何人的努力。