python 列表为空报错_对比几段代码,看看你是 Python 菜鸟还是老鸟
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 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。我这边给几个建议:
- 多看。看官方库、优秀项目,学习别人的代码。以及看一些优质的教程和经验分享,比如 Crossin的编程教室多搜。当你实现一个小功能后,去网上搜一下,别人是怎么写的,对比下是不是比你自己的更好。举个例子:如何从列表中删除重复元素。你自己可以通过循环实现,但只要搜一下,就会知道 list(set(x)) 这种用法。多写。自己还没写几行代码,就先别纠结什么效率什么风格了。最终还是要写上足够量的代码,才会有“悟道”的那一刻。
另外,对于代码本身,Python 有一套书写规范,叫做 PEP8。里面约定了很多细节,比如哪里该空格、注释怎么写、什么地方该换行、如何命名等等。链接:https://www.python.org/dev/peps/pep-0008/,网上还有翻译好的中文版,务必找时间看一看。
最后,留2个小作业:
1. 判断一个列表 A 是否为另一个列表 B 的“子集”,也就是列表 A 中的元素是否都在列表 B 中。
2. 计算 1 加到 100 的和。
尽可能写出你认为 pythonic 的代码。
来源:Crossin的编程教室
python 列表为空报错_对比几段代码,看看你是 Python 菜鸟还是老鸟相关推荐
- python import request 不报错_爬虫学习路径整理及安装环境遇到的坑
学习路径是我自己提炼和精选的,只适合我个人,因为虽然有技术基础但是我刚入门爬虫视野很窄不专业,为避免误导你们,你们最好参考知乎上大牛已经回答的好答案.我发这篇文章,目的是给自己看的.ps,专栏下每篇文 ...
- python执行js文件报错_使用PyV8在Python爬虫中执行js代码
前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要 ...
- python创建excel文件报错_[转]用Python读写Excel文件
大部分Windows环境的开发人员都会选择Microsoft Excel API.实际上不仅仅是Python,几乎各种语言都有相应的方法使用它,因为核心的逻辑完全是由Microsft Excel自身提 ...
- python外星人入侵游戏run_game报错_《python编程从入门到实践》书中的外星人入侵小游戏报错...
使用该书发布的附件中的参考代码在Pyhton3.7 Pycharm2019.2.4(最新版本)的环境下运行,出现报错如下: Traceback (most recent call last): Fil ...
- python星空画法教程_对比几段代码,看看你是 Python 菜鸟还是老鸟
Python 里有个小彩蛋: 在 Python Shell 里输入 import this 这段话被称作"Python 之禅"(The Zen of Python),它列举了一些 ...
- python的read函数调用报错_从零开始学Python(七):文件存储I/O流和异常捕捉
这两天在搞小程序开发,耽搁了一下更新的进度,今天补上.一个完整的前端程序肯定离不开数据存储和网络两个模块,今天我们就先来讲讲python中的一种常见数据存储:文件存储!~! 文件存储(I/O操作) 何 ...
- python执行shell脚本报错_在python中执行shell命令:字符串错误
我在Windows命令行参考中的以下内容似乎相关: * Using multiple commands You can use multiple commands separated by the c ...
- python显示gif图片报错_用Python制作在地图上模拟瘟疫扩散的Gif图
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python除数为0报错_浅谈pandas dataframe对除数是零的处理
如下例 data2['营业成本率'] = data2['营业成本本年累计']/data2['营业收入本年累计']*100 但有营业收入本年累计为0的情况, 则营业成本率为inf,即无穷大,而需要在表中 ...
最新文章
- 字节一面:Redis主节点的Key已过期,但从节点依然读到过期数据....
- 互联网10年,激战如梦
- java 判断网络类型_Android 网络类型判断(2g、3g、wifi)及IP地址获取
- 形态学图像处理或能帮助实例分割
- android.xml设置全屏,Android全屏设置的方法总结
- c语言字符串化简,华为面试题:一元多项式的化简 C语言实现源码
- 计数信号量的删除与状态查询
- python做数据分析难么_做统计学习,数据分析应该学Python还是R?
- go-zero:开箱即用的微服务框架
- 蓝桥杯——机器人行走
- mysql 使用场景_MySQLMHA典型使用场景
- 解决MySQL下把结果导出到文件权限不足问题
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
- Linux 块与文件大小
- Spring整合JMS——三种connectionFactory
- Carrot2对文章进行聚类代码示例
- 用mindspore写了一个decouplehead模块,在yolov5上使用时报错
- 高德地图js API实现多点标记marker,多点marker移除和鼠标滑入标点显示提示框
- linux磁盘扩容:新增磁盘、原磁盘扩容、home/root分区扩容
- 坚鹏:苏州银行《银行数字化运营之行动篇》课程培训圆满结束