課時14:字串:各種奇葩的內建方法

那是個好男孩發表於2018-08-02

目錄:

  一、字串的祕密

  二、各種內建方法

  三、課時14課後習題及答案

 

*********************

一、字串的祕密

*********************

 學習了列表和元組,我們知道了分片的概念,事實上也可以應用於字串上:

>>> str1 = "I love zww"
>>> str1[:6]
'I love'

在python中沒有字元這個型別,在Python看來,所謂字元,就是長度為1的字串。當要訪問字串的其中一個字元的時候,只需要索引列表或元組的方法來索引字串即可:

>>> str1[5]
'e'

字串和元組一樣,都是屬於"一言既出、駟馬難追"的傢伙。所以一旦定下來就不能直接對它們進行修改了,如果必須修改,我們就需要委曲求全...

>>> str1[:6]+"插入的字串"+str1[6:]
'I love插入的字串 zww'

 

*********************

二、各種內建方法

*********************

 下面的表總結了字串的所以方法及對應的含義。

 1 capitalize()                            把字串的第一個字元改為大寫
 2 casefold()                               把整個字串的所有字元改為小寫
 3 center(width)                           將字串居中,並使用空格填充至長度 width 的新字串
 4 count(sub[, start[, end]])                 返回 sub 在字串裡邊出現的次數,start 和 end 參數列示範圍,可選。
 5 encode(encoding='utf-8', errors='strict')     以 encoding 指定的編碼格式對字串進行編碼。
 6 endswith(sub[, start[, end]])                檢查字串是否以 sub 子字串結束,如果是返回 True,否則返回 False。start 和 end 參數列示範圍,可選。
 7 expandtabs([tabsize=8])                   把字串中的 tab 符號(\t)轉換為空格,如不指定引數,預設的空格數是 tabsize=8 8 find(sub[, start[, end]])                  檢測 sub 是否包含在字串中,如果有則返回索引值,否則返回 -1,start 和 end 參數列示範圍,可選。
 9 index(sub[, start[, end]])                    跟find 方法一樣,不過如果 sub 不在 string 中會產生一個異常。
10 isalnum()                              如果字串至少有一個字元並且所有字元都是字母或數字則返回 True,否則返回 False。
11 isalpha()                              如果字串至少有一個字元並且所有字元都是字母則返回 True,否則返回 False。
12 isdecimal()                            如果字串只包含十進位制數字則返回 True,否則返回 False。
13 isdigit()                              如果字串只包含數字則返回 True,否則返回 False。
14 islower()                              如果字串中至少包含一個區分大小寫的字元,並且這些字元都是小寫,則返回 True,否則返回 False。
15 isnumeric()                            如果字串中只包含數字字元,則返回 True,否則返回 False。
16 isspace()                              如果字串中只包含空格,則返回 True,否則返回 False。
17 istitle()                              如果字串是標題化(所有的單詞都是以大寫開始,其餘字母均小寫),則返回 True,否則返回 False。
18 isupper()                              如果字串中至少包含一個區分大小寫的字元,並且這些字元都是大寫,則返回 True,否則返回 False。
19 join(sub)                              以字串作為分隔符,插入到 sub 中所有的字元之間。
20 ljust(width)                           返回一個左對齊的字串,並使用空格填充至長度為 width 的新字串。
21 lower()                                轉換字串中所有大寫字元為小寫。
22 lstrip()                               去掉字串左邊的所有空格
23 partition(sub)                         找到子字串 sub,把字串分成一個 3 元組 (pre_sub, sub, fol_sub),如果字串中不包含 sub 則返回 ('原字串', '', '')
24 replace(old, new[, count])                 把字串中的 old 子字串替換成 new 子字串,如果 count 指定,則替換不超過 count 次。
25 rfind(sub[, start[, end]])                 類似於 find() 方法,不過是從右邊開始查詢。
26 rindex(sub[, start[, end]])                類似於 index() 方法,不過是從右邊開始。
27 rjust(width)                           返回一個右對齊的字串,並使用空格填充至長度為 width 的新字串。
28 rpartition(sub)                         類似於 partition() 方法,不過是從右邊開始查詢。
29 rstrip()                               刪除字串末尾的空格。
30 split(sep=None, maxsplit=-1)                不帶引數預設是以空格為分隔符切片字串,如果 maxsplit 引數有設定,則僅分隔 maxsplit 個子字串,返回切片後的子字串拼接的列表。
31 splitlines(([keepends]))                    在輸出結果裡是否去掉換行符,預設為 False,不包含換行符;如果為 True,則保留換行符。。
32 startswith(prefix[, start[, end]])           檢查字串是否以 prefix 開頭,是則返回 True,否則返回 False。start 和 end 引數可以指定範圍檢查,可選。
33 strip([chars])                            刪除字串前邊和後邊所有的空格,chars 引數可以定製刪除的字元,可選。
34 swapcase()                               翻轉字串中的大小寫。
35 title()                                 返回標題化(所有的單詞都是以大寫開始,其餘字母均小寫)的字串。
36 translate(table)                        根據 table 的規則(可以由 str.maketrans('a', 'b') 定製)轉換字串中的字元。
37 upper()                                 轉換字串中的所有小寫字元為大寫。
38 zfill(width)                            返回長度為 width 的字串,原字串右對齊,前邊用 0 填充。

 這裡選幾個常用的給大家演示一下用法,首先是casefold(),它的作用是把整個字串的所有字元改為小寫:

 

>>> str1 ="Love"
>>> str1.casefold()
'love'

 

count(sub[, start[, end]])          其作用是返回 sub 在字串裡邊出現的次數,start 和 end 參數列示範圍,可選。注:在python文件中,用方括號扣起來的表示可選。

 

>>> str1 = "AbcABCabCabcABCabc"
>>> str1.count('ab',0,15)
2

 

如果你要查詢某個字串在該字串中的位置,可使用find(sub[, start[, end]])或者index(sub[, start[, end]])方法。如果找到了,則返回值是第一個字元的索引值;如果找不到,則find()方法會返回-1,index()方法會丟擲異常。(注:異常是可以被捕獲並處理的錯誤,目前你可以認為就是錯誤)

>>> str1 = "I love zww"
>>> str1.find("zww")
7
>>> str1.find("good")
-1
>>> str1.index("zww")
7
>>> str1.index("good")
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    str1.index("good")
ValueError: substring not found

程式設計師很喜歡用join(sub)來連線字串,但它的用法也許會讓你感到詫異。join是以字串作為分隔符,插入到sub字串中所有的字元之間:

>>> 'x'.join("Test")
'Txexsxt'
>>> '_'.join("FishC")
'F_i_s_h_C'

為什麼說“程式設計師喜歡用 join()來連線字串”,我們不是有很好用的連線符號(+)嗎?這是因為當使用連線符號(+)去拼接大量的字串時是非常低效的,因為加號會引起記憶體複製以及垃圾回收操作。所以對於大量的字串拼接來說,使用join()方法的效率會高一些。

>>> 'I' + ' ' + 'love' + ' '+'fishc.com'
'I love fishc.com'
>>> ' '.join(['I','love','fishc.com'])
'I love fishc.com'

replace(old, new[, count]) 方法如其名,就是替換指定的字串:

>>> str1 ="I love you"
>>> str1.replace("you","fishc.com")
'I love fishc.com'

split(sep=None, maxsplit=-1)跟join()正好相反,split()用於拆分字串:

 

>>> str1 = ' '.join(['I','love','fishc.com'])
>>> str1
'I love fishc.com'
>>> str1.split()
['I', 'love', 'fishc.com']
>>> str2 = '_'.join("FishC")
>>> str2
'F_i_s_h_C'
>>> str2.split(sep='_')
['F', 'i', 's', 'h', 'C']

 

 

*******************************

三、課時14課後習題及答案

********************************

測試題:
  
0. 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)?

1. 三引號字串通常我們用於做什麼使用?

2. file1 = open('C:\windows\temp\readme.txt', 'r') 表示以只讀方式開啟“C:\windows\temp\readme.txt”這個文字檔案,但事實上這個語句會報錯,知道為什麼嗎?你會如何修改?

3. 有字串:str1 = '<a href="http://www.fishc.com/dvd" target="_blank">魚C資源打包</a>',請問如何提取出子字串:'www.fishc.com'   

4. 如果使用負數作為索引值進行分片操作,按照第三題的要求你能夠正確目測出結果嗎?

5. 還是第三題那個字串,請問下邊語句會顯示什麼內容?

>>> str1[20:-36]

6. 據說只有智商高於150的魚油才能解開這個字串(還原為有意義的字串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99'

動動手:

0. 請寫一個密碼安全性檢查的指令碼程式碼:check.py

# 密碼安全性檢查程式碼
#
# 低階密碼要求:
#   1. 密碼由單純的數字或字母組成
#   2. 密碼長度小於等於8位
#
# 中級密碼要求:
#   1. 密碼必須由數字、字母或特殊字元(僅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意兩種組合
#   2. 密碼長度不能低於8位
#
# 高階密碼要求:
#   1. 密碼必須由數字、字母及特殊字元(僅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三種組合
#   2. 密碼只能由字母開頭
#   3. 密碼長度不能低於16位

程式演示:

 

答案:

測試題答案:

0. 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)?

方法一:
   
>>> str1 = '''待我長髮及腰,將軍歸來可好?
此身君子意逍遙,怎料山河蕭蕭。
天光乍破遇,暮雪白頭老。
寒劍默聽奔雷,長槍獨守空壕。
醉臥沙場君莫笑,一夜吹徹畫角。
江南晚來客,紅繩結髮梢。'''
   
方法二:
   
>>> str2 = '待卿長髮及腰,我必凱旋迴朝。\
昔日縱馬任逍遙,俱是少年英豪。\
東都霞色好,西湖煙波渺。\
執槍血戰八方,誓守山河多嬌。\
應有得勝歸來日,與卿共度良宵。\
盼攜手終老,願與子同袍。'
   
方法三:
   
>>> str3 = ('待卿長髮及腰,我必凱旋迴朝。'
'昔日縱馬任逍遙,俱是少年英豪。'
'東都霞色好,西湖煙波渺。'
'執槍血戰八方,誓守山河多嬌。'
'應有得勝歸來日,與卿共度良宵。'
'盼攜手終老,願與子同袍。')

 

1. 三引號字串通常我們用於做什麼使用?

三引號字串不賦值的情況下,通常當作跨行註釋使用,例如:

'''這是一個三引號字串用於註釋的例子,
例子雖然只是簡簡單單的一句話,
卻毫無遮掩地體現了作者用情至深,
所謂愛至深處情至簡!'''

print("I love FishC.com!")

 

2. file1 = open('C:\windows\temp\readme.txt', 'r') 表示以只讀方式開啟“C:\windows\temp\readme.txt”這個文字檔案,但事實上這個語句會報錯,知道為什麼嗎?你會如何修改?

會報錯是因為在字串中,我們約定“\t”和“\r”分別表示“橫向製表符(TAB)”和“回車符”(詳見:http://bbs.fishc.com/thread-39140-1-1.html),因此並不會按照我們計劃的路徑去開啟檔案。
Python 為我們鋪好了解決的道路,只需要使用原始字串操作符(R或r)即可:

>>> file1 = open(r'C:\windows\temp\readme.txt', 'r')

 

3. 有字串:str1 = '<a href="http://www.fishc.com/dvd" target="_blank">魚C資源打包</a>',請問如何提取出子字串:'www.fishc.com'

>>> str1[16:29]

 

4. 如果使用負數作為索引值進行分片操作,按照第三題的要求你能夠正確目測出結果嗎?

>>> str1[-45:-32]

 

5. 還是第三題那個字串,請問下邊語句會顯示什麼內容?

>>> str1[20:-36]

'fishc',加入了負數索引,問題變得有些複雜,不過自己多嘗試幾次就可以熟練掌握了。

 

6. 據說只有智商高於150的魚油才能解開這個字串(還原為有意義的字串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99'

>>> str1[::3]

 

動動手答案:

0. 請寫一個密碼安全性檢查的指令碼程式碼:check.py

 1 # 密碼安全性檢查程式碼
 2 #
 3 # 低階密碼要求:
 4 #   1. 密碼由單純的數字或字母組成
 5 #   2. 密碼長度小於等於8位
 6 #
 7 # 中級密碼要求:
 8 #   1. 密碼必須由數字、字母或特殊字元(僅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意兩種組合
 9 #   2. 密碼長度不能低於8位
10 #
11 # 高階密碼要求:
12 #   1. 密碼必須由數字、字母及特殊字元(僅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三種組合
13 #   2. 密碼只能由字母開頭
14 #   3. 密碼長度不能低於16位
15 
16 symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
17 chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
18 nums = '0123456789'
19 
20 passwd = input('請輸入需要檢查的密碼組合:')
21 
22 # 判斷長度
23 length = len(passwd)
24 
25 while (passwd.isspace() or length == 0) :
26     passwd = input("您輸入的密碼為空(或空格),請重新輸入:")
27 
28 if length <= 8:
29     flag_len = 1
30 elif 8 < length < 16:
31     flag_len = 2
32 else:
33     flag_len = 3
34 
35 flag_con = 0
36 
37 # 判斷是否包含特殊字元
38 for each in passwd:
39     if each in symbols:
40         flag_con += 1
41         break
42     
43 # 判斷是否包含字母
44 for each in passwd:
45     if each in chars:
46         flag_con += 1
47         break
48 
49 # 判斷是否包含數字
50 for each in passwd:
51     if each in nums:
52         flag_con += 1
53         break    
54 
55 # 列印結果
56 while 1 :
57     print("您的密碼安全級別評定為:", end='')
58     if flag_len == 1 or flag_con == 1 :
59         print("")
60     elif flag_len == 2 or flag_con == 2 :
61         print("")
62     else :
63         print("")
64         print("請繼續保持")
65         break
66 
67     print("請按以下方式提升您的密碼安全級別:\n\
68     \t1. 密碼必須由數字、字母及特殊字元三種組合\n\
69     \t2. 密碼只能由字母開頭\n\
70     \t3. 密碼長度不能低於16位'")
71     break

 

相關文章