Python 里有个小彩蛋:

在 Python Shell 里输入 import this

这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:

优美胜于丑陋

明确胜于隐晦

简单胜于复杂

可读性很重要

不要忽略错误

面对不确定时,拒绝猜测

现在做好过不做,但盲目动手不如不做

如果你的实现很难说清楚,那是个坏想法;反之亦然

当你学完基础,可以写点代码的时候,可能经常感觉自己的实现很别扭。有经验的程序员会一眼看出你的代码出自一个初学者之手。这就是我们经常说的,代码不够 pythonic。

所谓 pythonic,我觉得包含两方面:一是代码的风格符合 Python 的特点,能合理使用 Python 的“语法糖”;二是代码简洁优美,稳定性高,可读性好,便于维护和修改。所谓“Python 之禅”并不仅限于 Python,很多理念是编程普适的。

比如来实现对一个列表中元素的遍历访问,我见过很多次有人这么写:

foriinrange(len(lst)):    print(lst[i])

这样的同学很可能是之前有过 C/C++ 或 Java 的经验。这么写功能上没问题,但不够简洁,不够 pythonic。更好的实现方式:

foriinlst:    print(i)

这种不影响功能,但能简化程序、提高可读性的语法,我们称之为“语法糖”(Syntactic sugar)。Python 中类似的例子还有不少,来举几个:

1、交换两个变量的值,普通写法:

temp = aa = bb = temp

pythonic 写法:

a, b = b, a

2、类似的解包(unpacking)用法还可以实现多个返回值的函数。普通写法:

deffunc(a, b):result = [b, a]

returnresultr = func(a, b)x = r[0]y = r[1]

pythonic 写法:

deffunc(a, b):returnb, ax, y = func(a, b)

3、读写文件,普通写法:

f = open('filename.txt')text = f.read()print(text)f.close()

pythonic 写法:

withopen('filename.txt')asf:

forlineinf:        print(line)

with 的好处是即使出错,也会帮你关闭文件。

4、拼接字符串,普通写法:

letters = ['h', 'e', 'l', 'l', 'o']s = ''for l in letters:    s += lprint(s)

pythonic 写法:

print(''.join(letters))

5、关于前面遍历列表的例子,如果你想带上索引,可以这么写:

fori, eleminenumerate(lst):    print(i, elem)

遍历字典项:

forkey, valueindct.items():    print(key, value)

6、取出列表中大于 0 的元素,生成新列表。普通写法:

new_lst = []

foriinlst:

ifi >0:        new_lst.append(i)

pythonic 写法:

new_lst = [iforiinlstifi >0]

这个被称为“列表解析式”(List comprehension,中文翻译说法有很多),可以说是非常 pythonic 的一个用法了。

更进一步,如果数据量很大,而你对新列表仅仅是遍历操作,并不需要一个列表对象,可以采用生成器:

new_lst = (iforiinlstifi >0)

foriinnew_lst:    print(i)

这样会更节省资源,提升执行效率。

7、判断一个值是否为True、是否为空列表、是否是None,普通写法:

pythonic 写法:

8、根据键名获取字典中对应的值,普通写法:

value = dct[key]

这样的问题在于,如果 key 不存在,代码就报错跳出。于是你不得不增加更多的判断。

pythonic 写法:

value = dct.get(key,0)

改用 get 方法,不存在时会得到 None,或者指定的默认值(这里是 0)。

篇幅所限,以上仅仅是一些比较具有代表性的例子。但凡事要有度,过分追求 pythonic 的写法也可能导致代码的可读性下降。比如有人喜欢把很多功能写在一个语句中,这反倒不 pythonic 了。所以,我们需要有一些设计的原则,但又不必拘泥于具体的形式,否则就钻入牛角尖了。

那么对于学习者来说,如何才能写出更 pythonic 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。

转载于:https://blog.51cto.com/14246112/2382255

对比几段代码,看看你是 Python 菜鸟还是老鸟相关推荐

  1. python星空画法教程_对比几段代码,看看你是 Python 菜鸟还是老鸟

    Python 里有个小彩蛋: 在 Python Shell 里输入 import this 这段话被称作"Python 之禅"(The Zen of Python),它列举了一些 ...

  2. python 列表为空报错_对比几段代码,看看你是 Python 菜鸟还是老鸟

    Python 里有个小彩蛋: 在 Python Shell 里输入 import this 这段话被称作"Python 之禅"(The Zen of Python),它列举了一些 ...

  3. 来看几段代码,测测你是 Python 菜鸟还是老鸟

    零基础python入门教程:python666.cn 大家好,欢迎来到 Crossin的编程教室 ! Python 里有个小彩蛋: 在 Python Shell 里输入 import this 这段话 ...

  4. 6个实例,8段代码,详解Python中的for循环

    作者:奥斯瓦尔德·坎佩萨托(Oswald Campesato) 来源:大数据DT(ID:hzdashuju) Python 支持for循环,它的语法与其他语言(如JavaScript 或Java)稍有 ...

  5. 用6个实例,8段代码,详解Python中的for循环

    目录 前言 01 使用tryexcept的for循环 02 指数运算 03 嵌套的循环 04 在for循环中使用split()函数 1. 使用split()函数做单词比较 2. 使用split()函数 ...

  6. 如何用pycharm对比两段代码(或两个文件的代码)

    右键文件,点击Compare With 选择要对比的文件,点击ok 然后就可以愉快地玩耍啦♪(∇*) 参考文章:pycharm的强大之处之两个文件代码的比对

  7. 《一段代码告诉你,Python的正则表达式怎么用》

    嗨喽,小伙伴们大家早上好,中午好,晚上好呀, 又有好久没更新了,今天给大家分享一下python的正则表达式. 众所周知,python的正则表达式这类的工具类知识经常不用的话,容易忘记,所以我把它放在了 ...

  8. 读一篇博客,写一段代码,每天写写Python自然就会了,每日Python第1天

    这个系列的专栏是为了保持 Python 手感而创建的,你也可以用来学习 Python,因为存在知识跨越难度,所以先学习滚雪球系列为佳. 每天学一点,所以本系列专栏,每篇不超过 3000 字(含代码) ...

  9. 干货 | 收藏!16段代码入门Python循环语句

    (图片付费下载于视觉中国) 作者 | 李明江 张良均 周东平 张尚佳,本文摘编自<Python3智能数据分析快速入门> 来源 | 大数据(ID:hzdashuju) [导读]本文将重点讲述 ...

最新文章

  1. 使用RawSocket进行网络抓包
  2. row间距 table 某一行_UITableview的一个section下的各行Row之间可以设置间隔一段距离吗?...
  3. mysql停电后无法启动不了_急求mysql 断电后无法启动解决方法!!!!
  4. 手机号验证_谷歌修改密码时遇到手机号验证的解决办法
  5. java ipv6校验_JS及java验证 IPV6,IPV4地址的 正则表达式 | 学步园
  6. drupal显示图片_Drupal在多样性和包容性方面显示领导力
  7. python怎样查看describe的结果_Python学习第126课--pandas拿到数据后的总体描述
  8. php表示昨天_php获取今天、昨天、明天的日期
  9. 四川大学计算机学院保研规定,2020四川大学计算机学院保研夏令营通知
  10. Google 开源项目风格指南学习笔记——C++篇
  11. gre模考软件java.exe_【模考】GRE模考软件逆天版(考G神器)
  12. Xmind激活版双击文件无法打开的解决方案
  13. 微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单
  14. 《30天自制操作系统》---第一天
  15. 湘鄂情欲加码大数据 若定增失败将变卖资产
  16. THREE.js模型贴图不显示
  17. 前端资源(框架,库,网站)
  18. shell中set 指令的使用
  19. 区块链+保险:众安在线养鸡,人寿精准扶贫
  20. :UG模块功能介绍::

热门文章

  1. Flask + Vue.js : Fullstack Development
  2. Linux常用命令大全(持续更新)
  3. 蓝桥杯 ALGO-63 算法训练 乘法表
  4. 蓝桥杯 ALGO-58 算法训练 字串逆序
  5. 0基础web开发 python_真零基础Python开发web
  6. request.getInputStream中文乱码解决方案
  7. Centos-redis安装配置
  8. 《重构-改善既有代码的设计》——读后总结
  9. SYNCHRONIZE_DRAIN
  10. linux查看java jdk安装路径