python伪代码怎么写_代码这样写更优雅(Python版)
Python 这门语⾔最⼤的优点之⼀就是语法简洁,好的代码就像伪代码⼀样,⼲净、整洁、⼀⽬了然。但有时候我们写代码,特别是Python 初学者,往往还是按照其它语⾔的思维习惯来写,那样的写法不仅运⾏速度慢,代码读起来也费尽,给⼈⼀种拖泥带⽔的感觉,过段时间连⾃⼰也读不懂。
《计算机程序的构造和解释》的作者哈尔·阿伯尔森曾这样说:“Programs must be written for people to read, and only incidentally for machines to execute.”
要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些⼤⽜代码,Github 上有很多⾮常优秀的源代码值得阅读,⽐如:requests、flask、tornado,笔者列举⼀些常见的 Pythonic 写法,希望能给你带来⼀点启迪。
1、变量交换
python怎么读的⼤部分编程语⾔中交换两个变量的值时,不得不引⼊⼀个临时变量:
>>> a = 1
>>> b = 2
>>> tmp = a
>>> a = b
>>> b = tmp
pythonic
>>> a, b = b, a
2、循环遍历区间元素
for i in [0, 1, 2, 3, 4, 5]:
print i2
# 或者
for i in range(6):
print i2
pythonic
for i in xrange(6):
print i2
xrange 返回的是⽣成器对象,⽣成器⽐列表更加节省内存,不过需要注意的是 xrange 是 python2 中的写法,python3 只有 range ⽅法,特点和 xrange 是⼀样的。
3、带有索引位置的集合遍历
遍历集合时如果需要使⽤到集合的索引位置时,直接对集合迭代是没有索引信息的,普通的⽅式使⽤:
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print i, '--->', colors[i]
pythonic
for i, color in enumerate(colors):
print i, '--->', color
4、字符串连接
字符串连接时,普通的⽅式可以⽤ + 操作
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
s = names[0]
for name in names[1:]:
s += ', ' + name
print s
pythonic
print ', '.join(names)
join 是⼀种更加⾼效的字符串连接⽅式,使⽤ + 操作时,每执⾏⼀次+操作就会导致在内存中⽣成⼀个新的字符串对象,遍历8次有8个字符串⽣成,造成⽆谓的内存浪费。⽽⽤ join ⽅法整个过程只会产⽣⼀个字符串对象。
5、打开/关闭⽂件
执⾏⽂件操作时,最后⼀定不能忘记的操作是关闭⽂件,即使报错了也要 close。普通的⽅式是在 finnally 块中显⽰的调⽤ close ⽅法。
f = open('')
try:
data = f.read()
finally:
f.close()
pythonic
with open('') as f:
data = f.read()
使⽤ with 语句,系统会在执⾏完⽂件操作后⾃动关闭⽂件对象。
6、列表推导式
能够⽤⼀⾏代码简明扼要地解决问题时,绝不要⽤两⾏,⽐如
result = []
for i in range(10):
s = i 2
result.append(s)
pythonic
[i2 for i in xrange(10)]
与之类似的还有⽣成器表达式、字典推导式,都是很 pythonic 的写法。
7、善⽤装饰器
装饰器可以把与业务逻辑⽆关的代码抽离出来,让代码保持⼲净清爽,⽽且装饰器还能被多个地⽅重复利⽤。⽐如⼀个爬⾍⽹页的函数,如果该 URL 曾经被爬过就直接从缓存中获取,否则爬下来之后加⼊到缓存,防⽌后续重复爬取。
def web_lookup(url, saved={}):
if url in saved:
return saved[url]
page = urllib.urlopen(url).read()
saved[url] = page
return page
pythonic
import urllib #py2
#quest as urllib # py3
def cache(func):
saved = {}
def wrapper(url):
if url in saved:
return saved[url]
else:
page = func(url)
saved[url] = page
return page
return wrapper
@cache
def web_lookup(url):
return urllib.urlopen(url).read()
⽤装饰器写代码表⾯上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了,可以给更多的函数调⽤,这样总的代码量就会少很多,⽽且业务⽅法看起来简洁了。
8、合理使⽤列表
列表对象(list)是⼀个查询效率⾼于更新操作的数据结构,⽐如删除⼀个元素和插⼊⼀个元素时执⾏效率就⾮常低,因为还要对剩下的元素进⾏移动
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
names.pop(0)
names.insert(0, 'mark')
pythonic
from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')
deque 是⼀个双向队列的数据结构,删除元素和插⼊元素会很快
9、序列解包
p = 'vttalk', 'female', 30, 'python@qq'
name = p[0]
gender = p[1]
age = p[2]
email = p[3]
pythonic
name, gender, age, email = p
10、遍历字典的 key 和 value
⽅法⼀速度没那么快,因为每次迭代的时候还要重新进⾏hash查 key 对应的 value。
⽅法⼆遇到字典⾮常⼤的时候,会导致内存的消耗增加⼀倍以上
# ⽅法⼀
for k in d:
print k, '--->', d[k]
# ⽅法⼆
for k, v in d.items():
print k, '--->', v
pythonic
for k, v in d.iteritems():
print k, '--->', v
iteritems 返回迭代器对象,可节省更多的内存,不过在 python3 中没有该⽅法了,只有 items ⽅法,等值于 iteritems。
当然还有很多 pythonic 写法,在此不再⼀⼀列举,说不定有第⼆期,欢迎留⾔。觉得不错就赞⼀个吧 (^o^)/怎么样才能学好python学好python你需要⼀个良好的环境,⼀个优质的开发交流,⾥都是那种相互帮助的⼈才是可以的,我有建⽴⼀个python学习交流,在⾥我们相互帮助,相互关⼼,相
互分享内容,这样出问题帮助你的⼈就⽐较多,号是301,还有056,最后是069,这样就可以到⼤神聚合的,如果你只愿意别⼈帮助你,不愿意分享或者帮助别⼈,那就请不要加了,你把你会的告诉别⼈这是⼀种分享。
学习是对⾃⼰最好的投资,⽽机会属于有准备的⼈,这是⼀个看脸的时代,但最终拼的是实⼒。⼈和⼈之间的差距不在于智商,⽽在于如何利⽤业余时间,所以没有等出来的辉煌,只有⼲出来的精彩。其实只要你想学习,什么时候开始都不晚,不要担⼼这担⼼那,你只需努⼒,剩下的交给时间,⽽你之所以还没有变强,只因你还不够努⼒,要记得付出不亚于任何⼈的努⼒。
你的想法再精彩,那是想法的价值
⽽你的价值,永远体现在⾏动之中
如果还停留在想的价值中,请赶快⾏动,
如果你学习还停⽌在原处,请咨询我帮助你开始
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论