目錄
在說明 Python 基礎語法前,先說明一下 Python 的運作原理,要執行 Python 程式碼,必須要有 Python 直譯器,透過 Python 直譯器來解釋程式碼的意思並執行,而 Python 直譯器可以透過兩種不同的方式來接收程式碼,一種是傳入參數 (pass parameters) 的形式;另一種則是互動模式 (interactive mode),可以參考以下範例說明。
# 檢視程式碼
D:\czcit\py>more hello.py
msg = "Hello World"
print(msg)
# 將程式碼以參數形式傳入
D:\czcit\py>python hello.py
Hello World
# 互動模式
D:\czcit\py>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> msg="Hello World"
>>> print(msg)
Hello World
>>> quit()
D:\czcit\py>
接下來我們來練習 Python 基礎語法,而這些語法我們都透過互動方式來練習,因為可以立刻看到結果,首先打開上節介紹的 hello.py,按下播放鍵,就會出現下面的終端面板,在終端面板中輸入 python 就可以進入 Python 互動模式
圖 1. 進入 Python 互動模式
直譯器就像一個簡單的計算器一樣,可以在裡面輸入一個運算式(Expression)是然後它會計算出答案。運算式的語法很直接,運算子(Operator) +、-、*、/ 的用法和其他大部分語言一樣(比如 Java 或是者 C 語言),括號 () 用來分組。比如:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5
1.6
除法運算 (/) 永遠返回浮點數類型 (floor type)。如果要做浮點數除法 (floor division) 得到一個整數結果,可以使用 // 運算子;如果要計算餘數,可以使用 %;可以使用 ** 運算子來計算乘方;Python中提供浮點數的完整支持,包含多種混合類型運算數的運算會把整數轉換為浮點數。
>>> 17 / 5
3.4
>>> 17 // 5
3
>>> 17 % 5
2
>>> (17 // 5) ** 2
9
>>> 17 / 5 + 2
5.4
等號 (=) 用於給一個變數賦值,然後在下一個交互提示符之前不會有結果顯示出來;如果一個變數未定義(未賦值),試圖使用它時會向你提示錯誤,此外,變數名稱是有區分大小寫的。
>>> width = 21
>>> height = 25
>>> width * height
525
>>> W
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'W' is not defined
>>> width
21
>>> Width
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Width' is not defined
在互動模式下,上一次打印出來的運算式被賦值給變數底線 _。這意味著當你把Python用作計算器時,繼續計算會相對簡單,這個變數被當作是只讀類型,不要向它賦值,這樣會創建一個和它名字相同獨立的本地變數,而導致它會覆蓋掉原來的內部變數。
>>> width = 21
>>> height = 25
>>> width * height
525
>>> _ / 2
262.5
>>> _ = 10
>>> 5+8
13
>>> 5+_
15
程式中通常會放一些說明用文字,這些文字並不需要被執行,但對於程序員而言是很重要的提示,用來說明後續程序的意義,#就是用來標示後方文字為註解,在源碼文件中,三重引號 """...""" 或 '''...''' 中的文字都是註解。
>>> # 底下為練習設定 _ 為變數時所造成的影響
>>>
>>> _ = 10
>>> 5+8
13
>>> 5+_
15
可以發現加上註解後,程式執行是一樣的,但很清楚地知道以下程式的功能。
Python 與大多數其它語言一樣有局部變數和全局變數之分,但是它沒有明顯的變數聲明,變數通過首次賦值產生,當超出作用範圍時自動消亡。 Pyhon 允許一次賦多值。
>>> v = ('a', 'b', 'e')
>>> (x, y, z) = v
>>> x
'a'
>>> y
'b'
>>> range(3)
[0, 1, 2]
>>> (x, y, z) = range(3)
>>> x
0
>>> y
1
Python 可以操作字串,字串有多種形式,可以使用單引號('...')或雙引號("...")都可以獲得同樣的結果。反斜槓 \ 是跳脫字元,可以用來將對它後續的幾個字元進行替代並解釋。 print() 函數會生成可讀性更強的輸出,即略去兩邊的引號,並且印出經過轉義的特殊字元。
>>> str1 = 'Hello World, '
>>> str2 = "World Hello, "
>>> str3 = "I'm fine. "
>>> str4 = 'I\'m fine. '
>>> print(str1,str2,str3,str4)
Hello World, World Hello, I'm fine. I'm fine.
如果不希望前置了 \ 的字元轉義成特殊字元,可以使用原始字串方式,在引號前添加 r 即可。
>>> # 將 \name 視為 \n 換行
>>> print('C:\some\name')
C:\some
ame
>>> # 透過 r' 指出使用原始字串
>>> print(r'C:\some\name')
C:\some\name
>>> # 透過 f' 指出使用格式化format字串
>>> s = r'C:\some\name'
>>> print(f"display string {s}")
display string C:\some\name
字串字面值(String Literals)可以跨行連續輸入。一種方式是用三重引號 """...""" 或 '''...''',字串中的換行會自動包含到字串中,如果不想包含,在行尾添加一個 \ 即可。如下例:
>>> print("""\
... Hi,
... It is a letter from Python.
... """)
Hi,
It is a letter from Python.
字串可以用 +加號 進行連接字串與字串,可以用 ,逗號 進行連接數字與字串,可以用 * 進行重復;相鄰的兩個或多個字串字面值會自動連接到一起,對很長的字串拆開分別輸入的時候尤其有用,但只能對兩個字面值這樣操作,變數或運算式不行;如果想連接變數,或者連接變數和字面值(Literals),可以用 + 號。
>>> # 'un' 重復 3 次,與 'ium' 進行連接
>>> 3 * 'un' + 'ium'
'unununium'
>>> print('un 重復 ', 3, '次')
un 重復 3 次
>>> # 相鄰的兩個或多個字串字面值連接到一起
>>> text = ('Put several strings within parentheses '
... 'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
>>> # 只能對兩個字面值這樣操作,變數或運算式不行
>>> prefix = 'Py'
>>> prefix 'thon'
File "<stdin>", line 1
prefix 'thon'
^
SyntaxError: invalid syntax
>>> # 用 + 號連接變數和字面值
>>> prefix + 'thon'
'Python'
字串是可以被索引 (index) 的,第一個字元索引是 0,索引也可以用負數,這種會從右邊開始數,注意 -0 和 0 是一樣的,所以負數索引從 -1 開始;單個字元並沒有特殊的類型,只是一個長度為一的字串。
>>>
>>> word = 'Python'
>>> word[0]
'P'
>>> word[-1]
'n'
# 下方為索引的對應關係
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
除了索引,字串還支持切片 (Slice),索引可以得到單個字元,而切片可以獲取子字串,切片的開始是被包括在結果中,而結束不被包括。切片的索引有默認值;省略開始索引時默認為 0,省略結束索引時默認為到字串的結束,這使得 word[:i] + word[i:] 等於 word。
>>> # 從索引 0 開始(包含),到 2 為止(不包含)
>>> word[0:2]
'Py'
>>> # 省略開始索引時默認為 0
>>> word[:2]
'Py'
>>> # 省略結束索引時默認為到字串的結束
>>> word[4:]
'on'
>>> # 從索引 -2 開始(包含),到字串的結束
>>> word[-2:]
'on'
>>> word[:2] + word[2:]
'Python'
試圖使用過大的索引會產生一個錯誤;但是,切片中的越界索引會被自動處理。
>>> # word 只有 6 個字元,過大的索引會產生一個錯誤
>>> word[42]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> # 切片中的越界索引會被自動處理
>>> word[4:42]
'on'
Python 中的字串不能被修改 (immutable),因此,指向字串的某個索引位置賦值會產生一個錯誤;如果需要一個不同的字串,應當新建一個,當新建一個字串時,並非修改字串內容,而是產生了一個新的物件內容,可以看出所在記憶體位置不同;內建函數 len() 返回一個字串的長度。
>>> # 字串不能被修改
>>> word[0] = 'J'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> # 新建一個字串
>>> id(word)
4396900976
>>> word = 'J' + word[1:]
>>> word
'Jython'
>>> id(word)
4397972144
>>> # len() 返回一個字串的長度
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
>>> word = 'Python'
>>> word.split('t')
['Py', 'hon']
>>> word.replace('th',"TH")
'PyTHon'
>>> word.upper()
'PYTHON'
>>> word.lower()
'python'
>>> word.join([' A ',' B ', ' C '])
' A Python B Python C '
>>> str = '%s %s % d' % ('hello','world',10)
>>> print(str)
hello world 10
最後我們以一個簡單的例子來看 Python 是如何處理程序區塊的
>>> # 判斷 a, b 兩值的大小
>>> a, b = 5, 10
>>> if a > b:
... # 區塊 1
... print(a , " > " , b)
... print(a , " 大於 " , b)
... else:
... # 區塊 2
... print(a , " <= " , b)
... print(a , " 小於或等於 " , b)
...
5 <= 10
5 小於或等於 10
第一行含有一個 多重賦值,變數 a 和 b 同時得到了新值 5 和 10,右手邊的運算式是從左到右被求值的。
if 條件判斷只要它的條件(這裡指 a > b)為真就會執行區塊 1,不然就執行區塊 2。Python 和 C 一樣,任何非零整數都為真,零為假。這個條件也可以是字串或是列表的值,事實上任何序列都可以;長度非零就為真,空序列就為假。
區塊 1, 2 是縮進 (indent) 的,縮進是 Python 組織語句的方式。在交互式命令行裡,你得給每個縮進的行敲下 Tab 鍵或者(多個)空格鍵。實際上用文本編輯器的話,大多數的專業文本編輯器都有自動縮進的設置。交互式命令行裡,當一個組合的語句輸入時, 需要在最後敲一個空白行表示完成(因為語法分析器猜不出來你什麼時候打的是最後一行)。注意,在同一塊語句中的每一行,都要縮進相同的長度。