zoukankan      html  css  js  c++  java
  • 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的函数等进行改造。

  • 相关阅读:
    洛谷
    洛谷
    洛谷
    洛谷
    模板
    .
    洛谷
    洛谷
    洛谷
    poj 2955"Brackets"(区间DP)
  • 原文地址:https://www.cnblogs.com/twomeng/p/10569679.html
Copyright © 2011-2022 走看看