python高级编程技巧(6)
2017-10-14 本文已影响0人
我是一条池中鱼
一. 如何将多个小字符串拼接成一个大的字符串
实际案例:
- 在设计某网络程序时,我们自定义了一个基于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(生成器对象)
二. 如何对字符串进行左、右、居中对齐?
实际案例:
- 某个字典存储一系列属性值,
{
"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
"""
三. 如何去掉字符串中不需要的字符?
实际案例:
- 过滤掉用户输入中前后多余的空白字符:
‘ nick2008@gmail.com ’ - 过滤某windows下编辑文本中的‘\r’:
'hello world\r\n' - 去掉文本中的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))
要努力要奋斗