python高級編程技巧(6)

一. 如何將多個小字符串拼接成一個大的字符串

實際案例:

  1. 在設計某網(wǎng)絡程序時,我們自定義了一個基于UDP的網(wǎng)絡協(xié)議,按照固定次序向服務器傳遞一系列參數(shù):
    hwDetect: "<0112>"
    gxDepthBits: "<32>"
    gxResolution: "<1024x768>"
    gxRefresh: "<60>"
    fullAlpha: "<1>"
    lodDist: "<100.0>"
    DistCull: "<500.0>"
解決方案:

方法1. 迭代列表,連續(xù)使用 ‘+’ 操作,依次拼接每一個字符
方法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)) #一次性的拼接,不浪費

#當列表中的數(shù)據(jù)類型不同時 如何進行字符串的拼接?
s = ['abc', 123, 45, 'xyz']
print(''.join([str(x) for x in s])) #列表解析,不推薦,生成新的列表,在文件很大的情況下不適用
#推薦使用生成器表達式,[] 變?yōu)?()
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'參數(shù)完成同樣任務。

代碼示例:
# _*_ 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'參數(shù)完成左右中對齊
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('-+')) #去掉字符串兩邊與傳入的參數(shù)匹配的字符

#####################################

#方法 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()有兩個參數(shù):
# 第一個為None代表不做任何映射關系,第二個參數(shù)表示要刪除的字符
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代碼點的值的整數(shù),即1114111(十六進制的0x10FFFF)。
  unicodedata.combining:將分配給字符chr的規(guī)范組合類作為整數(shù)返回。 如果未定義組合類,則返回0。
'''
cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) if unicodedata.combining(chr(c))) #此部分建議拆分開來理解
b = unicodedata.normalize('NFD', a)
'''
   調用translate 函數(shù)刪除所有重音符
'''
print(b.translate(cmb_chrs))

要努力要奮斗
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 數(shù)據(jù)類型 數(shù)據(jù)類型由三部分組成身份(id)、類型(type)、值??磳ο笥袥]有改變使用id(object)查看對象...
    letry閱讀 387評論 0 0
  • 比起母親節(jié)的提前預熱,聲勢浩大,父親節(jié)的前奏冷冷清清,仿佛這個節(jié)日根本不存在。 母親節(jié)與父親節(jié)同樣是舶來品,怎么待...
    恒癡閱讀 348評論 0 2
  • 我們都曾以為遇到了可以攜手一輩子的人,在傾盡所有后,卻被告知這趟列車不能到達我想要的終點,然后帶著無盡的失落和滿身...
    隨筆日記官網(wǎng)閱讀 712評論 0 0
  • 《王妃逆天·廢柴二小姐》 【第一章】我是廢柴?! “二小姐!你你不要嚇奴婢??!二小姐!你快醒醒啊啊!你怎么會想不開...
    顧笙楠M閱讀 908評論 0 1

友情鏈接更多精彩內容