Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。
要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些大牛代码,Github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,这里小明收集了一些常见的 Pythonic 写法,帮助你养成写优秀代码的习惯。
01. 变量交换
Bad
tmp = a a = b b = tmp
Pythonic
a,b = b,a
02. 列表推导
Bad
my_list = [] for i in range(10): my_list.append(i*2)
Pythonic
my_list = [i*2 for i in range(10)]
03. 单行表达式
虽然列表推导式由于其简洁性及表达性,被广受推崇。
但是有许多可以写成单行的表达式,并不是好的做法。
Bad
print 'one'; print 'two' if x == 1: print 'one' if <complex comparison> and <other complex comparison>: # do something
Pythonic
print 'one' print 'two' if x == 1: print 'one' cond1 = <complex comparison> cond2 = <other complex comparison> if cond1 and cond2: # do something
04. 带索引遍历
Bad
for i in range(len(my_list)): print(i, "-->", my_list[i])
Pythonic
for i,item in enumerate(my_list): print(i, "-->",item)
05. 序列解包
Pythonic
a, *rest = [1, 2, 3] # a = 1, rest = [2, 3] a, *middle, c = [1, 2, 3, 4] # a = 1, middle = [2, 3], c = 4
06. 字符串拼接
Bad
letters = ['s', 'p', 'a', 'm'] s="" for let in letters: s += let
Pythonic
letters = ['s', 'p', 'a', 'm'] word = ''.join(letters)
07. 真假判断
Bad
if attr == True: print 'True!' if attr == None: print 'attr is None!'
Pythonic
if attr: print 'attr is truthy!' if not attr: print 'attr is falsey!' if attr is None: print 'attr is None!'
08. 访问字典元素
Bad
d = {'hello': 'world'} if d.has_key('hello'): print d['hello'] # prints 'world' else: print 'default_value'
Pythonic
d = {'hello': 'world'} print d.get('hello', 'default_value') # prints 'world' print d.get('thingy', 'default_value') # prints 'default_value' # Or: if 'hello' in d: print d['hello']
09. 操作列表
Bad
a = [3, 4, 5] b = [] for i in a: if i > 4: b.append(i)
Pythonic
a = [3, 4, 5] b = [i for i in a if i > 4] # Or: b = filter(lambda x: x > 4, a)
Bad
a = [3, 4, 5] for i in range(len(a)): a[i] += 3
Pythonic
a = [3, 4, 5] a = [i + 3 for i in a] # Or: a = map(lambda i: i + 3, a)
10. 文件读取
Bad
f = open('file.txt') a = f.read() print a f.close()
Pythonic
with open('file.txt') as f: for line in f: print line
11. 代码续行
Bad
my_very_big_string = """For a long time I used to go to bed early. Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say “I'm going to sleep.”""" from some.deep.module.inside.a.module import a_nice_function, another_nice_function, yet_another_nice_function
Pythonic
my_very_big_string = ( "For a long time I used to go to bed early. Sometimes, " "when I had put out my candle, my eyes would close so quickly " "that I had not even time to say “I'm going to sleep.”" ) from some.deep.module.inside.a.module import ( a_nice_function, another_nice_function, yet_another_nice_function)
12. 显式代码
Bad
def make_complex(*args): x, y = args return dict(**locals())
Pythonic
def make_complex(x, y): return {'x': x, 'y': y}
13. 使用占位符
Pythonic
filename = 'foobar.txt' basename, _, ext = filename.rpartition('.')
14. 链式比较
Bad
if age > 18 and age < 60: print("young man")
Pythonic
if 18 < age < 60: print("young man")
理解了链式比较操作,那么你应该知道为什么下面这行代码输出的结果是 False
> False == False == True False
15. 三目运算
这个保留意见。随使用习惯就好。
Bad
if a > 2: b = 2 else: b = 1 #b = 2
Pythonic
a = 3 b = 2 if a > 2 else 1 #b = 2
参考文档
http://docs.python-guide.org/en/latest/writing/style/
https://foofish.net/idiomatic_part2.html
Pythonic
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】