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

相关文章

来自专栏互联网技术杂谈

快速熟悉Java

参考著名的python快速入门(Quick Python Script Explanation for Programmers):https://mp.weix...

2149
来自专栏博客园

MSIL学习------从HelloWorld开始

  前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作...

843
来自专栏C/C++基础

C++编码格式建议

每个人都可能有自己的代码风格和格式,但如果一个项目中的所有人都遵循同一风格的话,这个项目就能更顺利地进行。每个人未必能同意下述的每一处格式规则,而且其中的不少规...

562
来自专栏光变

你所不知道的Java之HashCode

以下内容为作者辛苦原创,版权归作者所有,如转载演绎请在“光变”微信公众号留言申请,转载文章请在开始处显著标明出处。

1190
来自专栏Linyb极客之路

编码习惯之接口定义

工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口。接口定义一定程度上能反应程序员的编程功底。列举一下工作中我发现大家容易出现的问题:

893
来自专栏极客猴

几个 Python 编程小技巧

我们在爬取网站是,会经常抓取网页文本,但是打印文本会出现是一堆乱码。这是为什么呢?原因是 Python 中字符对象分为两种,一种是 Unicode 对象,另一种...

532
来自专栏恰同学骚年

《C#图解教程》读书笔记之二:存储、类型和变量

  (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声明;

623
来自专栏北京马哥教育

鲜为人知的 Python 语法

所有人(好吧,不是所有人)都知道 python 是一门用途广泛、易读、而且容易入门的编程语言。

681
来自专栏数据科学与人工智能

【Python环境】Python面试题汇总(一)

拿网络上关于Python的面试题汇总了,给出了自认为合理的答案,有些题目不错,可以从中学到点什么,答案如不妥,请指正...... +++++++++++++++...

2246
来自专栏Python小屋

暴力测试也疯狂——论Python代码优化

问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式。 对于该问题,前天推送了一个暴力测试的代...

3234

扫码关注云+社区