高效的代码,每期都会给大家介绍一下编码的技巧,让我们代码更整洁更高效。我们会从python 语言切入,讲一讲如何写的代码更pythonic 。Pythonic 风格,既不是非常严密的规范,也不是编译器强加给开发者的规则。而是大家在使用python 语言协同工作的工程中逐渐形成的习惯。Python 崇尚的就是直观,简洁而又易读的代码。
1
第1招:字符串的反转
A.提倡
def reverse_str( s ):
return s[::-1]
B.土方法
def reverse_str( s ):
t = ''
for x in xrange(len(s)-1,-1,-1):
t += s[x]
return t
小贴士
A方法采用了python 中特有的切片的方法,简单快捷,高效。而且很优雅。
扩展贴士
扩展切片语法如下:
s[begin : end : stride]
与简单切片语法相比,扩展切片只是增加了第3个参数,即步长参数(英文资料中通常称为"stride"或"step")。
扩展切片语法引入的"stride"参数是个需要特别注意的参数,因为它的正/负取值将会影响切片操作对源序列s的访问方向,而这正是本文开始那几个示例可能引起Python新手困惑的原因。
其实规则很简单,说穿不值一文钱:
1)当stride参数为正值(positive)时,表明切片操作从左至右(即正向)访问源序列s的元素,此时,若begin和end参数有缺省,则Python解释器默认将其设置为None。如s[0 : : 1]会被解释器当作s[0 : None : 1],此时,end实际取值要大于其有效索引范围的上限值,以保证切片操作能访问到源序列s从begin开始的所有元素(从左向右)。
2)当stride参数为负值(negative)时,表明切片操作从右至左(即逆向)访问源序列s的元素,此时,若begin和end参数有缺省,则Python解释器默认将其设置为None。如s[-1 : : -1]会被解释器当作s[-1 : None : -1],此时,end实际取值要小于其有效索引范围的下限值,已保证切片操作能访问到源序列s从begin开始的所有元素(逆向,从右向左)。
3)无论stride参数取正值还是负值,切片表达式的begin和end索引值需要保证在切片操作的访问方向上,从begin到end之间有元素,这样切片操作才能保证返回非空集。
2
第2招:Enumerate的使用
A.提倡
array = [1, 2, 3, 4, 5]
for i, e in enumerate(array,0):
print i, e
#0 1
#1 2
#2 3
#3 4
#4 5
B.土方法
array = [1, 2, 3, 4, 5]
for i in xrange(len(array)):
print i, array[i]
#0 1
#1 2
#2 3
#3 4
#4 5
#{'Age': 23, 'Name': 'Tim', 'Sex': 'Male'}
小贴士
使用enumerate可以一次性将索引和值取出,避免使用索引来取值,而且
enumerate的第二个参数可以调整索引下标的起始位置,默认为0。
扩展贴士
enumerate()是python的内置函数
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串)
enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
例如对于一个seq,得到:
(, seq[0]), (1, seq[1]), (2, seq[2])
3
第3招:使用zip创建键值对
A.提倡
keys = ['Name', 'Sex', 'Age']
values = ['Tim', 'Male', 23]
dic = dict(zip(keys, values))
#{'Age': 23, 'Name': 'Tim', 'Sex': 'Male'}
B.土方法
keys = ['Name', 'Sex', 'Age']
values = ['Tim', 'Male', 23]
dic = {}
for i,e in enumerate(keys):
dic[e] = values[i]
#{'Age': 23, 'Name': 'Tim', 'Sex': 'Male'}
小贴士
zip方法返回的是一个元组,用它来创建键值对,简单明了。
扩展贴士
zip()函数是Python的内建函数,(与序列有关的内建函数有:sorted()
reversed()、enumerate()、zip()),其中sorted()和zip()返回一个序列
(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)
zip()参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入
参数的长度不同时,zip能自动以最短序列长度为准进行截取,获得元组
领取专属 10元无门槛券
私享最新 技术干货