說到 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++)啊?
||
|:----:|
|來自 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>
至此,解題部分會常用的幾個方式都介紹了,下一篇會來講講解題實作。