这几段代码,测测你是 Python 菜鸟还是老司机

这段话被称作“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 = aa = bb = temp

pythonic 写法:

a, b = b, a

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

def func(a, b): result = [b, a] return resultr = func(a, b)x = r[0]y = r[1]

pythonic 写法:

def func(a, b): return b, ax, 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 += lprint(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: passif len(y) == 0: passif z == None: pass

pythonic 写法:

if x: passif not y: passif z is None: pass

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

value = dct[key]

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

pythonic 写法:

value = dct.get(key, 0)

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

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

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

  1. 多看。看官方库、优秀项目,学习别人的代码。以及看一些优质的教程和经验分享,
  2. 多搜。当你实现一个小功能后,去网上搜一下,别人是怎么写的,对比下是不是比你自己的更好。举个例子:如何从列表中删除重复元素。你自己可以通过循环实现,但只要搜一下,就会知道 list(set(x)) 这种用法。
  3. 多写。自己还没写几行代码,就先别纠结什么效率什么风格了。最终还是要写上足够量的代码,才会有“悟道”的那一刻。

你是Python新手还是老司机呢?留言一波?

原文地址:https://www.cnblogs.com/cherry-tang/p/11170911.html

时间: 2024-08-01 04:48:08

这几段代码,测测你是 Python 菜鸟还是老司机的相关文章

Jenkins+maven+git+sonar 系统持续集成&代码单测管理

Jenkins+maven+git+sonar 系统持续集成&代码单测管理 Jenkins的安装 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 1.下载最新的版本(一个 war 文件).Jenkins官方网址: http://Jenkins-ci.org/ 2.运行 java -jar jenkins.war(jenkins默认使用的是内嵌的jetty服务,用户也可以布置到其它容器中.)

当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的

英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说“这段代码不言自明”?你的同事的这句话的实际意思是这段代码不需要写注释. 你也许注意到了,很多时候,程序员所说的话的字面意思和其真实的意思是完全不同的.不用惊异,下面你将很快知道这些暧昧的短语和其深层次的意思都是什么. 最近 Imgur 上出现了一张图片,里面列举的程序员的一些专业术语和其含义,它能很好的帮助你理解这些话的真实意思.这里是对其中的精华进行的总结. 典型的程序员之间的对话 当

有趣的Js Quiz,测测你的Core Js内功

最近看国外同行的技术博客, 看到一篇有关"javascript小测试"的博文, 很有意思, 其中每个题目短小精悍, 却能很好的考察对 Core Javascript的掌握深度.如果你感兴趣,可以点击JavaScript Quiz查看原文, 为了做个记录, 我准备在下文罗列出这些题目, 并给出解释, 如果有解释不到位的地方, 欢迎园友指出. 首先有几个要注意的地方: 以下题目采用ECMA3标准(不是5) quirks模式的实现不予考虑 每个代码片段的running context都是gl

viewpager 自动无限循环 这段代码移到你的程序中就可以用了

本程序需要懂得viewpager的基础知识,也就是说你能够自己写出一个手动滑动的viewpager,下面我将附带加小圆点的知识 那么我们回顾一下图片轮转的基础知识,如果你已经对viewpager很熟悉了就不用看了,浪费时间 1.viewpager是在v4兼容报里面的,使用控件时请带上报名 2.数据来源用list存放,我这里用的是textview做的小圆点list<textview>,layout做的单张幻灯片list<view>,将xml文件inflate成为view,View.i

iOS测试一段代码的运行时间

王刚韧 23:19:26测试一段代码的运行时间 测试一段代码运行花了多久: NSDate* tmpStartData = [NSDate date] ;<#代码#> double deltaTime = [[NSDate date] timeIntervalSinceDate:tmpStartData]; NSLog(@"------cost time = %f ms(毫秒)", deltaTime*1000);

看到一段代码不明白什么意思

from warnings import filterwarnings, catch_warnings with catch_warnings():     if sys.py3kwarning:         filterwarnings("ignore", ".*mimetools has been removed",                         DeprecationWarning)     import mimetools import

从一段代码看fork()函数及其引发的竞争

首先来看一段从<UNIX环境高级编程>中摘录的一段非常有意思的代码.借此我们再来谈谈fork()函数的一些问题. #include "apue.h" static void charatatime(char*); int main(void) { pid_t pid; if((pid=fork())<0){ err_sys("fork error"); }else if(pid==0){ charatatime("output from

测测你的FQ(理财智商)

1.经常制定家庭财务计划,填制家庭资产负债表,了解自己的资产负债情况,分析每月现金流情况. 2.对自己每月的支出进行预算,一定额度以上的支出作好记录,并保存行用卡消费记录,计算每月的实际花费并检查与计划是否相符,若出现较大偏差及时分析其原因. 3.储备最少相当于六个月的生活费的现金,以备不时之需. 4.准备足够的保障金,若有不幸发生,家庭有足够的能力支付现有的开支和费用. 5.每做一项投资时,完全清楚投资项目的性质一以及风险大小. 6.投资于股票市场或外汇时,每项投资均这止于损价位,并且会严格准

将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /> 将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可,布布扣,bubuko.com