编写高效简洁代码的那些招式1

高效的代码,每期都会给大家介绍一下编码的技巧,让我们代码更整洁更高效。我们会从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能自动以最短序列长度为准进行截取,获得元组

本文来自企鹅号 - 高效的代码媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知识分享

结构体

数据结构  最慢一星期一章   2015.10.5   一       20:33     首先  我还不知道的一些基础知识 结构体定义并不是定义一个变量,而是...

2746
来自专栏菜鸟前端工程师

JavaScript学习笔记016-字符串方法0数组方法0值类型与引用型

602
来自专栏陈纪庚

javascript变量提升详解

对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解。所以在此,我想来讲一讲。

802
来自专栏全栈架构

抱歉!不要用Java的语法思维来写Kotlin

如果你是像我一样是一名 优秀的Java开发者 ^_^,而且已经想用kotlin来实现你的程序,那么,抱歉!不要用Java的语法思维来写Kotlin,不要让kot...

874
来自专栏LinkedBear的个人空间

唠唠SE的面向对象-01——对象 原

每个对象都有自己独特的状态标识和行为对象的属性(attribute),或者状态(state)。

602
来自专栏自动化测试实战

RF-断言函数

3426
来自专栏Python小屋

详解Python字符串编码格式

最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进...

2426
来自专栏前端正义联盟

我来重新学习 javascript 的面向对象(part 5)

这是最后的最后了,我会顺便总结一下各种继承方式的学习和理解。(老板要求什么的,管他呢)

721
来自专栏小白的技术客栈

Python内置数据结构之字典

今天给大家讲解Python内置数据结构:字典。字典的内容比较多,今天只是简单地介绍一下,明天会继续补充字典相关的内容。 关于Windows的环境安装及配置,小白...

2874
来自专栏诸葛青云的专栏

简述在C语言中, “字符”与“字符串”之间的区别

在C语言中,“字符”与“字符串”之间,是有区别的。这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别。

953

扫码关注云+社区