python2.0代码重构为3.0一日记
当python2.0的Sort()
进化到python3.0
1.Sorted
(可迭代对象) or 可迭代对象.sort()
2.Key para : key为一个函数,此函数只有一个参数且返回一个值用来比较。每个元素在比较前被调用。也就是每一个被比较元素被扔进去比较。
3.Reverse 升序or降序
4.在python2.4前没有key参数而是CMP参数用来指定比较函数,和C++中的使用方法相同。Python3.0中则被移除了。Cmp参数指定的函数需要两个参数,代表两个不同的元素:
>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
5.我们需要把cmp函数转化为key函数:
>>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))
[5, 4, 3, 2, 1]
从python2.7,cmp_to_key()
函数被增加到了functools
模块中。
6.sys.path
是python搜索模块的路径集合list,使用sys.path.append(path)
添加相关路径,但退出python环境后自己添加的路径会自动消失。https://www.cnblogs.com/Mr-a2z/p/8746658.html 讲的蛮详细。
7. python2.7
的range()
函数返回值是一个list,python3.0
下的返回值则是range对象。从2.0过渡到3.0只需要多加一层list():
x = list(range(len(y))) # 3.0
- 2.0的
cmp
函数到3.0被废弃,取而代之的是operator下的相关函数
,但返回值是布尔值,cmp返回值是-1,0,1,所以我们可以用下面的函数来代替:
def mycmp(a,b):
return (a > b) - (a < b)
- 2.0的正则表达式到3.0之后,因为没有了字符格式的转来转去,3.0中的中文字符是Unicode格式的,Unicode由字母和数字构成,这样使用正则规则
\w+
就会一不小心把中文也匹配到,解决方法是在正则各大函数:
re.sub()
re.seach()
re.compile()
..
增加一个参数 `flags=re.A`用二进制格式解析,并不会误匹配到中文啦
re.compile(re.sub(pattern, func, string, flags))
的意思是:我给你一个字符串string
,并且希望找到其中符合规则pattern
的部分,符合规则的部分可能有好几块,比如我们有三个部分都能匹配上规则,那么就给匹配上的三部分分三个组,group(0)
得到全部三个组,group(1)
得到第一个组。然后我们把这三个组分别放到func
中去,得到一个返回值,用这个返回值来替代原来的各个组。
func
写成lambda
函数时看起来似乎很难理解,但是拆解开来就好说啦。compile(正则表达式字符串)
返回模式对象,结合search
等方法使用。当sub()
的替换后返回字符串是个正则表达式时,这么写才没问题。
express = re.compile(re.sub(r'%([A-Za-z0-9]+)', lambda m: '(' + m.group(1) + ')', val,flags=re.A) ,flags=re.A)
相当于:
1. pattern = r'%([A-Za-z0-9]+)'
2. def func(m):
return '(' + m.group(1) + ')'
3. patternstr = re.sub(pattern, func, val, flags=re.A)
4. express = re.compile(patternstr)
总结:把一个python2.0.的老版代码重构成了3.0., 除了改正的大量的print
语句外,主要是对3.0中不再使用的2.0的函数等进行改造。