Python/变量和字符串

本节介绍 Python 中两种不同的数据类型——变量和字符串。请运行以下程序片段,并对照其输出结果学习。如果你的 Python 版本和此处的代码不符,可单击“Python 2.x”或“Python 3.x”旁边的“切换”来选择不同版本。

变量 编辑

变量是一个可能会发生改变的值。简而言之,变量像一个盒子,可以往里装任何东西。现在我们只研究把数字放在里面的情形,例如:

lucky = 7
print(lucky)

在这个程序中,我们把 lucky 赋值为7。然后,Python 在屏幕中打印出 lucky 的数值。

现在,我们来试着改变变量的值:

changing = 3
print(changing)

changing = 9
print(changing)

different = 12
print(different)
print(changing)

changing = 15
print(changing)

在这个程序中,我们定义一个变量changing, 把它赋值为 3 ,然后让 Python 告诉我们changing是多少。接着我们让changing把它赋值为9,再问问 Python 现在changing等于多少。 Python 把原来的3丢掉,换成了9,所以它告诉我们现在changing等于9。接下来,我们构造了第二个变量,将其命名为different,并给它赋值12。接下来问 Python differentchanging各是多少,它告诉我们分别是129。因此,一个变量改变时任何其他的变量都不会受影响。变量改变时,它会丢弃原先的值而留下新的值,例如接下来我们把changing再次赋值为15(原来是9),那么9被丢弃了, Python 告诉我们现在changing等于15

你也可以把另一变量的值赋给一个变量,例如:

red = 5
blue = 10
print(red, blue)

yellow = red
print(yellow, red, blue)

red = blue
print(yellow, red, blue)

这个程序稍微复杂了些。请记住,我们永远把变量名写在赋值号(=)左边,写在赋值号右边——先名后值。

首先我们令red5blue10。第三行中我们用逗号分隔,一次性在屏幕上打印两个变量,其间会用一个空格分隔。所以, Python 输出了5 10,也就是说red等于5blue等于10。 现在,我们构造第三个变量yellow,然后让 yellow 的值等于 red 的值(再回忆一遍:变量名在左边,值在右边) 。Python 知道 red 等于 5,所以它就让 yellow 也等于 5。最后我们让 Python 告诉我们三个变量的值: yellow5red5blue 仍为 10

接着我们来把 red 设为 blue 的值。别弄混了——变量名在左边,值在右边。 Python 记得 blue 的值等于 10 ,于是就把 red 原先的值(5)丢弃,换成了 blue 的值。最后, Python 输出三个变量的值: yellow5red10blue10

但我们之前(代码第5行)不是让 yellow 等于 red 的值了吗?事实上, red 变为 10yellow 仍为 5 ,这是因为 yellow 只是在我们让它等于 red才关心后者的值。在这之后,它们就没什么关系了。 yellow 的值并不会影响 red 的值,反之亦然。

注:
也有一类变量在赋值之后,一个的值变了另一个会跟着改变。这种变量称为可变对象;而文中提到的数字则是不可变对象。这些将在后续内容中介绍。

关于变量的内容,目前了解这些就足够了,我们在之后还会回过头来更深入地讨论。一定要记住(这是第四遍了):当你给变量赋值时,把变量名写在赋值号左边,写在赋值号右边。

字符串 编辑

字符串就是一串按顺序排列的字符。凡是你能用键盘在屏幕上打出来的都称为字符,比如汉字、字母、数字、空格。例如,"hello"就是一个字符串,它的长度是5—— hello。字符串里也可以有空格:"hello world"包含11个字符,其中有一个是"hello" 和 "world"之间的空格。字符串的长度没有上限——你可以构造只有一个字符的字符串,也可以构造长度为一百万的字符串。字符串的长度也可以是0,我们叫它“空字符串”。

在 Python 中有三种方法构造一个字符串:单引号(')、双引号(")、三个双引号("""),在字符串前后加上其中任何一个(但必须统一,例如不能前面用单引号后面用双引号)即可。例如:

>>> print('I am a single quoted string')
I am a single quoted string
>>> print("I am a double quoted string")
I am a double quoted string
>>> print("""I am a triple quoted string""")
I am a triple quoted string

如果字符串中需要用到引号,你可以在它前面加上一个反斜杠(\),让 Python 知道这不是字符串的末尾,而是一个普通的字符。我们把反斜杠称为转义符。如果字符串中需要用到反斜杠,也一样把反斜杠转义即可,即在它前面再加一个反斜杠:

>>> print("So I said, \"You don't know me! You'll never understand me!\"")
So I said, "You don't know me! You'll never understand me!" 
>>> print('So I said, "You don\'t know me! You\'ll never understand me!"')
So I said, "You don't know me! You'll never understand me!" 
>>> print("This will result in only three backslashes: \\ \\ \\")
This will result in only three backslashes: \ \ \

接着我们用简单的程序做示范,来讨论字符串的运算。

print("Hello, world!")

这不就是我们一开始写的程序吗?可见,当初我们其实已经用到了字符串。你可以把两个字符串用 + 拼接起来:

>>> print("Hello, " + "world!")
Hello, world!

注意第一个字符串末尾有一个空格。如果你忘记加上它的话,两个字符串就会紧挨在一起,得到 Hello,world!

你也可以用 * 来复制字符串若干次,如:

>>> print("bouncy, " * 10)
bouncy, bouncy, bouncy, bouncy, bouncy, bouncy, bouncy, bouncy, bouncy, bouncy,

如果你想知道字符串的长度是多少,可以用 len() 函数(len 是英文length的缩写),它接收一个字符串做参数,返回字符串的长度。把字符串放在括号中即可:

>>> print(len("Hello, world!"))
13

字符串和变量 编辑

现在我们学习了字符串和变量两个概念,接下来把它们综合起来。

变量不仅能储存数字,还可以储存字符串:

question = "What did you have for lunch?"
print(question)

这个程序中,我们构造了一个变量 question,并令它等于字符串 "What did you have for lunch?" 。接着,我们让 Python 打印变量 question 的值。注意,这里 question两端没有引号,这表示我们引用的是变量而不是字符串。假如在 question两端加上双引号,Python就会把它当成字符串并输出 question ,而不是 What did you have for lunch?

接着试试别的。现在我们问了用户问题,却不能让用户回答。所以我们改改程序,让用户可以输入他中午吃了什么:

Python 3.xPython 2.x - 切换

question = "What did you have for lunch?"
print question
answer = raw_input()
print "You had " + answer + "! That sounds delicious!"
question = "What did you have for lunch?"
print(question)
answer = input()
print("You had " + answer + "! That sounds delicious!")

为了使用户能够输入字符串,我们在 Python 2.x 下调用了 raw_input() 函数,在 Python 3.x 下则是 input() 函数;该函数能接受用户输入,等用户按下回车时便返回输入的字符串。别忘了在函数名最后加上一对括号!虽然括号内什么也没有,但这对括号必须要加,否则 Python 会告诉你代码出错了。Python 2.x 下也有 input() 函数,它与 raw_input() 函数有一些区别,我们以后会讨论。Python 3.x 则把两个函数统一成了 input()

在这个程序中,我们建立了变量 answer,并把用户输入的字符串放入其中。接下来,我们输出一个新字符串,由字符串"You had " 开头,接着是 answer(其中为用户输入的内容),最后是字符串"! That sounds delicious!"。如上文所述,用加号+把字符串连接起来。

连接数字与字符串 编辑

看看以下程序,你能猜出它是干什么的吗?

Python 3.xPython 2.x - 切换

print "Please give me a number: "
number = raw_input()

plusTen = number + 10
print "If we add 10 to your number, we get " + plusTen
print("Please give me a number: ")
number = input()

plusTen = number + 10
print("If we add 10 to your number, we get " + plusTen)

嗯,也许你会说这个程序让用户输入一个数字,然后把它加上10,并输出结果。那么试着运行一下吧——没想到它竟然报错了!输入数字后,你应该会看到以下错误信息(test.py为程序的文件名,可能与你看到的不相同):

Python 3.xPython 2.x - 切换

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print "If we add 10 to your number, we get " + plusTen
TypeError: cannot concatenate 'str' and 'int' objects
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    plusTen = number + 10
TypeError: must be str, not int

为什么?Python 告诉我们这是一个 TypeError(类型错误)。具体来说,Python 不知道怎么把两个不同类型(字符串和数字)的变量拼接起来。在这里, Python 认为 number 变量存储的是一个字符串而不是数字。例如用户输入 15以后, number 等于一个长度为2的字符串:第一位是 1 ,第二位是 5。那么我们怎么告诉 Python 在这里 15 应该是数字而非字符串呢?

答案很简单,我们有两个函数可以转换字符串和数字。 int() 函数接收一个字符串,把它转换为数字; str() 函数接收一个数字,把它转换为字符串。想调用这两个函数时,我们只要把参数用括号括起来即可。那么像这样修改程序:

Python 3.xPython 2.x - 切换

print "Please give me a number: "
response = raw_input()

number = int(response)
plusTen = number + 10
print "If we add 10 to your number, we get " + str(plusTen)
print("Please give me a number: ")
response = input()

number = int(response)
plusTen = number + 10

print("If we add 10 to your number, we get " + str(plusTen))

注:
也可以给 print 函数多传递一个参数来输出两个字符串,参数之间用逗号连接:

print("If we add 10 to your number, we get ",plusTen)

或者使用格式化字符串:

print("If we add 10 to your number, we get %s" % plusTen)

本节内容到此为止。我们在之后的课程会系统地讨论 Python 的各种类型。

函数回顾 编辑

  • input()raw_input():等待用户输入,返回用户输入字符串。
  • len():返回输入字符串的长度(字符的个数)
  • str():将输入变量转为字符串
  • int():将输入变量转为数字

注:

  1. inputraw_input 可接收一个字符串作为参数,在等待用户输入时该字符串会显示在屏幕上,作为提示文字。
  2. (如果你使用的是 Python 3.x,不必看这条;仅适用于 Python 2.x)两个函数的区别在于,raw_input 把用户的原始输入不加改动地作为字符串储存,而 input 会把用户输入当作 Python 代码执行。所以如果你没有把输入两端用引号括起来,使用 input 输入字符串就会出错。我们强烈推荐你永远使用 raw_input ,并用 int 函数把字符串转为数字。这样我们不用处理那些恼人的错误,也不会遇到任何安全问题。

习题 编辑

  1. 写一个程序,让用户输入一个字符串,并在屏幕上打印该字符串的长度。
  2. 写一个程序,让用户输入一个字符串s和一个数字n。在屏幕上打印n次字符串s。(例如输入的字符串是 hello ,数字是 3 ,则应输出 hellohellohello。)
  3. 如果程序让用户输入一个数字,用户却输入了字符串,会发生什么事?写个程序尝试一下。用你现在所学的知识,能否解释为什么会发生这些事?