社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

脚本之家 • 1 月前 • 137 次点击  
将 脚本之家 设为“星标⭐”
第一时间收到文章更新
图片

来源 | Crossin的编程教室(ID:crossincode)

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 = 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. 多看。看官方库、优秀项目,学习别人的代码。以及看一些优质的教程和经验分享,比如 Crossin的编程教室

  2. 多搜。当你实现一个小功能后,去网上搜一下,别人是怎么写的,对比下是不是比你自己的更好。举个例子:如何从列表中删除重复元素。你自己可以通过循环实现,但只要搜一下,就会知道 list(set(x)) 这种用法。

  3. 多写。自己还没写几行代码,就先别纠结什么效率什么风格了。最终还是要写上足够量的代码,才会有“悟道”的那一刻。

另外,对于代码本身,Python 有一套书写规范,叫做 PEP8。里面约定了很多细节,比如哪里该空格、注释怎么写、什么地方该换行、如何命名等等。网上搜一下就能找到,还有中文版,务必找时间看一看。

最后,留2个小作业:

  1. 判断一个列表 A 是否为另一个列表 B 的“子集”,也就是列表 A 中的元素是否都在列表 B 中。

  2. 计算 1 加到 100 的和。

试试看能不能写出你认为 pythonic 的代码,欢迎在留言中分享。

图片
  推荐阅读:
  1. AI 正在制造 App 过剩时代
  2. 大厂员工吐槽现在开会就是互丢AI文档,ai做的PPT,演讲者用ai写词,听众用ai记录会议纪要,然后用ai给领导写汇报,领导再用ai阅读。
  3. 把大脑外包给AI之后,人类正在集体变笨。
  4. 曾是一代人身份象征的5个手机品牌,现在只剩情怀
  5. 广电出手:折腾20多年的电视机顶盒,终于要被“淘汰”了

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/201720