變數
變數是什麼?為什麼要使用變數?
想像一下,在教室裡面有 50 個學生,如果你想點名某位同學來問答問題,你會怎麼做? 是「那位紅色外套長頭髮的同學」還是「第 3 排的第 2 位同學」?如果每位同學的桌上都有名牌或座號,應該就能更精準的點到指定的同學。
電腦程式也是類似的概念,在電腦的世界裡有很多的資料或數值,如果能適當的給這些資料一個標籤或名字,在取用的時候會方便的多,變數(Variable)大概就差不多這個意思。
在 Python 裡要使用變數的話,可以這樣寫:
a = 1450
b = "hello"
上面這兩行的意思就是有個名為 a
的變數,它 的值是「數字」 1450
,另外有個名為 b
的變數,它的值是 "hello"
這幾個「文字」。幫資料或數值指定一個名稱或標籤,這個行為稱為「宣告(Declaration)」。有些程式語言在宣告變數的時候要在前面加個 let
或 var
,或是指定這個變數的型別,但在 Python 可以不用做這件事,就像這樣直接就能使用,不需要特別指定它是數字或文字型態(其實要也行,在本章後半段會再另外介紹)。
在後面的章節還會介紹更多除了數字跟文字之外的資料型態,不過變數就只是個名牌、標籤或是指標的概念而已,變數本身是沒有型別的。除了一次命名一個變數外,你也可以一次處理好幾個:
x, y, z = 1, 2, 3
這樣一口氣就可以產生 3 個變數 x
、y
、z
,分別指向數字 1
、2
以及 3
。
Python 的變數多重指定寫法,背後的原理其實是 Tuple(元組)資料型態,所以上面的寫法也可以寫成:
x, y, z = (1, 2, 3)
然後再利用 Tuple 的「開箱(Unpacking)」功能來把 Tuple 的值分別指定給 x
、y
、z
這三個變數,在後續介紹到 Tuple 你就會知道這是怎麼一回事了。
是說,如果想要用這種方式指定變數,但只想要有 x
跟 z
變數卻不想要有 y
變數的話,可以使用 _
來跳掉它:
x, _, z = 1, 2, 3
這個 _
在 Python 又稱之匿名變數(Anonymous Variable)或虛擬變數(Dummy Variable),通常用來表示這個變數「I don't care」的意思。不要誤會,底線 _
在 Python 是個合法的變數名稱,所以如果你要拿它來用是沒問題的:
x, _, z = 1, 2, 3
print(_) # 印出 2
通常對這種我們不在乎或懶得想名字的變數,會給它一個底線 _
來表示。如果用在 Python 的 REPL 的話,_
還能用來代表「上一次的結果」:
>>> 1 + 2
3
>>> _ + 123
126
好啦,現在我們有了變數之後,後續就可以透過變數來取用這些值:
print(a) # 印出 1450
print(b) # 印出 hello
雖然一開始變數 a
是數字 1450
,但如果要改變的話,就直接這樣寫:
a = "world" # 把原本變數 a 變成 "world"
print(a) # 印出 world
直接改就行了,就算從數字改成文字也行。
雖然在 Python 宣告變數不需要什麼特別的語法,但變數需要先宣告才能用,如果突然莫名其妙的使用一個不存在的 girl_friend
變數,像這樣:
print(girl_friend)
執行的時候就會發生錯誤了:
$ python hello.py
Traceback (most recent call last):
File "/demo/hello.py", line 1, in <module>
print(girl_friend)
^^^^^^^^^^^
NameError: name 'girl_friend' is not defined
哇!出現了好多沒看過的東西...別擔心,仔細看的話應該會發現錯誤訊息還算清楚,它跟你在 hello.py
這個檔案的第 1 行,這個 girl_friend
變數還沒有定義,醒醒吧,它是不存在的,所以才會出現 NameError
這個錯誤訊息。
常數(Constant)
有些程式語言有「常數」的設計,常數的目的是希望這個變數的值一經宣告之後就不要再修改,但是在 Python 並沒有常數的設計,如果在 Python 裡如果想要做出類似常數的效果的話,慣例上可以在宣告變數的時候用全大寫的方式來命名,例如:
PI = 3.14159
GRAVITY = 9.8
BOOK_TITLE = "為你自己學 Python"
但這個只是個「慣例」,要改隨時都能改,全大寫只是看起來比較顯眼,目的是希望其他人如果要改動到它的時候多看兩眼。
變數命名
命名規則
在 Python 你想要用什麼名字來命名你的變數都沒關係,用英文、日文或中文都行,雖然是這樣,但還是有一些限制:
1. 變數名稱必須是一般文字或底線 _
開頭
一般文字可以是英文字母,使用中文或日文也都可以,例如:
_name = "5xCampus"
書名 = "為你自己學 Python"
なまえ = "悟空"
Python 的變數名稱有支援多國語言,但還是建議使用英文字母為主。
2. 變數名稱可以使用數字,但不能放在開頭
data2Value = 1 # 這個沒問題
5xcampus = "五倍學院" # 這不行,會造成語法錯誤
3. 大小寫是不一樣的名字
ace = 100
Ace = "黑桃 A"
print(ace) # 印出 100
print(Ace) # 印出 黑桃 A
4. 不能使用保留字(Reserved Keyword)
Python 本身有留一些名字給自己用,目前使用的 3.12.7
版總共有以下這 35 個:
False | None | True | and | as | assert |
---|---|---|---|---|---|
async | await | break | class | continue | def |
del | elif | else | except | finally | for |
from | global | if | import | in | is |
lambda | nonlocal | not | or | pass | raise |
return | try | while | with | yield |
這些保留字大多是 Python 本身會用到的語法,如果你直接拿來當變數名稱的話會造成語法錯誤(SyntaxError):
if = 123 # 不行,這會出錯
pass = True # 這也不行
如 果你好奇 Python 有哪些關鍵字的話,可以打開啟終端機進到 REPL 環境,透過內建的 keyword
模組查到目前使用的 Python 有哪些保留字:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', ...略..., 'yield']
>>> len(keyword.kwlist)
35
這裡可以暫時先不用太在意 import
語法或是 keyword
模組是什麼意思,相關的細節在後續的章節都會有詳細的說明。透過 Python 內建的 len()
函數可以算出來目前的保留字總共有 35 個。
除 了用 keyword
模組列出關鍵字之外,在 REPL 環境中也可以用 help
函數查詢:
>>> help("keywords")
Here is a list of the Python keywords. Enter any keyword to get more help.
False class from or
None continue global pass
...略...
await finally nonlocal yield
break for not
除了一般的關鍵字之外,在 Python 3.10 版之後有加入了「軟」的關鍵字(Soft Keyword),同樣也可以透過 keyword
模組查到:
>>> keyword.softkwlist
['_', 'case', 'match', 'type']
Python 的關鍵字在任何情況下都不能用來當變數名稱,使用的話會直接出現語法錯誤,不過 Soft Keyword 一般情況下不算是關鍵字,只有在特定的情況下,例如後面章節會介紹到模式匹配(Pattern Matching)會用到的 match
跟 case
,這些 Soft Keyword 就會被解析成特殊的意義,平常想要拿來當做變數名稱是可以的, 例如:
>>> match = 123
>>> print(match)
123
>>> _ = "hello"
>>> print(_)
hello
這樣不會發生語法錯誤。是說,可以是可以,但程式能不能正常運作就是另一回事了:
>>> type = 123
# 想看看 "hello" 字串是什麼型別...
>>> type("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
另外有些 Python 內建函數的名字也都不是關鍵字,用來當做變數的名稱雖然不會出錯,但應該也不會是你想要的結果,例如:
print = "Hello World"
print(123) # 這裡會...?
這裡我故意用 print()
這個內建函數來命名變數,同樣也會造成原本的 print()
函數沒辦法正常運作:
TypeError: 'str' object is not callable
經過我們這樣的操作之後,print
變數的值是 "Hello World"
,而不是原本的 print()
函數了。所以在變數命名的時候,最好也盡量避開這些內建的函數。以目前 Python 的 3.12.7 版本,內建函數大概有 70 個左右,詳細的列表可參考官網文章說明。
Python 內建函數 https://docs.python.org/3/library/functions.html