首页 / 知识
Python 新手的五大坑
2023-11-12 13:42:00
对于Python新手来说,写代码很少考虑代码的效率和简洁性,因此容易造成代码冗长、执行慢,这些都是需要改进的地方。本文是想通过几个案列给新手一点启发,怎样写python代码更优雅。
01.不喜欢使用高级数据结构
sets(集合)
很多新手忽视sets(集合)和tuple(元组)的强大之处.
例如,取两个列表交集:
defcommon_elements(list1,list2):
common=[]
foritem1inlist1:
ifitem1inlist2:
common.append(item1)、
returncommon
这样写会更好:
defcommon_elements(list1,list2):
common=set(list1).intersection(set(list2))
returnlist(common)
dic(字典)
新手枚举(访问和取出)字典的键和对应值,认为对应值必须通过键来访问,往往会这样做:
my_dict={'a':1,'b':2}
forkeyinmy_dict:
print(key,my_dict[key])
有一个更优雅的方法可以实现:
my_dict={'a':1,'b':2}
forkey,valueinmy_dict.items():
print(key,value)
对大部分项目来说,这样写会更加有效率。
tuple(元组)
元组一旦创建就无法更改元素,看似没有什么用处,其实元组的作用大着呢!很多函数方法都会返回元组,比如enumerate()和dict.items(),并且可以在函数中使用元组,返回多个值。还能够很方便地从元组中提取信息:
a,b=('cat','dog')
上面元组中有两个元素,分别被赋给a,b。如果有多个值,同样可以提取:
a,b,c=('cat','dog','tiger')
print(a,b,c)
提取首、尾两个元素:
first,*_,end=(1,2,3,4,5,6)
print(first,end)
#输出:1、6
提取首、中、尾三部分:
first,*middle,end=(1,2,3,4,5,6)
print(first,middle,end)
#输出:1、[2,3,4,5]、6
元组还可以用来交换变量:
(a,b,c)=(c,a,b)
上面a变成之前的c,b变成之前的a,c变成之前的b。元组也能作为字典的键,所以如果你需要存储数据,可以使用带有元组键的字典,比如说经纬度数据。
02.不喜欢使用上下文管理器
新手可能会习惯这样进行读取文件操作:
ifos.path.exists(data_file_path):
data_file=open(data_file_path,'r')
else:
raiseOSERROR
print(data_file.read())
data.close()
这样写会有几个明显的问题:
·可能出现文件存在,但文件被占用,无法读取的情况
·可能出现文件可以被读取,但操作文件对象出现报错的情况
·可能出现忘记关闭文件的情况
如果使用with…语句,问题就迎刃而解了:
withopen(data_file_path,'r')asdata_file:
print(data_file.read)
这样可以捕获任何打开文件或处理数据时的异常情况,并且在任务处理完后自动关闭文件。
python初学者可能不太了解上下文管理器的神奇之处,它真的能带来巨大的便利。
03.不喜欢使用标准库
标准库itertools和collections仍然很少被初学者使用
itertools
如果你看到下面的任务:
list1=range(1,10)
list2=range(10,20)
foritem1inlist1:
foritem2inlist1:
print(item1*item2)
这是一个嵌套循环操作,为提高代码效率,完全可以用product()函数替代嵌套循环:
fromitertoolsimportproduct
list1=range(1,10)
list2=range(10,20)
foritem1,item2inproduct(list1,list2):
print(item1*item2)
这两段代码的结果完全一样,但使用标准库函数明显更加简洁高效。itertools还有很多方便操作迭代对象的函数,比如:
·count()函数会创建一个无限迭代器
·cycle()函数会把传入的序列无限重复下去
·chain()可以把多个迭代对象串联起来
·group()函数可以把迭代其中相邻的重复元素挑出来,放在一起
有兴趣可以详细看看itertools库的各种神奇函数。
collections
新手对python集合模块了解的可能并不多,你可能会遇到这样的情形:
consolidated_list=[('a',1),('b',2),('c',3),('b',4)]
items_by_id={}
forid_,iteminconsolidated_list:
ifid_notinitems_by_id:
items_by_id[id_]=[]
ifid_initems_by_id:
items_by_id[id_].append(item)
上面代码构建了一个字典,依次向字典中添加信息,如果某个键已经存在,则以某种方式修改该键的值;如果某个键不存在,则添加对应键值对。
这种算法非常常见,你可以用collects模块的defaultdict()函数来实现同样效果:
fromcollectionsimportdefaultdict
items_by_id=defaultdict(list)
consolidated_list=[('a',1),('b',2),('c',3),('b',4)]
forid_,iteminconsolidated_list:
items_by_id[id_].append(item)
在此列中,defaultdict()接受一个list作为参数,当键不存在时,则返回一个空列表作为对应值。
有时候我们会遇到统计词频的案例,比如:
#统计词频
colors=['red','blue','red','green','blue','blue']
result={}
forcolorincolors:
ifresult.get(color)==None:
result[color]=1
else:
result[color]+=1
print(result)
#输出{'red':2,'blue':3,'green':1}
完全可以用defaultdict()函数实现上面的计数功能:
colors=['red','blue','red','green','blue','blue']
d=defaultdict(int)
forcolorincolors:
d[color]+=1
print(d)
更简单的方法用collections模块的Counter()函数:
fromcollectionsimportCounter
colors=['red','blue','red','green','blue','blue']
c=Counter(colors)
print(dict(c))
对于备份文件,新人往往会用system模块:
fromosimportsystem
system("xcopye:\\sample.csve:\\newfile\\")
其实shutil模块更好用:
importshutil
shutil.copyfile('E:\\q.csv','e:\\movie\\q.csv')
因为shutil会很详细地报告错误和异常。
04.不喜欢使用异常处理
无论老手新手都应该在写代码的时候进行异常处理操作,这样可以使代码更加健壮。异常处理一般会用try…except语句。
05.:不喜欢使用生成器
除非你的list十分复杂,并且频繁调用,否则都建议使用生成器,因为它非常节省内存,举个例子:
defpowers_of_two(max=20000):
i=0
powers=[]
while2**i powers.append[2**i] i+=1 returnpowers 对于使用次数少、占据大量内存、且容易生成的数据,可以用生成器替代列表存储: fromitertoolsimportcount,takewhile defpowers_of_two(max=20000): forindexintakewhile(lambdai:2**i yield2**index 以上内容为大家介绍了Python新手的五大坑,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
Python网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tc为什么开发人员喜欢在机器学习和人
为什么开发人员喜欢在机器学习和人工智能项目中使用Python?,代码,项目,数据,人工智能,平台,异常,增长,灵活,时间,工具,1.Python是灵活的Pytho数据科学领域Python比R语言更好
数据科学领域Python比R语言更好,数据,公司,工具,时间,项目,工作,庞大,受益,系统,代码,经常有学员问我们,在数据科学领域里,到底是该选Python呢,python的数据类型
python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.整型Python可以处理任意大小的整数,当然包括负整数,在程序中的表示为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方Python语言自带的数据结构有哪些
Python语言自带的数据结构有哪些,异常,数字,数据,元素,序列,培训,位置,名称,分析,括号,Python作为一种脚本语言,其要求强制缩进,使其易读、美观提升Python数据分析能力的方法
提升Python数据分析能力的方法,分析,数据,工具,代码,时间,环境,报告,信息,培训,标准,1.Pandas分析包这个工具的好处是显而易见的。下面的动画Python数据结构的时间复杂性
Python数据结构的时间复杂性,时间,项目,情况,平均,复杂度,培训,术语,数据,状态,操作,1.让我们了解大O符号的含义是什么?在算法中执行许多操作python经典最短代码实现排序的功能
python经典最短代码实现排序的功能,代码,位置,数据,分析,时间,序列,元素,培训,下来,算法,冒泡排序:算法思想:1.比较相邻的元素,如果第一个比第二跟踪数据的Python技巧
跟踪数据的Python技巧,信息,数据,工具,项目,位置,培训,总量,灵活,状态,代码,了解如何运用Python的某些数据对象,有利于保持井然有序的状态,避免Pylint让Python代码保持一致
Pylint让Python代码保持一致,代码,项目,数字,位置,地方,设计,工具,培训,一致,准则,当你想要争论代码复杂性时,Pylint是你的朋友。Pylint是更高