一、字符串的秘密
二、各種內置方法
三、課時14課后習題及答案
一、字符串的秘密
學習了列表和元組,我們知道了分片的概念,事實上也可以應用於字符串上:
>>> str1 = "I love fishc" >>> str1[:6] 'I love'
在python中沒有字符這個類型,在Python看來,所謂字符,就是長度為1的字符串。
當要訪問字符串的其中一個字符的時候,只需要索引列表或元組的方法來索引字符串即可:
>>> str1[5] 'e'
字符串和元組一樣,都是屬於"一言既出、駟馬難追"的家伙。
所以一旦定下來就不能直接對它們進行修改了,如果必須修改,我們就需要委曲求全...
>>> str1[:6]+"插入的字符串"+str1[6:]
'I love插入的字符串 fishc'
二、各種內置方法
下面的表總結了字符串的所以方法及對應的含義。
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.還記得如何定義一個跨越多行的字符串嗎(請至少寫出兩種實現的方法)?
例一:str = ('春眠不覺曉,'
'處處聞啼鳥。'
'也來風雨聲,'
'花落知多少。')
例二:str = ‘春眠不覺曉,\
處處聞啼鳥。\
也來風雨聲,\
花落知多少。’
例三:str = “”“春眠不覺曉,
處處聞啼鳥。
也來風雨聲,
花落知多少。”""
1.三引號字符串通常我們用於做什么使用?
三引號字符串通常用於注釋功能
'''這是一個三引號字符串用於注釋的例子, 例子雖然只是簡簡單單的一句話, 卻毫無遮掩地體現了作者用情至深, 所謂愛至深處情至簡!''' print("I love FishC.com!")
2.file1 = open(‘C:\windows\temp\readme.txt’, ‘r’) 表示以只讀方式打開“C:\windows\temp\readme.txt”這個文本文件,但事實上這個語句會報錯,知道為什么嗎?你會如何修改?
使用原始字符串轉義符r.
會報錯是因為在字符串中,我們約定“\t”和“\r”分別表示“橫向制表符(TAB)”和“回車符”,因此並不會按照我們計划的路徑去打開文件。
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]
'ilovefishc.com'
動動手答案:
0. 請寫一個密碼安全性檢查的腳本代碼:check.py
symbols = r''';!@#$%^&*()_+{}/\,.<>''' chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' nums = '0123456789' #檢驗密碼是否為空 passwd = input('請輸入您要檢查的組合密碼:') length = len(passwd) while(passwd.isspace() or length == 0): passwd = input('您輸入的密碼是為空(或空格),請重新輸入:') #判斷密碼的長度 if len(passwd) < 8: flag_num = 1 elif 8 < len(passwd) <16: flag_num = 2 else: flag_num = 3 flag_con = 0 # 判斷是否包含特殊字符 for each in passwd: if each in symbols: flag_con += 1 break # 判斷是否包含字母 for each in passwd: if each in chars: flag_con += 1 break # 判斷是否包含數字 for each in passwd: if each in nums: flag_con += 1 break # 打印結果 while 1: print('您的密碼安全等級評定為:',end = ' ') if (flag_num ==1) or (flag_con == 1): print('低') elif (flag_num == 2) or (flag_con == 2): print('中') else: print('高') break
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