编写高效简洁代码的那些招式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 条评论
登录 后参与评论

相关文章

来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

6326
来自专栏余生开发

echarts太阳分布图-饼图来回穿梭

var dom = document.getElementById("container");

1392
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

2608
来自专栏Hadoop数据仓库

Oracle sqlldr 如何导入一个日期列

1. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY X'9' TRAILING NULLCO...

1866
来自专栏码匠的流水账

聊聊HystrixThreadPool

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java

921
来自专栏WOLFRAM

向日葵中的数学之美

1923
来自专栏linux驱动个人学习

高通msm8909耳机调试

1、DTS相应修改: DTS相关代码:kernel/arch/arm/boot/dts/qcom/msm8909-qrd-skuc.dtsi: 1 s...

8025
来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

2339
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1172
来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

471

扫码关注云+社区