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.7range()函数返回值是一个list,python3.0下的返回值则是range对象。从2.0过渡到3.0只需要多加一层list():

x = list(range(len(y))) # 3.0 
  1. 2.0的cmp函数到3.0被废弃,取而代之的是operator下的相关函数,但返回值是布尔值,cmp返回值是-1,0,1,所以我们可以用下面的函数来代替:
    def mycmp(a,b):
        return (a > b) - (a < b)
  1. 2.0的正则表达式到3.0之后,因为没有了字符格式的转来转去,3.0中的中文字符是Unicode格式的,Unicode由字母和数字构成,这样使用正则规则w+就会一不小心把中文也匹配到,解决方法是在正则各大函数:
re.sub()
re.seach()
re.compile()
.. 
增加一个参数 `flags=re.A`用二进制格式解析,并不会误匹配到中文啦
  1. 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的函数等进行改造。

原文地址:https://www.cnblogs.com/twomeng/p/10569679.html