摘要:最终还是要写上足够量的代码,才会有悟道的那一刻。另外,对于代码本身,有一套书写规范,叫做。
Python 里有个小彩蛋:
在 Python Shell 里输入 import this
这段话被称作“ Python 之禅 ”( The Zen of Python ),它列举了一些 Python 所推崇的理念,比如:
优美 胜于丑陋
明确 胜于隐晦
简单 胜于复杂
…
可读性 很重要
不要忽略 错误
面对不确定时, 拒绝猜测
现在做 好过不做,但盲目动手不如不做
如果你的实现很难说清楚,那是个坏想法;反之亦然
…
当你学完基础,可以写点代码的时候,可能经常感觉自己的实现很别扭。有经验的程序员会一眼看出你的代码出自一个初学者之手。这就是我们经常说的,代码不够 pythonic 。
所谓 pythonic,我觉得包含两方面:一是代码的风格 符合 Python 的特点 ,能合理使用 Python 的“语法糖”;二是代码 简洁优美,稳定性高,可读性好,便于维护和修改 。所谓“Python 之禅”并不仅限于 Python,很多理念是编程普适的。
比如来实现对一个列表中元素的遍历访问,我见过很多次有人这么写:
for i in range(len(lst)): print(lst[i])
这样的同学很可能是之前有过 C/C++ 或 Java 的经验。这么写功能上没问题,但不够简洁,不够 pythonic。更好的实现方式:
for i in lst: print(i)
这种不影响功能,但能简化程序、提高可读性的语法,我们称之为“ 语法糖 ”( Syntactic sugar )。Python 中类似的例子还有不少,来举几个:
1、交换两个变量的值,普通写法:
temp = a a = b b = temp
pythonic 写法:
a, b = b, a
2、类似的解包(unpacking)用法还可以实现多个返回值的函数。普通写法:
def func(a, b): result = [b, a] return result r = func(a, b) x = r[0] y = r[1]
pythonic 写法:
def func(a, b): return b, a x, y = func(a, b)
3、读写文件,普通写法:
f = open("filename.txt") text = f.read() print(text) f.close()
pythonic 写法:
with open("filename.txt") as f: for line in f: print(line)
with 的好处是即使出错,也会帮你关闭文件。
4、拼接字符串,普通写法:
letters = ["h", "e", "l", "l", "o"] s = "" for l in letters: s += l print(s)
pythonic 写法:
print("".join(letters))
5、关于前面遍历列表的例子,如果你想带上索引,可以这么写:
for i, elem in enumerate(lst): print(i, elem)
遍历字典项:
for key, value in dct.items(): print(key, value)
6、取出列表中大于 0 的元素,生成新列表。普通写法:
new_lst = [] for i in lst: if i > 0: new_lst.append(i)
pythonic 写法:
new_lst = [i for i in lst if i > 0]
这个被称为“ 列表解析式 ”( List comprehension ,中文翻译说法有很多),可以说是非常 pythonic 的一个用法了。
更进一步,如果数据量很大,而你对新列表仅仅是遍历操作,并不需要一个列表对象,可以采用 生成器 :
new_lst = (i for i in lst if i > 0) for i in new_lst: print(i)
这样会更节省资源,提升执行效率。
7、判断一个值是否为True、是否为空列表、是否是None,普通写法:
if x == True: pass if len(y) == 0: pass if z == None: pass
pythonic 写法:
if x: pass if not y: pass if z is None: pass
8、根据键名获取字典中对应的值,普通写法:
value = dct[key]
这样的问题在于,如果 key 不存在,代码就报错跳出。于是你不得不增加更多的判断。
pythonic 写法:
value = dct.get(key, 0)
改用 get 方法,不存在时会得到 None,或者指定的默认值(这里是 0)。
篇幅所限,以上仅仅是一些比较具有代表性的例子。但凡事要有度,过分追求 pythonic 的写法也可能导致代码的可读性下降。比如有人喜欢把很多功能写在一个语句中,这反倒不 pythonic 了。所以,我们需要有一些设计的原则,但又不必拘泥于具体的形式,否则就钻入牛角尖了。
那么对于学习者来说,如何才能写出更 pythonic 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。我这边给几个建议:
多看 。看官方库、优秀项目,学习别人的代码。以及看一些优质的教程和经验分享,比如 Crossin的编程教室
多搜 。当你实现一个小功能后,去网上搜一下,别人是怎么写的,对比下是不是比你自己的更好。举个例子:如何从列表中删除重复元素。你自己可以通过循环实现,但只要搜一下,就会知道 list(set(x)) 这种用法。
多写 。自己还没写几行代码,就先别纠结什么效率什么风格了。最终还是要写上足够量的代码,才会有“悟道”的那一刻。
另外,对于代码本身,Python 有一套书写规范,叫做 PEP8 。里面约定了很多细节,比如哪里该空格、注释怎么写、什么地方该换行、如何命名等等。链接:https://www.python.org/dev/peps/pep-0008/,网上还有翻译好的中文版,务必找时间看一看。
最后,留2个小作业:
1. 判断 一个列表 A 是否为另一个列表 B 的“子集” ,也就是列表 A 中的元素是否都在列表 B 中。
2. 计算 1 加到 100 的和 。
尽可能写出你认为 pythonic 的代码。
════
其他文章及回答:
学编程:如何自学Python | 新手引导 | 一图学Python
开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球
欢迎搜索及关注: Crossin的编程教室
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43288.html
摘要:当你使用的活动监视器你会发现,实际的进程数为菜鸟是因为线程池的原因吗老鸟不错嘛,还知道线程池呢但非也非也。菜鸟竟然不是线程池老鸟你忽视了集成了引擎。启动后会创建实例,而实例是多线程的。 老鸟:伸着懒腰,看着窗外明媚的阳光,喝一口清茶,心情大美。一天的好心情莫过于此。老鸟:菜鸟,你这消失了大半个月,忙什么呢?菜鸟:听说node最近很火,这不趁着年轻,多储存点知识储备呢!老鸟:那你说说你对...
摘要:此时这个通讯地址就是,若干年后,小明可能已经搬家了,无论小明的家庭搬去了任何地方,但是这个地址不会变,你仍然可以去八阿哥路号,但是你却找不到小明了。同时身份证不会发生变化,通过身份证我们唯一确认小明,这就是统一资源标识符。 2019年6月15日,菜鸟坐在电脑桌前,喝着咖啡,唱着歌,心情大美。写了一个博客《程序员的前世与今生》。正巧,大鸟从他身边路过,猫了一眼,觉得不错,就跟菜鸟说:菜鸟...
文章目录 强烈推荐系列教程,建议学起来!! 一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置 4.2手动添加镜像源4.3永久配置镜像源 五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件 六.美女背景七.自定义脚本开头八、这个前言一定要看九、pyt...
摘要:如果我们有需要安装的话可以选择直接小程序搜索小基助手进行安装。第二小基助手推荐优势老蒋个人觉得这款基金管理软件还是不错的。我们日常管理自己理财投资的基金是用什么软件呢?直接在银行、券商平台或者支付宝直接买入后每天看看收益即可,基本上不做分析和对比,大部分是根据别人说不错,然后就去选择。包括在后续如果有波动的时候我们跟库自己的理性、非理性、智慧选择减仓、定投或者抛售。 实际上如果我们需要...
阅读 2114·2021-09-27 14:04
阅读 1859·2019-08-30 15:55
阅读 1682·2019-08-30 13:13
阅读 1052·2019-08-30 13:07
阅读 2729·2019-08-29 15:20
阅读 3175·2019-08-29 12:42
阅读 3272·2019-08-28 17:58
阅读 3573·2019-08-28 17:56