在上一篇文章的?密碼破解器?中,我們回顧了循環專題的知識點。
while 循環和 for 循環是 Python 中的兩大循環語句,它們都可以實現循環的功能,但在具體使用時略有差別。當循環次數不確定時,我們選用 while 循環;當循環次數確定,需要遍歷整個序列的元素時,for 循環則更為合適。
此外,for 循環和 zip() 函數、enumerate() 函數搭配使用能更加靈活的操作序列中的元素。
如果有所遺忘,推薦你回到上節課再加強理解哦。
從本關開始,我們將攻克一個新目標——字符串。各位 Python 練習生們,你們準備好了嗎?🎙?
字符串
在 Python 的世界里,字符串是表示文本的數據類型,我們再來回顧一下如何將字符串賦值給變量:
name1 = '小貝'
name2 = "小貝"
Python 中的字符串是使用一對英文單引號(')或英文雙引號(")包裹的任意文本。無論是用單引號還是用雙引號,它倆的效果都是一樣的,但需要保持前后引號的統一。
在之前的課程練習中,我們打印的文字好像都只能在一行,如果我們要打印多行文字時,比如打印一首詩,要怎么辦呢?你可能會像下面這樣編寫代碼,然后發現報錯了。
poetry = '日暮蒼山遠,天寒白屋貧。
柴門聞犬吠,風雪夜歸人。'
print(poetry)
# 報錯:SyntaxError: bad token on line 1
系統在讀取第一行代碼時,只識別到一個單引號,而無法讀取后續的字符串,導致了語法錯誤。為了避免這個問題,你也可能像下面這樣機智地使用多個?print()?函數。
poetry1 = '日暮蒼山遠,天寒白屋貧。'
poetry2 = '柴門聞犬吠,風雪夜歸人。'
print(poetry1)
print(poetry2)
# 輸出:
# 日暮蒼山遠,天寒白屋貧。
# 柴門聞犬吠,風雪夜歸人。
問題是解決了,但如果要輸出一首莎士比亞的十四行詩《我怎么能夠把你來比作夏天》,豈不是要編寫 28 行代碼,想想就覺得很麻煩。那有沒有什么好的辦法呢?這個時候,就要用到強大的三引號了。
我們可以像下面這樣使用一對三引號('''?或?""")來包裹多行字符串。三引號包裹的字符串和普通的字符串使用上沒有區別,只是三引號支持多行字符串而已。
poetry = '''我怎么能夠把你來比作夏天?
你不獨比它可愛也比它溫婉:
狂風把五月寵愛的嫩蕊作踐,
夏天出賃的期限又未免太短:
天上的眼睛有時照得太酷烈,
它那炳耀的金顏又常遭掩蔽:
被機緣或無常的天道所摧折,
沒有芳艷不終于凋殘或消毀。
但是你的長夏永遠不會凋落,
也不會損失你這皎潔的紅芳,
或死神夸口你在他影里漂泊,
當你在不朽的詩里與時同長。
只要一天有人類,或人有眼睛,
這詩將長存,并且賜給你生命。'''
print(poetry)
# 輸出:
# 我怎么能夠把你來比作夏天?
# 你不獨比它可愛也比它溫婉:
# 狂風把五月寵愛的嫩蕊作踐,
# 夏天出賃的期限又未免太短:
# 天上的眼睛有時照得太酷烈,
# 它那炳耀的金顏又常遭掩蔽:
# 被機緣或無常的天道所摧折,
# 沒有芳艷不終于凋殘或消毀。
# 但是你的長夏永遠不會凋落,
# 也不會損失你這皎潔的紅芳,
# 或死神夸口你在他影里漂泊,
# 當你在不朽的詩里與時同長。
# 只要一天有人類,或人有眼睛,
# 這詩將長存,并且賜給你生命。
除了使用多行字符串來實現多行文本外,使用?\n?也能達到一樣的效果。\n?被稱為?換行符,用于文本間的換行。
插入了換行符,其后方的內容將另起一行顯示,所以,輸出《風雪夜歸人》的詩行可以這樣實現:
poetry = '日暮蒼山遠,天寒白屋貧。\n柴門聞犬吠,風雪夜歸人。'
print(poetry)
# 輸出:
# 日暮蒼山遠,天寒白屋貧。
# 柴門聞犬吠,風雪夜歸人。
拼接字符串
我們都知道通過?+?可以將兩個字符串拼接,得到一個新的字符串。
first_name = '史蒂夫'
last_name = '喬布斯'
# 使用 + 拼接字符串
full_name = first_name + '·' + last_name
print(full_name)
# 輸出:史蒂夫·喬布斯
當我們把同一個字符串重復很多次的時候,我們可以使用多個?+?拼接,像下面這樣:
str1 = '海草'
str2 = str1 + str1 + str1
print(str2)
# 輸出:海草海草海草
上面那樣的寫法太麻煩了,你有沒有想到更快捷的方法?
對了,用?*!數學中的乘法是相同的數加起來的快捷方式,Python 中字符串的拼接操作也是如此。
str1 = '海草'
str2 = str1 * 3 # 相當于 str1 + str1 + str1
print(str2)
# 輸出:海草海草海草
編程練習
你小時候肯定聽過這么一個童謠:“從前有座山,山里有個廟。廟里有老和尚和小和尚,有一天老和尚對小和尚說:從前有座山,山里有個廟。廟里有老和尚和小和尚,有一天老和尚對小和尚說:從前有座山,山里有個廟。廟里有老和尚和小和尚,有一天老和尚對小和尚說:……”。
我們接下來用字符串拼接的方法,將這個一直循環的童謠講 20 遍!
最優解:
story = '從前有座山,山里有個廟,廟里有老和尚和小和尚,有一天老和尚對小和尚說:'
print(story * 20)
# 將 story 重復 20 遍拼接在一起使用 print() 輸出
運用字符串拼接的方式完成一組重復文本的輸出,既省時又省心。
其實 Python 還提供了一種更高級的方法來組合字符串,那就是字符串格式化輸出。
字符串格式化輸出
字符串格式化輸出?是按照一種既定格式給字符串填空的方式,以便我們更加方便地寫入字符串。比如一段自我介紹的文本:我叫 xx,今年 xx 歲,來自 xx。,根據我們學過的知識,我們會這樣寫:
def print_intro(name, age, city):intro = '我叫' + name + ',今年 ' + str(age) + ' 歲,來自' + city + '。'print(intro)print_intro('小貝', 18, '南京')
# 輸出:我叫小貝,今年 18 歲,來自南京。
提示:字符串類型和數字類型不能直接相加,需要用?str()?函數進行類型轉換。
上面的例子里,我們用了一堆?+?來拼接字符串,既麻煩又難以一眼看出來是什么。接下來老師用字符串的格式化輸出實現同樣的功能:
def print_intro(name, age, city):intro = '我叫%s,今年 %d 歲,來自%s。' % (name, age, city)print(intro)print_intro('小貝', 18, '南京')
# 輸出:我叫小貝,今年 18 歲,來自南京。
小貝提問,這段代碼看起來有點復雜,“%”在這里是什么意思,老師能不能再詳細地說一說?
好的,我們來看一下字符串格式化輸出的語法規則:
%?運算符左邊是要格式化的字符串,右邊是一個元組。如果只有一個占位符,可以將元組里的元素拿出來,如:'我叫%s' % '小貝'。
我們通過?%s、%d?這樣的占位符在字符串中“占位”,Python 會將 % 右邊的內容會按順序替換掉對應的占位符,一一填空。每個占位符都有特定的含義,我們來看一下常見的占位符:
提示:如果你不太確定應該用什么占位符,%s?是萬能的,它會把任何數據類型轉換為字符串。
編程練習
小貝寫了段播報天氣的代碼,但還是用?+?進行字符串拼接實現的,你能用字符串格式化輸出的知識幫她改進一下代碼嗎?
weathers = [('南京', 36),('成都', 30),('昆明', 26)
]for w in weathers:print('今天' + w[0] + '的最高氣溫是' + str(w[1]) + '度')
解答后為:
weathers = [('南京', 36),('成都', 30),('昆明', 26)
]for w in weathers:
# 如果你不太確定應該用什么占位符,%s 是萬能的,它會把任何數據類型轉換為字符串。print('今天%s的最高氣溫是%s度'%(w[0],w[1]))# 今天南京的最高氣溫是36度
# 今天成都的最高氣溫是30度
# 今天昆明的最高氣溫是26度
編程練習—練習生
身為 Python 練習生的你,練習時長有多久了呢?今天我們來用字符串格式化的知識來做段自我介紹!
格式是:同學們大家好,我是 Python 練習時長 xxx 的個人練習生 xxx,喜歡 xxx!。比如:同學們大家好,我是 Python 練習時長兩年半的個人練習生小貝,喜歡唱、跳、Python、籃球!
將下面的代碼,用剛剛學的占位符的方式去展示
def print_intro(duration, name, hobby):# 用占位符修改下面字符串print('大家好,我是 Python 練習時長兩年半的個人練習生小貝,喜歡唱、跳、Python、籃球!')# 將參數改為你的自我介紹
print_intro('兩年半', '小貝', '唱、跳、Python、籃球')
優化后的代碼為:
def print_intro(duration, name, hobby):# 用占位符修改下面字符串print('大家好,我是 Python 練習時長%s的個人練習生%s,喜歡%s!'%(duration, name, hobby))# 將參數改為你的自我介紹
print_intro('兩年半', '小貝', '唱、跳、Python、籃球')
編程練習—人類的本質是復讀機
在各大 APP 的評論區里,一旦某個人的發言有意思,其他人就會“保持隊型”,紛紛模仿他說的話。
比如隨處可見的“+1”和“+10086”,視頻 UP 主求贊之后彈幕上總會飄過一大片“下次一定”,人類的本質果然是復讀機呢。
列表?words
?中儲存了一些常見的網絡用語,我們可以用字符串方法將列表里的元素都“復讀”三次,比如將?['+1', '就這']
?復讀為?['+1+1+1', '就這就這就這']
。
要求復讀后不改變列表元素的順序,請你在原列表中,將每個元素都復讀三次,并將復讀后的列表打印出來。
words = ['+1', '不會吧', '下次一定', '+10086', '就這']
解題后:
words = ['+1', '不會吧', '下次一定', '+10086', '就這']
# 方法一
items = []
for word in words:items.append('%s'%(word * 3))
print(items)# 方法二
# for i in range(len(words)):
# words[i] *= 3
# print(words)
編程練習——句子扭蛋
學完一關啦,想不想輕松一下?這就給你介紹一個好玩的游戲:句子扭蛋。
首先邀請你的小伙伴一起,大開腦洞隨便寫下三組詞,分別包括人物、地點和事件三類詞,比如:
人物:哆啦A夢,迪迦奧特曼,路飛,蘇大強,容嬤嬤,甄嬛,謝耳朵
地點:埃菲爾鐵塔上,地鐵上,大街上,飛機上,三里屯,家里,浴室里,王者峽谷
事件:背課文,高唱《死了都要愛》,蹦極,補暑假作業,跳遠,開黑,800米跑,看《生活大爆炸》
然后,在三組詞里隨機抽簽,用上面這些詞來“造句”,比如“容嬤嬤在王者峽谷看《生活大爆炸》。”
是不是覺得還蠻有趣的?Python 可以很方便地做一個這樣的游戲,我們把人物、地點和事件分別存到列表?roles
、spots
?和?events
?里,再用?random()
?函數隨機生成列表的索引值,在列表中隨機選取元素并拼成句子。
生成?roles
?列表隨機索引值?i_role
?的代碼已經寫好,請你仿照這個例子,生成其他列表的索引值,并用字符串格式化的方法,把隨機取到的列表元素拼成句子。
提示:老師給的例子不夠有趣?你可以修改列表里已經寫好的詞,DIY 你自己的句子扭蛋哦!
# 有下面這行代碼,random() 方法才會奇效,注意不要刪掉它~
import randomroles = ['哆啦A夢', '迪迦奧特曼', '路飛', '蘇大強', '容嬤嬤', '甄嬛', '謝耳朵']
spots = ['埃菲爾鐵塔上', '地鐵上', '大街上', '飛機上', '三里屯', '家里', '浴室里', '王者峽谷']
events = ['背課文', '高唱《死了都要愛》', '蹦極', '補暑假作業', '跳遠', '開黑', '800米跑', '看《生活大爆炸》']# 請仿照下面這行代碼,生成列表 spots 和 events 的隨機索引值
i_role = random.randint(0, len(roles) - 1)# 下面是老師寫好的句子模板,請你用字符串格式化的方法向其中填入內容。
# 當然,你也可以 DIY 輸出句子的格式哦!
print('我看到了一件怪事:【人物】在【地點】【做某件事】。')
解答后:
# 有下面這行代碼,random() 方法才會奇效,注意不要刪掉它~
import randomroles = ['哆啦A夢', '迪迦奧特曼', '路飛', '蘇大強', '容嬤嬤', '甄嬛', '謝耳朵']
spots = ['埃菲爾鐵塔上', '地鐵上', '大街上', '飛機上', '三里屯', '家里', '浴室里', '王者峽谷']
events = ['背課文', '高唱《死了都要愛》', '蹦極', '補暑假作業', '跳遠', '開黑', '800米跑', '看《生活大爆炸》']# 請仿照下面這行代碼,生成列表 spots 和 events 的隨機索引值
i_role = random.randint(0, len(roles) - 1)
i_spot = random.randint(0, len(roles) - 1)
i_event = random.randint(0, len(roles) - 1)# 下面是老師寫好的句子模板,請你用字符串格式化的方法向其中填入內容。
# 當然,你也可以 DIY 輸出句子的格式哦!
print('我看到了一件怪事:%s在%s%s。' %(roles[i_role],spots[i_spot],events[i_event]))# 我看到了一件怪事:甄嬛在三里屯蹦極。
# 我看到了一件怪事:甄嬛在埃菲爾鐵塔上800米跑。
# 我看到了一件怪事:迪迦奧特曼在大街上高唱《死了都要愛》。
# 我看到了一件怪事:容嬤嬤在家里跳遠。
......
是不是很有意思呢~~
預告:下一篇:字符串的索引