详解Python3迁移接口变化采坑记
1、除法相关
在python3之前,
print13/4#result=3
然而在这之后,却变了!
print(13/4)#result=3.25
"/”符号运算后是正常的运算结果,那么,我们要想只取整数部分怎么办呢?原来在python3之后,“//”有这个功能:
print(13//4)#result=3.25
是不是感到很奇怪呢?下面我们再来看一组结果:
print(4/13)#result=0.3076923076923077 print(4.0/13)#result=0.3076923076923077 print(4//13)#result=0 print(4.0//13)#result=0.0 print(13/4)#result=3.25 print(13.0/4)#result=3.25 print(13//4)#result=3 print(13.0//4)#result=3.0
2、Sort()和Sorted()函数中cmp参数发生了变化(重要)
在python3之前:
defreverse_numeric(x,y): returny-x printsorted([5,2,4,1,3],cmp=reverse_numeric)
输出的结果是:[5,4,3,2,1]
但是在python3中,如果继续使用上面代码,则会报如下错误:
TypeError:'cmp'isaninvalidkeywordargumentforthisfunction
咦?根据报错,意思是在这个函数中cmp不是一个合法的参数?为什么呢?查阅文档才发现,在python3中,需要把cmp转化为一个key才可以:
defcmp_to_key(mycmp): 'Convertacmp=functionintoakey=function' classK: def__init__(self,obj,*args): self.obj=obj def__lt__(self,other): returnmycmp(self.obj,other.obj)<0 def__gt__(self,other): returnmycmp(self.obj,other.obj)>0 def__eq__(self,other): returnmycmp(self.obj,other.obj)==0 def__le__(self,other): returnmycmp(self.obj,other.obj)<=0 def__ge__(self,other): returnmycmp(self.obj,other.obj)>=0 def__ne__(self,other): returnmycmp(self.obj,other.obj)!=0 returnK
为此,我们需要把代码改成:
fromfunctoolsimportcmp_to_key defcomp_two(x,y): returny-x numList=[5,2,4,1,3] numList.sort(key=cmp_to_key(comp_two)) print(numList)
这样才能输出结果!
具体可参考链接:SortingHOWTO
3、map()函数返回值发生了变化
Python2.x返回列表,Python3.x返回迭代器。要想返回列表,需要进行类型转换!
defsquare(x): returnx**2 map_result=map(square,[1,2,3,4]) print(map_result)#print(list(map_result))#[1,4,9,16] #使用lambda匿名函数 print(map(lambdax:x**2,[1,2,3,4]))#
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。