第 3 课 Python 的字符串与列表
前面的课程中,我们通过Mu软件编程工具让Python做了一些基本的运算,并且学习了变量的概念以及使用。在这一课程里,我们会继续学习Python编程中的另一些内容:字符串(string)、列表( list )。你会学到字符串是用于在程序中显示消息的(比如在游戏里“准备”和“游戏结束”这样的消息),其实上一次的课程我们已经见过了Python字符串,当时我们可能还不知道这一名称,这节课我们将对字符串做更加广阔的学习。本次课你还会学到列表,列表( list )可谓是我们Python用来存储成批东西,使用频率非常的高,让我们一起学习新的知识内容吧!
3.1字符串——strings
在编写程序的术语中,我们通常把文字称为“字符串”(string )。如果你把字符串想象成一堆字的组合的话,这个名字还是挺形象的。本书中的所有的字、数字以及符号都可以是一个字符串。并且你的名字也可以是个字符串,你家的地址也是。事实上,我们创建的第一个 Python程序也用到了一个字符串“Hello World!”。
3.1.1创建字符串
在Python中,我们通过给文本添加引号的方式来创建一个字符串。把文字用引号括起来就创建了字符串。像这样:
输入代码# 在这里写上你的代码 :-)
myName = "my name is ruiQu crazyRobot"
注意,引号一定是英文半角”” 的引号形式,而非中文全角“”的引号形式。然后,在Python中要看看myName里放的是什么,只要在Python输入 print(myName),就像这样:
输入代码# 在这里写上你的代码 :-)
myName = "my name is ruiQu crazyRobot"
print(myName)
运行结果
运行结果
注:以后的运行结果图片,我们只使用程序编辑与运行输出两个窗口。
你也可以用单引号来创建一个字符串,像这样:
输入代码# 在这里写上你的代码 :-)
myName = 'my name is superMan'
print(myName)
运行结果
运行结果
要注意的是:如果你只用一个单引号(’)或者双引号(”)来输入超过一行的文字,或者用一种引号开头并尝试用另一种引号结尾的话,我们的Mu软件代码就会用醒目的颜色提醒你的代码输入有误,例如:
输入代码# 在这里写上你的代码 :-)
address = '安徽省 合肥市
print(address)
运行结果
运行结果
该图是上面输入代码运行的结果,在输入代码的过程中我们其实已经发现了问题,我们在使用字符串对地址address赋值的时候,故意只用了一个单引号(’),立刻就会看到红色背景的提示,这种提示在Mu软件里表示的是一种错误警告,如果我们没有检查,直接点击程序运行,程序无法正常运行。
看了错误的提示信息后,我们应该能粗略的懂得,在程序的第二行(line 2),在字符串创建的时候出现了问题,这样我们就能迅速的定位到错误代码发生的位置,改正它!以下是修改正确后的结果。
输入代码# 在这里写上你的代码 :-)
address = '安徽省 合肥市'
print(address)
运行结果
运行结果
3.1.2字符串问题处理
现在来看看一个乱七八糟的字符串例子,它会让Python显示一条错误信息:
输入代码# 在这里写上你的代码 :-)
words = 'he said, "Hi I'm ten years old,what's your name?"'
print(words)
运行结果
运行结果
在程序第二行,我们想要创建一个由单引号括起来的字符串(变量的名叫words,但是其中混着一些带有单引号的词I'm和what's,还有一对he said后面的双引号。太乱了!要记住Python可没有人那么聪明。当Python看到一个引号时(无论是单引号还是双引号),它期望在同一行的后面是一个从第一个引号开始到下一个对应的引号(无论是单引号还是双引号)结束的字符串。在这个例子中,字符串是从Hi之前的一个单引号标记开始,对于Python来讲,这个字符串的结尾是在I’m的I之后的那个单引号。
Mu中的最后一行告诉我们出现了什么类型的错误。在本例中,这是个语法错误。
使用双引号来代替单引号的话,仍然会产生错误:
输入代码# 在这里写上你的代码 :-)
words = "he said, "Hi I'm ten years old,what's your name?""
print(words)
运行结果
运行结果
这一次,Python看到了一个由双引号括起来的字符串内容为:He said,(结尾还有一个空格),做了更改后还是发生了错误。这是因为从 Python 的角度来讲,所有这些额外的东西根本就不应该在那里。Python只知道要找到下个对应的引号,但却不知道你写在同一行上的后面的那些东西是想做什么。
解决这个问题的方法就是用多行字符串,就是使用三个单引号(’’’),它可以让我们在字符串中加入单引号和双引号而不会引起错误。事实上,如果我们用三个单引号的话,我们可以在字符串中放入任意单引号和双引号的组合(只要不把三个单引号放进去就行)。 我们那个字符串无错的版本是这样的:
输入代码# 在这里写上你的代码 :-)
words = '''he said, "Hi I'm ten years old,what's your name?"'''
print(words)
运行结果
运行结果
哇塞!经历了一波三折终于解决了!其实我们还有另外一种办法解决这个问题。在 Python里,如果你真的很想用单引号或者双引号而不是三个单引号来括起的字符串的话, 你可以在字符串中间的每个引号前加上一个反斜杠(\)。这叫做“转义”(escaping)。我们用这种方式告诉 Python:“是的,我知道在我的字符串中间有引号,希望你忽略它们直到看见结束的那个引号为止。我在字符串里面放进了引号,请忽略它,接着向下找结束的那个引号去吧!”
一般来说转义的字符串很难阅读,所以更好的方法可能还是用多行字符串。可是你还是有可能会碰到使用转义的代码片段,所以最好也要了解一下为什么用到了反斜杠。
下面是两种不同的转义使用方法,但是都能达到同样的效果。
输入代码# 在这里写上你的代码 :-)
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)
运行结果
运行结果
首先,在word1中,我们用单引号创建了一个字符串,在字符串里面的每个单引号前面加上了反斜杠。在word2中,我们用双引号创建了一个字符串,在字符串里的那些双引号前面加上了反斜杠。在接下来的那几行上,我们把刚刚创建的变量打印出来。请注意反斜杠字符不会出现在我们打印出的字符串里。
3.1.3字符串中的数值
如果你想显示一条使用变量中内容的信息,你可以用%s来把值嵌入到字符串里面,它就像为你以后所要加入的值占着位置。我们程序员也喜欢称它为占位符号,简称占位符,例如,要想先让Python计算或者存储你在某游戏中的得分,然后把它加入到像“我得到了__分”这样的一句话中,可以在这句话中用%s来代替即将要计入的值,然后告诉Python这个值是什么。就像这样:
输入代码# 在这里写上你的代码 :-)
myScore = 98
message = "今天编程,我的成绩得到了 %s 分"
print(message % myScore)
运行结果
运行结果
在这里,我们创建了一个变量myScore(我的得分),它的值是98,还创建了一个变量 message(信息),这个字符串的内容是“我得到了%s分”,其中的%s得分的占位符。在下一行里,我们在对print(message %
myScore) 的调用中使用%符号来告诉Python把%s替换成保存在变量 myScore中的值。打印这个信息的结果是“今天编程,我的成绩得到了%s分”。这里的值不是必须用变量来替换。我们同样也可以写成print(message % 98)。
对于同一个%s占位符,我们可以用不同的变量来传给它不同的值,就像下面这个例子:
输入代码# 在这里写上你的代码 :-)
subjectMath = '数学'
subjectCoding = '编程'
message = "今天%s ,我的成绩得到了98分"
print(message % subjectMath)
print(message % subjectCoding)
运行结果
运行结果
在这里,我们创建了三个变量。第一个,subjectMath(数学科目),第二个,subjectCoding(编程科目)和内容为带有%s标记的message字符。在打印变量message时,我们可以再次用%运算符,使用subjectMath或subjectCoding的内容来进行替换%s的内容,从而产生不同的信息。在一个字符串中你也可以使用多个占位符,就像这样:
输入代码# 在这里写上你的代码 :-)
name = 'crazyRobot'
year = 12
words = 'Hi my name is %s,I\'m %s years old!'
print(words % (name, year))
运行结果
运行结果
3.1.4字符串的乘法
10乘以5等于什么?答案当然是50。可是5乘以crazyRobot呢?下面是Python给出的答案:
输入代码# 在这里写上你的代码 :-)
name = 5 * 'crazyRobot'
print(name)
运行结果
运行结果
3.1.5字符串的加法
12加上33等于多少?答案当然是50。可是“hello”加上“Robot”呢?下面是Python给出的答案。
输入代码# 在这里写上你的代码 :-)
shows = 'hello' + 'Robot'
print(shows)
运行结果
运行结果
可以看到,一个字符串加上另一个字符串,其实是将“+”号左右两侧的字符串拼接组合了在一起的,就像我们把“=”号读作赋值一样,在以后我们会把“+”号应用在字符串中,我们读作拼接。
经过字符串的学习后,我们可以利用这个功能来用Python对字符串完成一定数量的空格对齐。下面,让我们在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))
运行结果
程序编写
运行结果
案例:信件印刷机
输入代码# 在这里写上你的代码 :-)
spaces = ' '
cut = '——'
name = input('请输入收件人名称:')
head = '尊敬的%s'
regards1 = '%s您好!'
regards2 = '%s此致'
regards3 = '敬礼!'
friend = input('请输入你们的关系:')
yourName = '%s您的:%s'
date = input('请输入写信的时间:')
print(cut * 22)
dateTime = '%s%s'
print(head % name)
print(regards1 % (spaces * 3))
print((spaces * 3) + '自从去年在机器人教室分别,好久不见,你还好吗?')
print('我在上周周末,已经完成了所有乐高机器人的学习,现在')
print('打算学习Python代码编程了,要一起来吗?')
print(regards2 % (spaces * 3))
print(regards3)
print(yourName % (spaces * 32, friend))
print(dateTime % (spaces * 32, date))
运行结果
程序编写
运行结果
除了用乘法来对齐,我们也可以用它来让屏幕上充满无聊的信息。你可以自己试试这个。
输入代码# 在这里写上你的代码 :-)
print(10000 * '01010011')
3.2强大的列表——Lists
“擎天柱、大黄蜂、爵士、救护车、铁皮、霸天虎、威震天、红蜘蛛。。。。。。”相信看过《变形金刚》的同学,对这些文字并不陌生,对,没错,这是《变形金刚》里面人物的名字,那这些跟我们要学习的列表有什么关系呢?现在我们要用它来作为例子来看看字符串和列表有什么不同。
我们可以把清单上的这一系列元素用字符串的形式放到变量 Transformers 中:
变形金刚剧照
输入代码# 在这里写上你的代码 :-)
transformers = '擎天柱,大黄蜂,爵士,救护车,铁皮,霸天虎,威震天,红蜘蛛'
print(transformers)
运行结果
运行结果
但我们也可以创建一个列表(list),这是一种强大而又有点魔力的Python对象,我们可以操纵它。下面是这些元素写成列表的样子:
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂', '爵士',
'救护车', '铁皮', '霸天虎',
'威震天', '红蜘蛛'
]
print(transformersList)
运行结果
运行结果
可能你暂时还没有发现,创建一个列表而是一个字符串的优势在哪里,甚至会觉得创建一个列表比创建一个字符串要多敲几下键盘。但是我要明确告诉你,列表比字符串更有用,因为我们可以对它进行操作。例如,在方括号([])中输入列表中的位置(这叫“索引位置”,像座位号一样),我们就可以打印transformersList中的第几个元素(大黄蜂)。就像这样:
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂', '爵士',
'救护车', '铁皮', '霸天虎',
'威震天', '红蜘蛛'
]
print(transformersList[1])
运行结果
运行结果
唉?这不是列表中的第二个元素吗?是的,但是列表是从位置0开始索引,所以列表中的第一个元素是0,第二个是1, 然后第三个是2,以此方式延续往后推。这对于我们人类来讲可能说不通,但对计算机来讲就是这样的。改变列表中的-个元素,比起在字符串中要容易多了。可能我们不想要威震天了,而想要钢索。下面是Python如何让我们的列表做到这个的:
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂', '爵士',
'救护车', '铁皮', '霸天虎',
'威震天', '红蜘蛛'
]
transformersList[6] = '钢索'
print(transformersList)
运行结果
运行结果
这样就把索引位置6中原来是威震天的元素设置为钢索了。
另一个操作是显示列表的一部分。我们通过在方括号中使用冒号(:)来做到这一点。例如,输入下面的代码就能看到从第二个到第五个元素组成的一个新列表汽车人autobots。
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂', '爵士',
'救护车', '铁皮', '霸天虎',
'威震天', '红蜘蛛'
]
autobots = transformersList[2:5]
print(autobots)
运行结果
运行结果
写上[2:5]就如同在说:“显示从索引位置2直到(但不包含)索引位置5的元素”, 换句话 说, 就是元素2、3和4。列表可以用来存放各种元素,比如数字:
输入代码# 在这里写上你的代码 :-)
numbers = [15, 2, 3, 8]
还可以把数字和字符串混合在一起:
输入代码# 在这里写上你的代码 :-)
something = [15, 'crazyRobot', 2, 3, 8, '擎天柱']
列表中甚至可以保存其他列表:
输入代码# 在这里写上你的代码 :-)
strings = ['nice', 'to', 'meet', 'you', '!']
numbers = ['45', '2', '2', '17', '22', '36']
newList = [strings, numbers]
print(newList)
运行结果
运行结果
这个列表中又有列表的例子中(读起来有点拗口)创建了三个变量:strings中有五个字符串,其中也包含了感叹号的字符串,numbers中有六个数字,其中还有重复的数字,newList列表中是strings和numbers。第三个列表(newList)只有两个元素,因为它是变量名的列表,而不是这些变量的内容组成的列表。
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂'
]
transformersList.append('红蜘蛛')
print(transformersList)
运行结果
运行结果
你可以把append()当作一个很好用的工具,可以一直往变形金刚列表transformersList中增加人物名称信息,像这样:
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂'
]
transformersList.append('龙风暴')
transformersList.append('路障')
transformersList.append('热破')
print(transformersList)
运行结果
运行结果
刚刚我们使用了append()不断往列表增加新的元素数据,那么反过来如何进行删除减少的呢?这事我们需要使用del命令,使用del命令(delete,删除的缩写)加上要删除的列表中元素的索引信息,将该元素从列表中删除。
输入代码# 在这里写上你的代码 :-)
transformersList = [
'擎天柱', '大黄蜂', '爵士',
'救护车', '铁皮', '霸天虎',
'威震天', '红蜘蛛'
]
del transformersList[2]
print(transformersList)
运行结果
运行结果
列表还可以做运算,想不到吧!下面让我们看一下列表的相加。
输入代码# 在这里写上你的代码 :-)
strings = ['nice', 'to', 'meet', 'you', '!']
numbers = ['45', '2', '2', '17', '22', '36']
newList = strings + numbers
print(newList)
运行结果
运行结果
从上面Python程序运行的结果我们可以看得出,两个列表的相加其实可以像我们之前做字符串相加一样,“+”号在字符串和列表中可以理解为“+”号前后数据的拼接、连接。
我们也可以把列表乘以一个数字。例如:
输入代码# 在这里写上你的代码 :-)
strings = [12, 10]
print(strings * 6)
运行结果
运行结果
这实际上就是告诉Python把列表strings重复六次。
然而除法(/)和减法(-)只会产生错误,就像下面一样:
输入代码# 在这里写上你的代码 :-)
strings = [12, 10]
print(strings / 6)
运行结果
运行结果
输入代码# 在这里写上你的代码 :-)
strings = [12, 10]
print(strings - 6)
运行结果
运行结果
可这是为什么呢?这个么,用“+”号来连接列表和用“*”号来重复列表都是很直接明了的操作。这些概念在现实世界中也说得通。例如,如果我交给你两张购物清单的纸,然后和你说:“把这两个单子加在一起”,你可能就会在另一张纸上把所有的元素都从头到尾按顺序写一遍。同样如果我说:“把这个列表翻3倍”,你也会想到再用一张纸把所有的列表元素写三遍。
但是怎么给列表做除法呢?例如,你将一个列表通过“/”号来表达除法,你是想让这个列表拆分为6个呢?还是想让列表中的元素除以6呢?那如果列表中的元素不是数值而是字符串又该如何做与整数的除法呢?如果你有了这个思维,相信应该很好理解这一样的行为是行不通的。
在计算机编程中,每次你输入同一个命令它都应该完全以同样的方式工作。计算机这个笨蛋看东西非黑即白。如果让它来做个混乱不清的决定,那它就只能举手投降,报出错误来。
案例——治愈选择困难症的机器人
满汉全席照片
输入代码# 在这里写上你的代码 :-)
import random
menuList = [
'臭豆腐', '海带排骨汤', '土豆烧鸡',
'红烧肉', '油焖茄子', '天麻乌鸡汤',
'三河小炒', '狮子头', '鸡丁米线',
'夫妻肺片', '蛋炒饭', '兰州拉面',
'番茄炒鸡蛋', '淮南牛肉汤', '炸鸡',
'去隔壁蹭饭', '黄焖鸡米饭', '西北风'
]
food = random.choice(menuList)
print('别再说你不知道吃什么,这顿饭你可以选择:', end='')
print(food)
运行结果
运行结果
还好我不是去隔壁蹭饭吃,也不是去喝西北风,程序随机选择结果是让我去吃油焖茄子,你也来试一下吧!这个程序专治不知道该吃什么饭的毛病。
3.4你学会了什么
在这一课里,你学到了Python是如何用字符串来保存文字的,学会了使用占位符来嵌入你想在字符串中嵌入的数据信息,以及它是如何用列表来处理多个元素的。你明白了列表中的元素可以改变,可以增加、删减、修改,通过索引的方式对列表进行查询,list列表具有非常齐全的功能,并且你可以把一个列表和另一个列表连在一起。
国防服役——未完待续