python高级编程技巧(6)

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

实际案例:

  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. 过滤掉用户输入中前后多余的空白字符:
    [email protected]
  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)_第1张图片
要努力要奋斗

你可能感兴趣的:(python高级编程技巧(6))