千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Python 新手的五大坑

Python 新手的五大坑

来源:千锋教育
发布人:xqq
时间: 2023-11-06 17:42:18 1699263738

对于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相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/

tags: python培训
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT