对于Python初学者来说,代码能运行不报错就已经很开心了。受限于知识体系和项目历练经验,在写代码的时候,很少考虑代码的运行效率和简洁性,因此容易造成代码冗长、执行速度慢,这些基本是一个初学者需要改进、成长的地方。
本文是想通过几个案例给初学者一点点启发,怎么才能让你的Python代码更优雅。欢迎收藏学习,喜欢点赞支持。 文末提供技术交流群
生成器
除非你的list十分复杂,并且频繁调用,否则都建议使用生成器,因为它非常节省内存,举个例子:
常规版
def powers_of_two(max=20000):
i = 0
powers = []
while 2**i < max:
powers.append(2**i)
i += 1
return powers
优雅版
from itertools import count, takewhile
def powers_of_two(max=20000):
for index in takewhile(lambda i: 2**i < max, count(start=0)):
yield 2**index
标准库
标准库itertools和collections很少被初学者使用,写代码按照正常的逻辑去写,很少考虑效率问题。
常规版
list1 = range(1,10)
list2 = range(10,20)
for item1 in list1:
for item2 in list1:
print(item1*item2)
优雅版
from itertools import product
list1 = range(1,10)
list2 = range(10,20)
for item1,item2 in product(list1, list2):
print(item1*item2)
这是一个嵌套循环操作,为提高代码效率,完全可以用product()函数替代嵌套循环,这两段代码的结果完全一样,但使用标准库函数明显更加简洁高效。itertools还有很多方便操作迭代对象的函数,有兴趣可以继续演讲。
集合模块
初学者对python集合模块了解的可能并不多,你可能会遇到这样的情形:构建了一个字典,依次向字典中添加信息,如果某个键已经存在,则以某种方式修改该键的值;如果某个键不存在,则添加对应键值对。
常规版
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
items_by_id = {}
for id_, item in consolidated_list:
if id_ not in items_by_id:
items_by_id[id_] = []
if id_ in items_by_id:
items_by_id[id_].append(item)
优雅版
from collections import defaultdict
items_by_id = defaultdict(list)
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
for id_, item in consolidated_list:
items_by_id[id_].append(item)
高级数据结构
很多初学者忽视sets(集合)和tuple(元组)的强大之处,例如,取两个列表交集。
常规版
def common_elements(list1, list2):
common = []
for item1 in list1:
if item1 in list2:
common.append( item1 ) 、
return common
优雅版
def common_elements(list1, list2):
def common_elements(list1, list2):
common = set(list1).intersection(set(list2))
return list(common)
上下文管理器
新手可能会习惯常规版的方式进行读取文件操作,具体如下:
常规版
if os.path.exists(data_file_path):
data_file = open(data_file_path,'r')
else:
raise OSERROR
print( data_file.read())
data.close()
优雅版
with open(data_file_path,'r') as data_file:
print(data_file.read)
优雅版:这样可以捕获任何打开文件或处理数据时的异常情况,并且在任务处理完后自动关闭文件。python初学者可能不太了解上下文管理器的神奇之处,它真的能带来巨大的便利。
常规版:可能出现文件存在,但文件被占用,无法读取的情况,可能出现文件可以被读取,但操作文件对象出现报错的情况
结论
任何一门语言学习都需要一个积累的过程,我们不能仅利用Python完成工作任务就Ok了,也要在性能优化、代码健壮性、代码简约等方面多多去思考。
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、添加微信号:dkl88191,备注:来自CSDN
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群