美文网首页
python高级编程技巧(6)

python高级编程技巧(6)

作者: 我是一条池中鱼 | 来源:发表于2017-10-14 22:29 被阅读0次

    一. 如何将多个小字符串拼接成一个大的字符串

    实际案例:

    1. 在设计某网络程序时,我们自定义了一个基于UDP的网络协议,按照固定次序向服务器传递一系列参数:
      hwDetect: "<0112>"
      gxDepthBits: "<32>"
      gxResolution: "<1024x768>"
      gxRefresh: "<60>"
      fullAlpha: "<1>"
      lodDist: "<100.0>"
      DistCull: "<500.0>"
    解决方案:

    方法1. 迭代列表,连续使用 ‘+’ 操作,依次拼接每一个字符
    方法2. 使用 str.join() 方法,更加快速的拼接列表中所有字符。(推荐使用

    代码示例:
    # _*_ coding:utf-8 _*_
    # @Author   : TianYu
    # @Time     : 2017/10/13 16:19
    # @File     : 如何将多个小字符串拼接成一个大的字符串.py
    
    #方法 1 :使用 '+' 号
    s1 = 'abcdefg'
    s2 = '12345'
    print(s1 + s2)# 本质上是运算符重载:str.__add__(s1, s2)
    print(s1 > s2) #True :str.__gt__(s1, s2)
    
    #################################################
    
    pl = ["<0112>", "<32>", "<1024x768>", "<60>", "<1>", "<100.0>", "<500.0>"]
    
    # 方法 1 (不推荐,存在巨大的浪费)
    s = '' #空字符串进行拼接
    for p in pl:
        s += p
    print(s)
    
    #方法 2(推荐使用,列表很长的情况下):使用str.join()方法,更加快速的拼接列表中的所有字符串
    print(''.join(pl)) #一次性的拼接,不浪费
    
    #当列表中的数据类型不同时 如何进行字符串的拼接?
    s = ['abc', 123, 45, 'xyz']
    print(''.join([str(x) for x in s])) #列表解析,不推荐,生成新的列表,在文件很大的情况下不适用
    #推荐使用生成器表达式,[] 变为 ()
    print(''.join((str(x) for x in s))) #(str(x) for x in s)是generator object(生成器对象)
    
    

    二. 如何对字符串进行左、右、居中对齐?

    实际案例:

    1. 某个字典存储一系列属性值,
      {
      "DistCull":500.0,
      "SmallCull":0.04,
      "farclip":366,
      "lodDist":100.0,
      "trilinear":40
      }
      在程序中,我们想以以下工整的格式将其内容输出,如何处理?
      输出:
      DistCull : 500.0
      SmallCull : 0.04
      farclip : 366
      lodDist : 100.0
      trilinear : 40
    解决方案:

    方法1.使用字符串的 str.ljust(), str.rjust(), str.center() 方法进行左右居中对齐。
    方法2.使用 format()方法,传递类似'<20', '>20', '^20'参数完成同样任务。

    代码示例:
    # _*_ coding:utf-8 _*_
    # @Author   : TianYu
    # @Time     : 2017/10/13 16:38
    # @File     : 如何对字符串进行左右居中对齐.py
    
    #方法1 :使用字符串的str.ljust(),str.rjust(),str.center()进行左右居中对齐。
    s = 'abc'
    print(s.ljust(20, '='))# 宽度为20,不足的用 '=' 补齐:abc=================
    print(s.rjust(20, '*'))#与左对齐相同:*****************abc
    print(s.center(20, '-'))#同上:--------abc---------
    
    #方法2 :使用format()方法,传递类似'<20','>20','^20'参数完成左右中对齐
    s1 = 'xyz'
    print(format(s, '>20'))#右对齐,宽度为20,不足的用空格填充
    print(format(s, '<20'))#左对齐,同上
    print(format(s, '^20'))#居中,同上
    
    #示例:
    d ={
        "DistCull":500.0,
        "SmallCull":0.04,
        "farclip":366,
        "lodDist":100.0,
        "trilinear":40
    }
    w = max(map(len,d.keys()))#找出字典中键的最大长度
    for k in d:
        print(k.ljust(w),':', d[k])
    """
    输出结果:
    DistCull  : 500.0
    SmallCull : 0.04
    farclip   : 366
    lodDist   : 100.0
    trilinear : 40
    """
    
    

    三. 如何去掉字符串中不需要的字符?

    实际案例:

    1. 过滤掉用户输入中前后多余的空白字符:
      nick2008@gmail.com
    2. 过滤某windows下编辑文本中的‘\r’:
      'hello world\r\n'
    3. 去掉文本中的unicode组合符号(音调):
      u‘ní hǎo, chī fàn’
    解决方案:

    方法1. 字符串strip(), lstrip(), rstrip()方法去掉字符串两端字符
    方法2. 删除单个固定位置的字符,可以使用切片+拼接的方式
    方法3. 字符串的replace()方法或正则表达式re.sub()删除任意位置字符。
    方法4. 字符串translate()方法,可以同时删除多种不同字符。

    python3的 translate()方法用法。

    注意:translate()方法的使用在Python2与Python3中存在很大的差异,主要是因为Python2与3中字符串的语义的变化:
    Python2 python3
    ----------------------------
    str -> bytes
    unicode -> str


    代码示例:
    # _*_ coding:utf-8 _*_
    # @Author   : TianYu
    # @Time     : 2017/10/14 21:24
    # @File     : 如何去掉字符串中不需要的字符.py
    
    #方法 1 :str.strip()
    
    s = '   abc   123  '
    print(s.strip()) #去掉字符串两边(开头与结尾)的空白字符
    print(s.lstrip()) #去掉字符串左边的空白字符
    print(s.rstrip()) #去掉字符串右边的空白字符
    
    s = '---abc++++'
    print(s.strip('-+')) #去掉字符串两边与传入的参数匹配的字符
    
    #####################################
    
    #方法 2 :切片+拼接
    
    s = 'abc:123'
    s1 = s[:3] + s[4:] #切片操作,左闭右开
    print(s1)
    
    #方法 3 :replace() 或者 re.sub()
    
    s = '\tabc\t123\txyz' #字符串中带有3个空白符 \t
    print(s.replace('\t',''))
    
    import re
    s = '\tabc\t123\txyz\ropq\r'
    s1 = re.sub('[\t\r]', '', s)#替换任意多的字符
    print(s1)
    
    #方法 4 :translate()
    
    #(1)
    s = 'abc1230323xyz'
    # str.maketrans('abcxyz','xyzabc') #映射表关系,进行加密:abc--xyz,  xyz--abc
    s1 = s.translate(str.maketrans('abcxyz','xyzabc'))
    print(s1) #xyz1230323abc
    
    #(2):与Python2的差异是:Python3中是对'bytes'进行处理,而不是‘string'
    s2 = b'abc\refg\n\2343\t'
    #translate()有两个参数:
    # 第一个为None代表不做任何映射关系,第二个参数表示要删除的字符
    print(s2.translate(None ,b'\r\t\n') )
    
    # 转换为大写,并删除字母o
    bytes_tabtrans = bytes.maketrans(b'abcdefghijklmnopqrstuvwxyz', b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    print(b'runoob'.translate(bytes_tabtrans, b'o'))
    
    ##############################
    
    #去除Unicode字符中的音调
    import sys
    import unicodedata
    s = "Zhào Qián Sūn Lǐ Zhōu Wú Zhèng Wáng"
    remap = {
        # ord返回ascii值
        ord('\t'): '',
        ord('\f'): '',
        ord('\r'): None
        }
    # 去除\t, \f, \r
    
    a = s.translate(remap)
    '''
      通过使用dict.fromkeys() 方法构造一个字典,每个Unicode 和音符作为键,对于的值全部为None
      然后使用unicodedata.normalize() 将原始输入标准化为分解形式字符
      sys.maxunicode : 给出最大Unicode代码点的值的整数,即1114111(十六进制的0x10FFFF)。
      unicodedata.combining:将分配给字符chr的规范组合类作为整数返回。 如果未定义组合类,则返回0。
    '''
    cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) if unicodedata.combining(chr(c))) #此部分建议拆分开来理解
    b = unicodedata.normalize('NFD', a)
    '''
       调用translate 函数删除所有重音符
    '''
    print(b.translate(cmb_chrs))
    
    
    要努力要奋斗

    相关文章

      网友评论

          本文标题:python高级编程技巧(6)

          本文链接:https://www.haomeiwen.com/subject/wlvfuxtx.html