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 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。我这边给几个建议:

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

另外,对于代码本身,Python 有一套书写规范,叫做 PEP8。里面约定了很多细节,比如哪里该空格、注释怎么写、什么地方该换行、如何命名等等。链接:https://www.python.org/dev/peps/pep-0008/,网上还有翻译好的中文版,务必找时间看一看。

最后,留2个小作业:

1. 判断一个列表 A 是否为另一个列表 B 的“子集”,也就是列表 A 中的元素是否都在列表 B 中。
2. 计算 1 加到 100 的和
尽可能写出你认为 pythonic 的代码。

════

其他文章及回答:

学编程:如何自学Python | 新手引导 | 一图学Python

开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球

欢迎搜索及关注:Crossin的编程教室

python星空画法教程_对比几段代码,看看你是 Python 菜鸟还是老鸟相关推荐

  1. python星空画法教程_动漫星空怎么画?一步步教你星空画法教程!零基础一看就会!...

    动漫星空怎么画?星空怎么画简单?星空怎么画好看?不会画画怎么自学?想必这些都是绘画初学者们经常在想的问题吧,就是不知道如何才能学习好绘画,然后绘画出自己想要画的东西 那么今天灵猫课堂就在网络上收集整理 ...

  2. python星空画法教程_教程 | 美轮美奂的星空画法

    很多小伙伴看到星空都会"哇,好漂亮哦~" 满满的文艺范有没有? 让我们来看一下 星空到底怎么画吧,每个人都可以画出来哦~ 首先,我们先参考几张星空的照片,观察一下,夜晚的天空是什么 ...

  3. python星空画法教程_零基础也能画好的星空教程|利用午休时间画出你的星辰大海...

    图片发自简书App 图片发自简书App 今天的上海在下雨.办公室的落地窗外,天色很暗,狂风吹得树木乱舞,大雨猛烈地打在窗户上,风和雨发出恐怖的叫声,路上满是狼狈的行人与车辆.室外的风雨交加与室内的安静 ...

  4. python星空画法教程_插画分享|零基础也能画好的星空和夕阳教程继续系列

    图片发自简书App 上次分享了篇关于零基础也能画好的水彩星空教程,没想到受到这么多朋友喜欢.嗯,内心浪漫喜欢美的事物的人还是很多的呀- 图片发自简书App 这是周六晚速涂的又一张星空.桌子旁边的风扇在 ...

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

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

  6. python编译器入门教程_一篇让你直接入门的 Python 教程

    目录(1)Python是什么?Python属性 (2)获取Python-一个Prelim选择Python版本 (3)如何获得Python? (4)确认Python安装PythonShell (5)语言 ...

  7. python星空画法教程,PS后期打造一张惊艳的星空风景照片后期调色教程

    效果图: 原片略有欠曝,因为城市灯光实在太亮,所以不敢拍得太亮. 接下来,我们就进入后期冲印过程吧! 后期思考 我们将通过后期手段,对照片进行调整.提升.强化,以获得当时作者在现场所看到的一切美丽的东 ...

  8. python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...

    手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...

  9. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

最新文章

  1. 技术分享连载(六十九)
  2. Metasploit运行环境内存不要低于2GB
  3. ARM嵌入式系统malloc的实现(C源码)
  4. P2658 汽车拉力比赛
  5. windowsSDK加速键实例分析
  6. android+usb转串口+唯一id,Android平台3G模块驱动移植-USB转串口
  7. VB更改任何标题程序源代码
  8. echarts y轴只显示5个刻度_ECharts 解决双Y轴刻度不一致问题
  9. 本博文记录需要解决的问题
  10. LINUX右键打开方式,如何同时存在多种应用?
  11. Kafka从上手到实践 - Kafka CLI:Consumer CLI Producer CLI | 凌云时刻
  12. Mybatis 插入与批量插入以及多参数批量删除
  13. 常见显示器PPI备忘
  14. el-select 默认选中第一个,ElementUI 下拉框
  15. 【Python机器学习】梯度下降法(一) | 优矿(uqer.io)
  16. 集大计算机与科学的研究生,明天,我是研究生丨感谢集大,我遇见了更好的自己...
  17. 小程序源码:全新动态视频壁纸-多玩法安装简单
  18. 基于PaddleX的化妆品识别
  19. 智能合约逆向心法2(案例篇)——34C3_CTF题目分析续篇
  20. 创新PC应用、打通云端体验,360小程序引发SaaS软件变革

热门文章

  1. Materials about design pattern
  2. C#中控件如何设置透明色
  3. 使用函数指针实现父类函数调用子类函数的两种方式
  4. 理解图像傅里叶变换的频谱图
  5. MPAndroidChart LineChart 折线图 你要的都在这里了
  6. c#中如何实现拷贝对象
  7. 浅析C#中foreach引用变量
  8. .NET的Snk使用方法
  9. .net 怎么使用github_如何正确的使用ncnn的Extractor
  10. 表单校验方式(手机号,固定电话,邮箱,营业执照,银行卡号)