說到 Python,最先想到的就是它簡潔直觀的語言特性,且得利於周邊模組的活躍開發,應用範圍也是五花八門,Python 官方教學文檔是這麼描述它的: ::: info > Python 優雅的語法和動態型別,結合其直譯特性,使它成為眾多領域和大多數平臺上,撰寫腳本和快速開發應用程式的理想語言。 > > Python 官網也提供了許多自由且免費的第三方 Python 模組、程式與工具、以及額外說明文件,有興趣的使用者,可在官網上找到相關的發行版本與連結網址。 > > 使用 C 或 C++(或其他可被 C 呼叫的程式語言),可以很容易在 Python 直譯器內新增功能函式及資料型別。同時,對可讓使用者自製功能的應用程式來說,Python 也適合作為其擴充用界面語言 (extension language)。 Python Documentation: https://docs.python.org/zh-tw/3/tutorial/index.html ::: **但是,代價是什麼呢?** ~~`這一切`~~ 這層亮麗的糖衣(`確實 有很多甜甜的語法糖`),是以執行速度換來的,可以說是程式語言的 RGB 電競烏龜了,不過誰說烏龜不能坐車(C++)啊? |![_fa064477-5331-43bb-a3ab-15454ac8a4d3](https://hackmd.io/_uploads/HyOJ3CRPT.jpg =40%x)| |:----:| |來自 Microsoft 影像建立工具<br>https://lurl.cc/sZti56| <br> 好 上面哩哩摳摳文字很多我知道,估計也沒誰會認真看完。 在進入正題前,還是想提一下: ::: warning * 學程式語言先別急著戰誰優誰劣,一切端看需求。 * 兼聽則明,偏信則暗,學習亦是。 ::: 推薦將 Python 當興趣學,或許這之中學到的知識,會在撰寫其他語言時帶來不同觀點與解法。 本篇文章會介紹一些刷題時會用到的 Python 程式碼。 --- # C++ 與 Python 讀相關科系的學生,不是已經學過 C++ 就是在學的路上。 而本篇要介紹的 Python 跟它真的是完全相反: | | 轉譯方式 | 型別宣告 | 型別系統 | |:------:|:--------:|:--------:|:--------:| | C++ | 編譯 | 靜態 | 弱型別 | | Python | 直譯 | 動態 | 強型別 | 舉個例子,今天有段程式是這樣的: :::info ## 型別宣告 C++ ```C++= int n = 123; string s = "456"; cout << n + s; ``` > C++ 是靜態語言,IDE 會提示兩者不能相加,因為型態不同。 Python ```Python= n = 123 s = '456' print(n + s) ``` > 而 Python 則不會提示,但在執行到 print 指令時報錯。 --- ## 型別系統 C++ ```C++= int n = 1; double d = 1.5; cout << n + d; ``` > C++ 具有隱性轉換特性,於是會得到 2.5。 Python ```Python= n = 1 d = 1.5 print(n + d) ``` > Python 也會得到 2.5,但這是因為它是動態語言,n、d 兩變數都被推斷成浮點數型態。 ::: --- # 多行輸入 在 C++ 要處理多筆資料輸入,你會看到: ```C++= int n while(cin >> n){ // do something... } ``` 而在 Python 除了用 if 來判斷是否跳出迴圈,你還可以利用例外處理: ```Python= while 1: try: n = int(input()) # do something... except EOFError: break ``` > EOFError 是指讀取的檔案到結尾處了。 > 通常解題系統餵資料的方式就是用檔案來餵,所以可以利用這點做到多行輸入。 --- # 格式化字串 (f-string) 有輸入,自然也有輸出的介紹, 這邊介紹的是 Python 3.6 開始支援的一種字串格式化方式,同時也是我最常用的方式。 ```Python= age = 5 print(f'The kid is {age} years old.') ``` ::: spoiler 🖥 Output The kid is 5 years old. ::: <br> 沒錯,就是簡單的用「f ' '」包起來,想要串上變數時就用 { } 把變數名包起來。 要注意的是,若裡面要再包一串字串,裡外兩個引號不能重複,外層是單引號內層就要雙引號。 :::danger ❌ ```Python= str = f'Show 'string'.' ``` ::: :::success ⭕ ```Python= str = f'Show "string".' ``` or ```Python= str = f"Show 'string'." ``` ::: --- # for 迴圈 在 Python 中,只有 Foreach 的用法,每次迴圈都會從字串或陣列等物件迭代其值,舉個例子: ```Python= # 陣列(串列) arr = ['a', 'b', 'c'] # 字串 str = 'def' # 逐個顯示陣列元素 for i in arr: print(i, end=' ') # 逐個顯示字串字元 for j in str: print(j, end=' ') ``` ::: spoiler 🖥 Output a b c d e f ::: <br> 在這邊介紹一個關於陣列的語法糖 (`實際上是串列,但口語上我還是習慣叫陣列`) ```Python= # list 會生成一個陣列(串列) # range 會生成多個數 # 一般方式 arr = list(range(3)) # 語法糖 arr2 = [n for n in range(5)] ``` ::: spoiler 🔍 Result arr = [0, 1, 2] arr2 = [0, 1, 2, 3, 4] ::: <br> 是的,for 迴圈可以被放入陣列宣告的語法中,若是配合其他語法糖(`三元運算子`),還可以做到篩選元素的效果。 <br> 當需要一個執行 n 次的迴圈時,就需要用到上面提到的 range 來配合 for 迴圈使用: ```Python= n = 3 for i in range(n): # do something... ``` <br> 如果我有一個字串,要如何知道它們的 index? ```Python= str = 'abcdef' # enumerate 會向每個元素新增索引值(index) for i, s in enumerate(str): print(f'index: {i}, char: {s}.') ``` ::: spoiler 🖥 Output index: 0, char: a. index: 1, char: b. index: 2, char: c. index: 3, char: d. index: 4, char: e. index: 5, char: f. ::: <br> 至此,解題部分會常用的幾個方式都介紹了,下一篇會來講講解題實作。