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. 如果程序讓用戶輸入一個數字,用戶卻輸入了字符串,會發生什麼事?寫個程序嘗試一下。用你現在所學的知識,能否解釋為什麼會發生這些事?