iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
Python

在AWS上進行物聯網與人工智慧實作系列 第 3

D03-Python 基礎語法

  • 分享至 

  • xImage
  •  

Python 基礎語法

目錄

在說明 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 互動模式

https://ithelp.ithome.com.tw/upload/images/20240810/20129510sVu6PeD94i.jpg
圖 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

註解 Comments

程式中通常會放一些說明用文字,這些文字並不需要被執行,但對於程序員而言是很重要的提示,用來說明後續程序的意義,#就是用來標示後方文字為註解,在源碼文件中,三重引號 """..."""'''...''' 中的文字都是註解。

>>> # 底下為練習設定 _ 為變數時所造成的影響
>>>
>>> _ = 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

字串的常用操作

  • split(str="", num=-1):通過指定分隔符對字串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字串,-1 表示分割所有。
  • replace(old, new[, max]):返回字串中的 old(舊字串)替換成 new (新字串) 後生成的新字串,如果指定第三個參數 max,則替換不超過 max 次。
  • upper():返回轉化為大寫字元後的值。
  • lower():返回轉化為小寫字元後的值。
  • join(sequence):sequence 要連接的序列 ,返回指定字串連接序列中元素後生成的新字串。
  • 格式化字串:'%s %s %d' % ('hello','world',10),%s 表示字串,%d 表示整數,中間的 % 時連接符號,小括號內是對應前面的參數。
>>> 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 鍵或者(多個)空格鍵。實際上用文本編輯器的話,大多數的專業文本編輯器都有自動縮進的設置。交互式命令行裡,當一個組合的語句輸入時, 需要在最後敲一個空白行表示完成(因為語法分析器猜不出來你什麼時候打的是最後一行)。注意,在同一塊語句中的每一行,都要縮進相同的長度。


上一篇
D02-Python 說明與開發環境
下一篇
D04-Python 基本資料類型
系列文
在AWS上進行物聯網與人工智慧實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言