第 3 課 Python 的字符串與列表
前面的課程中显歧,我們通過Mu軟件編程工具讓Python做了一些基本的運算喇伯,并且學(xué)習(xí)了變量的概念以及使用俯抖。在這一課程里,我們會繼續(xù)學(xué)習(xí)Python編程中的另一些內(nèi)容:字符串(string)凑阶、列表( list )熏挎。你會學(xué)到字符串是用于在程序中顯示消息的(比如在游戲里“準備”和“游戲結(jié)束”這樣的消息),其實上一次的課程我們已經(jīng)見過了Python字符串晌砾,當(dāng)時我們可能還不知道這一名稱,這節(jié)課我們將對字符串做更加廣闊的學(xué)習(xí)烦磁。本次課你還會學(xué)到列表养匈,列表( list )可謂是我們Python用來存儲成批東西,使用頻率非常的高都伪,讓我們一起學(xué)習(xí)新的知識內(nèi)容吧呕乎!
3.1 字符串——strings
在編寫程序的術(shù)語中,我們通常把文字稱為“字符串”(string )陨晶。如果你把字符串想象成一堆字的組合的話猬仁,這個名字還是挺形象的帝璧。本書中的所有的字、數(shù)字以及符號都可以是一個字符串湿刽。并且你的名字也可以是個字符串的烁,你家的地址也是。事實上诈闺,我們創(chuàng)建的第一個 Python程序也用到了一個字符串“Hello World渴庆!”。
3.1.1 創(chuàng)建字符串
在Python中雅镊,我們通過給文本添加引號的方式來創(chuàng)建一個字符串襟雷。把文字用引號括起來就創(chuàng)建了字符串。像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
myName = "my name is ruiQu crazyRobot"
注意仁烹,引號一定是英文半角”” 的引號形式酵使,而非中文全角“”的引號形式组橄。然后,在Python中要看看myName里放的是什么,只要在Python輸入 print(myName)业踢,就像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
myName = "my name is ruiQu crazyRobot"
print(myName)
運行結(jié)果
注:以后的運行結(jié)果圖片,我們只使用程序編輯與運行輸出兩個窗口润匙。
你也可以用單引號來創(chuàng)建一個字符串疫诽,像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
myName = 'my name is superMan'
print(myName)
運行結(jié)果
要注意的是:如果你只用一個單引號(’)或者雙引號(”)來輸入超過一行的文字,或者用一種引號開頭并嘗試用另一種引號結(jié)尾的話鳍鸵,我們的Mu軟件代碼就會用醒目的顏色提醒你的代碼輸入有誤苇瓣,例如:
輸入代碼
# 在這里寫上你的代碼 :-)
address = '安徽省 合肥市
print(address)
運行結(jié)果
該圖是上面輸入代碼運行的結(jié)果,在輸入代碼的過程中我們其實已經(jīng)發(fā)現(xiàn)了問題偿乖,我們在使用字符串對地址address賦值的時候击罪,故意只用了一個單引號(’),立刻就會看到紅色背景的提示贪薪,這種提示在Mu軟件里表示的是一種錯誤警告媳禁,如果我們沒有檢查,直接點擊程序運行画切,程序無法正常運行竣稽。
看了錯誤的提示信息后,我們應(yīng)該能粗略的懂得霍弹,在程序的第二行(line 2)毫别,在字符串創(chuàng)建的時候出現(xiàn)了問題,這樣我們就能迅速的定位到錯誤代碼發(fā)生的位置典格,改正它岛宦!以下是修改正確后的結(jié)果。
輸入代碼
# 在這里寫上你的代碼 :-)
address = '安徽省 合肥市'
print(address)
運行結(jié)果
3.1.2 字符串問題處理
現(xiàn)在來看看一個亂七八糟的字符串例子耍缴,它會讓Python顯示一條錯誤信息:
輸入代碼
# 在這里寫上你的代碼 :-)
words = 'he said, "Hi I'm ten years old,what's your name?"'
print(words)
運行結(jié)果
在程序第二行砾肺,我們想要創(chuàng)建一個由單引號括起來的字符串(變量的名叫words挽霉,但是其中混著一些帶有單引號的詞I'm和what's,還有一對he said后面的雙引號变汪。太亂了侠坎!要記住Python可沒有人那么聰明。當(dāng)Python看到一個引號時(無論是單引號還是雙引號)疫衩,它期望在同一行的后面是一個從第一個引號開始到下一個對應(yīng)的引號(無論是單引號還是雙引號)結(jié)束的字符串硅蹦。在這個例子中,字符串是從Hi之前的一個單引號標(biāo)記開始闷煤,對于Python來講童芹,這個字符串的結(jié)尾是在I’m的I之后的那個單引號。
Mu中的最后一行告訴我們出現(xiàn)了什么類型的錯誤鲤拿。在本例中假褪,這是個語法錯誤。
使用雙引號來代替單引號的話近顷,仍然會產(chǎn)生錯誤:
輸入代碼
# 在這里寫上你的代碼 :-)
words = "he said, "Hi I'm ten years old,what's your name?""
print(words)
運行結(jié)果
這一次生音,Python看到了一個由雙引號括起來的字符串內(nèi)容為:He said,(結(jié)尾還有一個空格)窒升,做了更改后還是發(fā)生了錯誤缀遍。這是因為從 Python 的角度來講,所有這些額外的東西根本就不應(yīng)該在那里饱须。Python只知道要找到下個對應(yīng)的引號域醇,但卻不知道你寫在同一行上的后面的那些東西是想做什么。
?解決這個問題的方法就是用多行字符串蓉媳,就是使用三個單引號(’’’)譬挚,它可以讓我們在字符串中加入單引號和雙引號而不會引起錯誤。事實上酪呻,如果我們用三個單引號的話减宣,我們可以在字符串中放入任意單引號和雙引號的組合(只要不把三個單引號放進去就行)。 我們那個字符串無錯的版本是這樣的:
輸入代碼
# 在這里寫上你的代碼 :-)
words = '''he said, "Hi I'm ten years old,what's your name?"'''
print(words)
運行結(jié)果
哇塞玩荠!經(jīng)歷了一波三折終于解決了漆腌!其實我們還有另外一種辦法解決這個問題。在 Python里阶冈,如果你真的很想用單引號或者雙引號而不是三個單引號來括起的字符串的話屉凯, 你可以在字符串中間的每個引號前加上一個反斜杠(\)。這叫做“轉(zhuǎn)義”(escaping)眼溶。我們用這種方式告訴 Python:“是的,我知道在我的字符串中間有引號晓勇,希望你忽略它們直到看見結(jié)束的那個引號為止堂飞。我在字符串里面放進了引號灌旧,請忽略它,接著向下找結(jié)束的那個引號去吧绰筛!”
一般來說轉(zhuǎn)義的字符串很難閱讀枢泰,所以更好的方法可能還是用多行字符串÷霖可是你還是有可能會碰到使用轉(zhuǎn)義的代碼片段衡蚂,所以最好也要了解一下為什么用到了反斜杠。
?下面是兩種不同的轉(zhuǎn)義使用方法骏庸,但是都能達到同樣的效果毛甲。
輸入代碼
# 在這里寫上你的代碼 :-)
words1 = 'he said, "Hi I\'m ten years old,what\'s your name?"'
words2 = "he said, \"Hi I'm ten years old,what's your name?\""
print(words1)
print(words2)
運行結(jié)果
首先,在word1中具被,我們用單引號創(chuàng)建了一個字符串玻募,在字符串里面的每個單引號前面加上了反斜杠。在word2中一姿,我們用雙引號創(chuàng)建了一個字符串七咧,在字符串里的那些雙引號前面加上了反斜杠。在接下來的那幾行上叮叹,我們把剛剛創(chuàng)建的變量打印出來艾栋。請注意反斜杠字符不會出現(xiàn)在我們打印出的字符串里。
3.1.3 字符串中的數(shù)值
如果你想顯示一條使用變量中內(nèi)容的信息蛉顽,你可以用%s來把值嵌入到字符串里面蝗砾,它就像為你以后所要加入的值占著位置。我們程序員也喜歡稱它為占位符號蜂林,簡稱占位符遥诉,例如,要想先讓Python計算或者存儲你在某游戲中的得分噪叙,然后把它加入到像“我得到了__分”這樣的一句話中矮锈,可以在這句話中用%s來代替即將要計入的值,然后告訴Python這個值是什么睁蕾。就像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
myScore = 98
message = "今天編程苞笨,我的成績得到了 %s 分"
print(message % myScore)
運行結(jié)果
在這里,我們創(chuàng)建了一個變量myScore(我的得分)子眶,它的值是98瀑凝,還創(chuàng)建了一個變量 message(信息),這個字符串的內(nèi)容是“我得到了%s分”臭杰,其中的%s得分的占位符粤咪。在下一行里,我們在對print(message %
myScore) 的調(diào)用中使用%符號來告訴Python把%s替換成保存在變量 myScore中的值渴杆。打印這個信息的結(jié)果是“今天編程寥枝,我的成績得到了%s分”宪塔。這里的值不是必須用變量來替換。我們同樣也可以寫成print(message % 98)囊拜。
對于同一個%s占位符某筐,我們可以用不同的變量來傳給它不同的值,就像下面這個例子:
輸入代碼
# 在這里寫上你的代碼 :-)
subjectMath = '數(shù)學(xué)'
subjectCoding = '編程'
message = "今天%s 冠跷,我的成績得到了98分"
print(message % subjectMath)
print(message % subjectCoding)
運行結(jié)果
在這里南誊,我們創(chuàng)建了三個變量。第一個蜜托,subjectMath(數(shù)學(xué)科目)抄囚,第二個,subjectCoding(編程科目)和內(nèi)容為帶有%s標(biāo)記的message字符盗冷。在打印變量message時怠苔,我們可以再次用%運算符,使用subjectMath或subjectCoding的內(nèi)容來進行替換%s的內(nèi)容仪糖,從而產(chǎn)生不同的信息柑司。在一個字符串中你也可以使用多個占位符,就像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
name = 'crazyRobot'
year = 12
words = 'Hi my name is %s,I\'m %s years old!'
print(words % (name, year))
運行結(jié)果
3.1.4 字符串的乘法
10乘以5等于什么锅劝?答案當(dāng)然是50攒驰。可是5乘以crazyRobot呢故爵?下面是Python給出的答案:
輸入代碼
# 在這里寫上你的代碼 :-)
name = 5 * 'crazyRobot'
print(name)
運行結(jié)果
3.1.5字符串的加法
12加上33等于多少玻粪?答案當(dāng)然是50∥艽梗可是“hello”加上“Robot”呢劲室?下面是Python給出的答案。
輸入代碼
# 在這里寫上你的代碼 :-)
shows = 'hello' + 'Robot'
print(shows)
運行結(jié)果
可以看到结窘,一個字符串加上另一個字符串很洋,其實是將“+”號左右兩側(cè)的字符串拼接組合了在一起的,就像我們把“=”號讀作賦值一樣隧枫,在以后我們會把“+”號應(yīng)用在字符串中喉磁,我們讀作拼接。
經(jīng)過字符串的學(xué)習(xí)后官脓,我們可以利用這個功能來用Python對字符串完成一定數(shù)量的空格對齊协怒。下面,讓我們在Mu程序中打印一封信卑笨。
案例:一封信件
輸入代碼
# 在這里寫上你的代碼 :-)
spaces = ' '
star = '*'
end = '孕暇。'
head = '尊敬的XXX'
regards1 = '%s您好!'
regards2 = '%s此致'
regards3 = '敬禮!'
yourName = '%s您的:___'
dateTime = '%s__年__月__日'
print(head)
print(regards1 % (spaces * 3))
print()
print((spaces * 3) + (star * 40))
print(star * 43)
print(star * 20 + end)
print(regards2 % (spaces * 3))
print(regards3)
print()
print(yourName % (spaces * 35))
print()
print(dateTime % (spaces * 32))
運行結(jié)果
案例:信件印刷機
輸入代碼
# 在這里寫上你的代碼 :-)
spaces = ' '
cut = '——'
name = input('請輸入收件人名稱:')
head = '尊敬的%s'
regards1 = '%s您好妖滔!'
regards2 = '%s此致'
regards3 = '敬禮派草!'
friend = input('請輸入你們的關(guān)系:')
yourName = '%s您的:%s'
date = input('請輸入寫信的時間:')
print(cut * 22)
dateTime = '%s%s'
print(head % name)
print(regards1 % (spaces * 3))
print((spaces * 3) + '自從去年在機器人教室分別,好久不見铛楣,你還好嗎?')
print('我在上周周末艺普,已經(jīng)完成了所有樂高機器人的學(xué)習(xí)簸州,現(xiàn)在')
print('打算學(xué)習(xí)Python代碼編程了,要一起來嗎歧譬?')
print(regards2 % (spaces * 3))
print(regards3)
print(yourName % (spaces * 32, friend))
print(dateTime % (spaces * 32, date))
運行結(jié)果
除了用乘法來對齊岸浑,我們也可以用它來讓屏幕上充滿無聊的信息。你可以自己試試這個瑰步。
輸入代碼
# 在這里寫上你的代碼 :-)
print(10000 * '01010011')
3.2 強大的列表——Lists
“擎天柱矢洲、大黃蜂、爵士缩焦、救護車读虏、鐵皮、霸天虎袁滥、威震天盖桥、紅蜘蛛。题翻。揩徊。。嵌赠。塑荒。”相信看過《變形金剛》的同學(xué)姜挺,對這些文字并不陌生齿税,對,沒錯初家,這是《變形金剛》里面人物的名字偎窘,那這些跟我們要學(xué)習(xí)的列表有什么關(guān)系呢?現(xiàn)在我們要用它來作為例子來看看字符串和列表有什么不同溜在。
我們可以把清單上的這一系列元素用字符串的形式放到變量?Transformers?中:
輸入代碼
# 在這里寫上你的代碼 :-)
transformers = '擎天柱,大黃蜂,爵士,救護車,鐵皮,霸天虎,威震天,紅蜘蛛'
print(transformers)
運行結(jié)果
但我們也可以創(chuàng)建一個列表(list)陌知,這是一種強大而又有點魔力的Python對象,我們可以操縱它掖肋。下面是這些元素寫成列表的樣子:
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂', '爵士',
??????????????????? '救護車', '鐵皮', '霸天虎',
??????????????????? '威震天', '紅蜘蛛'
??????????????????? ]
print(transformersList)
運行結(jié)果
可能你暫時還沒有發(fā)現(xiàn)仆葡,創(chuàng)建一個列表而是一個字符串的優(yōu)勢在哪里,甚至?xí)X得創(chuàng)建一個列表比創(chuàng)建一個字符串要多敲幾下鍵盤。但是我要明確告訴你沿盅,列表比字符串更有用把篓,因為我們可以對它進行操作。例如腰涧,在方括號([])中輸入列表中的位置(這叫“索引位置”韧掩,像座位號一樣),我們就可以打印transformersList中的第幾個元素(大黃蜂)窖铡。就像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂', '爵士',
??????????????????? '救護車', '鐵皮', '霸天虎',
??????????????????? '威震天', '紅蜘蛛'
??????????????????? ]
print(transformersList[1])
運行結(jié)果
唉疗锐?這不是列表中的第二個元素嗎?是的费彼,但是列表是從位置0開始索引滑臊,所以列表中的第一個元素是0,第二個是1箍铲, 然后第三個是2雇卷,以此方式延續(xù)往后推。這對于我們?nèi)祟悂碇v可能說不通颠猴,但對計算機來講就是這樣的关划。改變列表中的-個元素,比起在字符串中要容易多了芙粱〖烙瘢可能我們不想要威震天了,而想要鋼索春畔。下面是Python如何讓我們的列表做到這個的:
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂', '爵士',
??????????????????? '救護車', '鐵皮', '霸天虎',
??????????????????? '威震天', '紅蜘蛛'
??????????????????? ]
transformersList[6] = '鋼索'
print(transformersList)
運行結(jié)果
這樣就把索引位置6中原來是威震天的元素設(shè)置為鋼索了脱货。
另一個操作是顯示列表的一部分。我們通過在方括號中使用冒號(:)來做到這一點律姨。例如振峻,輸入下面的代碼就能看到從第二個到第五個元素組成的一個新列表汽車人autobots。
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂', '爵士',
??????????????????? '救護車', '鐵皮', '霸天虎',
??????????????????? '威震天', '紅蜘蛛'
??????????????????? ]
autobots = transformersList[2:5]
print(autobots)
運行結(jié)果
寫上[2:5]就如同在說:“顯示從索引位置2直到(但不包含)索引位置5的元素”择份, 換句話 說扣孟, 就是元素2、3和4荣赶。列表可以用來存放各種元素凤价,比如數(shù)字:
輸入代碼
# 在這里寫上你的代碼 :-)
numbers = [15, 2, 3, 8]
還可以把數(shù)字和字符串混合在一起:
輸入代碼
# 在這里寫上你的代碼 :-)
something = [15, 'crazyRobot', 2, 3, 8, '擎天柱']
列表中甚至可以保存其他列表:
輸入代碼
# 在這里寫上你的代碼 :-)
strings = ['nice', 'to', 'meet', 'you', '!']
numbers = ['45', '2', '2', '17', '22', '36']
newList = [strings, numbers]
print(newList)
運行結(jié)果
這個列表中又有列表的例子中(讀起來有點拗口)創(chuàng)建了三個變量:strings中有五個字符串,其中也包含了感嘆號的字符串拔创,numbers中有六個數(shù)字利诺,其中還有重復(fù)的數(shù)字,newList列表中是strings和numbers剩燥。第三個列表(newList)只有兩個元素慢逾,因為它是變量名的列表,而不是這些變量的內(nèi)容組成的列表。
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂'
??????????????????? ]
transformersList.append('紅蜘蛛')???????????????????
print(transformersList)
運行結(jié)果
你可以把append()當(dāng)作一個很好用的工具侣滩,可以一直往變形金剛列表transformersList中增加人物名稱信息口注,像這樣:
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂'
??????????????????? ]
transformersList.append('龍風(fēng)暴')
transformersList.append('路障')
transformersList.append('熱破')
print(transformersList)
運行結(jié)果
剛剛我們使用了append()不斷往列表增加新的元素數(shù)據(jù),那么反過來如何進行刪除減少的呢君珠?這事我們需要使用del命令寝志,使用del命令(delete,刪除的縮寫)加上要刪除的列表中元素的索引信息策添,將該元素從列表中刪除澈段。
輸入代碼
# 在這里寫上你的代碼 :-)
transformersList = [
??????????????????? '擎天柱', '大黃蜂', '爵士',
??????????????????? '救護車', '鐵皮', '霸天虎',
??????????????????? '威震天', '紅蜘蛛'
??????????????????? ]
del transformersList[2]
print(transformersList)
運行結(jié)果
列表還可以做運算,想不到吧舰攒!下面讓我們看一下列表的相加。
輸入代碼
# 在這里寫上你的代碼 :-)
strings = ['nice', 'to', 'meet', 'you', '!']
numbers = ['45', '2', '2', '17', '22', '36']
newList = strings + numbers
print(newList)
運行結(jié)果
從上面Python程序運行的結(jié)果我們可以看得出悔醋,兩個列表的相加其實可以像我們之前做字符串相加一樣摩窃,“+”號在字符串和列表中可以理解為“+”號前后數(shù)據(jù)的拼接、連接芬骄。
我們也可以把列表乘以一個數(shù)字猾愿。例如:
輸入代碼
# 在這里寫上你的代碼 :-)
strings = [12, 10]
print(strings * 6)
運行結(jié)果
這實際上就是告訴Python把列表strings重復(fù)六次。
然而除法(/)和減法(-)只會產(chǎn)生錯誤账阻,就像下面一樣:
輸入代碼
# 在這里寫上你的代碼 :-)
strings = [12, 10]
print(strings / 6)
運行結(jié)果
輸入代碼
# 在這里寫上你的代碼 :-)
strings = [12, 10]
print(strings - 6)
運行結(jié)果
可這是為什么呢蒂秘?這個么,用“+”號來連接列表和用“*”號來重復(fù)列表都是很直接明了的操作淘太。這些概念在現(xiàn)實世界中也說得通姻僧。例如,如果我交給你兩張購物清單的紙蒲牧,然后和你說:“把這兩個單子加在一起”撇贺,你可能就會在另一張紙上把所有的元素都從頭到尾按順序?qū)懸槐椤M瑯尤绻艺f:“把這個列表翻3倍”冰抢,你也會想到再用一張紙把所有的列表元素寫三遍松嘶。
但是怎么給列表做除法呢?例如挎扰,你將一個列表通過“/”號來表達除法翠订,你是想讓這個列表拆分為6個呢?還是想讓列表中的元素除以6呢遵倦?那如果列表中的元素不是數(shù)值而是字符串又該如何做與整數(shù)的除法呢尽超?如果你有了這個思維,相信應(yīng)該很好理解這一樣的行為是行不通的骇吭。
在計算機編程中橙弱,每次你輸入同一個命令它都應(yīng)該完全以同樣的方式工作。計算機這個笨蛋看東西非黑即白。如果讓它來做個混亂不清的決定棘脐,那它就只能舉手投降斜筐,報出錯誤來。
案例——治愈選擇困難癥的機器人
輸入代碼
# 在這里寫上你的代碼 :-)
import random
menuList = [
??????????????????? '臭豆腐', '海帶排骨湯', '土豆燒雞',
??????????????????? '紅燒肉', '油燜茄子', '天麻烏雞湯',
??????????????????? '三河小炒', '獅子頭', '雞丁米線',
??????????????????? '夫妻肺片', '蛋炒飯', '蘭州拉面',
??????????????????? '番茄炒雞蛋', '淮南牛肉湯', '炸雞',
??????????????? ????'去隔壁蹭飯', '黃燜雞米飯', '西北風(fēng)'
??????????????????? ]
food = random.choice(menuList)
print('別再說你不知道吃什么蛀缝,這頓飯你可以選擇:', end='')
print(food)
運行結(jié)果
還好我不是去隔壁蹭飯吃顷链,也不是去喝西北風(fēng),程序隨機選擇結(jié)果是讓我去吃油燜茄子屈梁,你也來試一下吧嗤练!這個程序?qū)V尾恢涝摮允裁达埖拿 ?/p>
3.4 你學(xué)會了什么
在這一課里,你學(xué)到了Python是如何用字符串來保存文字的在讶,學(xué)會了使用占位符來嵌入你想在字符串中嵌入的數(shù)據(jù)信息煞抬,以及它是如何用列表來處理多個元素的。你明白了列表中的元素可以改變构哺,可以增加革答、刪減、修改曙强,通過索引的方式對列表進行查詢残拐,list列表具有非常齊全的功能,并且你可以把一個列表和另一個列表連在一起碟嘴。