---
title: Python 第1堂課講義
tags: Python
---
Python基本語法
===
## 變數
電腦用來**儲存資料**的物件,即稱為「變數」
其中,會用「=」==賦值==變數,將右邊的變數(或資料)儲存到左邊變數
``` python=
#EX1: 資料儲存到變數
x = 3.14159 #pi的近似值
y = 2.71828 #e的近似值
print(x+y)
#EX2: 變數儲存到變數
x = x + y
print(x)
```
:::warning
注意 :zap:
Python中變數**不需要宣告即可使用**
因此使用變數時不用指定資料型態,Python會自動根據變數設定資料型態
例如上述例子中y的資料型態為浮點數(float)
:::
:::success
補充 :mega:
「#」為Python的註解符號,#後面的程式碼並不會被執行,會直接跳過。
在Vscode中,可以選取要註解的程式碼按「ctrl+/」快速註解。
:::
### 變數命名規則
為變數命名時須遵守特定規則,否則執行時會產生錯誤,在許多程式語言都有限制,
下列是python變數命名時的規則:
1. 變數名稱的第一個字母必須是「大小寫字母」、「 _ 」、「中文」
2. 只能由大小寫字母、數字、下底線或中文組成變數名稱
3. 英文字母大小寫不同視為不同變數
4. **變數名稱不能與Python內建保留字相同**
```python=
#錯誤例子
return = 12
7eleven = 777
G&M = 85
```
:::success
補充 :mega:
雖然Python3有支援中文變數,但建議**最好還是不要使用中文變命名!!**
:::
### 變數資料型態
在程式語言中,變數是儲存資料(數據)的記憶體空間,變數的值可被讀取及修改,除了數值以外還可以處理文本、圖形、音頻、視頻等各式各樣的數據類型,因此不同的數據就需要定義不同的儲存類型,Python數據類型很多,也允許自定義新類型的數據類型,標準的類型包含以下幾種:
- **數值型態:**
1. **整數型(int):** 支援二進位、八進位、十進位、十六進位的整數型態。
2. **浮點數型(float):** 也就是小數型態,之所以稱為浮點數是因為科學記號表示法時,一個浮點小數點位置是可移動(根據所需誤差大小改變)。
3. **布爾型(bool):** 布爾值只有True與False兩種值(亦可用1或0表示)。
4. **複數型:** 形如:3+5j,跟數學上意義相同,只是虛部i改為j。
:::success
補充 :mega:
可以使用type()函式檢查變數資料型態。
:::
```python=
x = 12
y = 3.14
z = True
print(type(x)) #整數(int)
print(type(y)) #浮點數(float)
print(type(z)) #布爾值(bool)
```
- **字串型態:**
1. **字元型態(chr):** 字元就是組成字串的元素,原則上來說電腦都是用bit儲存資料,所以電腦儲存的資料都是數字而無法直接儲存字元,所以會用相對應的數字代表字元,以英文為主的文字處理適用ASCII code,若是非英文的語言,現在多使用Unicode這個內碼制來儲存多國的語言,像是中文就是用Unicode(或是UTF-8)來編碼。
2. **字串型態(str):** 字串資料是以**單引號**或是**雙引號**所包起來的文字資料,由一串字元所組成。
```python=
str1 = "Hello World!"
str2 = "Python程式語言課程\n真有趣!"
print(type(str1))
print(type(str2))
```
:::success
補充 :mega:
如果字串中需要打到特殊字元,例如:tab、雙引號、換行等符號,可利用脫逸字元,拖逸字元是以「\」為開頭,後面跟著特定格式的字元。
| 脫逸字元 | 意義 | 脫逸字元 | 意義|
|:------:|:-----------:|:------:|:-----------:|
| \\' | 單引號「'」 | \\''|雙引號「''」|
| \\\ | 反斜線「\」 | \n | 換行 |
| \\t | tab鍵| \f | 換頁 |
:::
- 容器型態: list、dict、tuple
此在初階課程略過不提
### 資料型態轉換
- **int() 轉換為整數**
- **float() 轉換為浮點數**
- **str() 轉換為字串**
```python=
a = 123
b = "12.5"
print(type(a)) #整數型態
print(type(b)) #字串型態
A = str(a)
B = float(b)
print(type(A)) #字串型態
print(type(B)) #浮點數型態
```
---
## 變數輸出(Print函式)
Print函式能輸出(列印)指定項目的內容**顯示在終端機上**,語法為:
```python=
print(項目1,[,項目2,..., sep = 分隔字元, end = 結束字元])
```
- **項目1,項目2,... :** print函式可以一次列印多個項目資料,項目之間以逗號分隔。
- **分隔字元:** 代表項目之間的分隔方式,預設值為一個空白字元("")。
- **結束字元:** 列印完畢後自動加入的字元,預設值為換行字元(\n)。
### 格式化輸出
Print函式支援參數格式化的功能,進行資料處理時,很多時候都需要對數值進行格式化轉為字串做拼接,或是某段字串與變數做串連。Python的字串格式化用於簡化靜態字串和變數的串接,並格式化變數,當然也可以對數值進行格式化成字串,字串格式化的方式有四種:
**1. `百分比(%)`**
為Python最早格式化字串的方法,透過%運算符號,將在tuple中的一組變數依照指定的格式化方式輸出。如格式化: 字串(`%s`)、 十進位整數(`%d`)、浮點數(`%f`)等。
```python=
print('%d' % 50) # 格式化整數
print('%f' % 3.76) # 預設保留6位小數
print('%.1f' % 2.54) # 取1位小數
print('My name is %s'% 'Amy') # 格式化字串
```
:::danger
缺點 :fire:
- 不適合多個變數
- 可讀性低
:::
**2. `str.string`**
相較於第一個格式化方法,`'{}'.format()`方法更好用,使用大括號{}作為特殊字元,放在目標字串的指定位置,`format()`中則放入要拼接的變數、字串或數值。
- **不指定順序:** 若`{}`內不指定索引值,則依序從0開始
```python=
name = "Amy"
age = 21
strr = "my name is {} and my age is {}".format(name, age)
```
- **指定順序:** 只要在`{}`內加入索引值或是關鍵字(可混合使用)
```python=
>>> '{0} is {1}!!'.format('Justin', 'caterpillar')
'Justin is caterpillar!!'
>>> '{real} is {nick}!!'.format(real = 'Justin', nick = 'caterpillar')
'Justin is caterpillar!!'
>>> '{real} is {nick}!!'.format(nick = 'caterpillar', real = 'Justin')
'Justin is caterpillar!!'
>>> '{0} is {nick}!!'.format('Justin', nick = 'caterpillar')
'Justin is caterpillar!!'
>>> '{name} is {age} years old!'.format(name = 'Justin', age = 35)
'Justin is 35 years old!'
```
- **排版:** str-formatting 除了可以指定格式化變數名稱及它的位置外,亦可調整輸出樣式,只要加入^(置中)、<(向左對齊)、>(向右對齊)等字元。
```python=
# ========== 向右對齊 =============
print('{:>10}'.format('test'))
# ========== 向左對齊 =============
print('{:10}'.format('test'))
# 等同
print('{:<10}'.format('test'))
# ============ 置中 ===========
print('{:^10}'.format('test'))
```
:::danger
缺點 :fire:
- 當變數太多時,要撰寫的程式碼就會過長
:::
**3. `f-string`**
Python3.6+方可使用,只需要在字串前面加個f即可進行格式化,並將{}填入目標變數。把剛剛的範例改寫成f-string的方式
```python=
# f-string
name = "Amy"
age = 20
strr = f"my name is {name} and my age is {age}"
print(strr)
```
- **排版:** 可以透過在變數後面加上冒號「:」,指定小數點後位數、或是排版格式
```python=
height = 165.57893
weight = 65.6849852
strr = f"my name is {height:.2f} and my age is {weight:.3f}"
print(strr)
```
:::warning
注意 :zap:
**str.string排版的方法,可以繼續沿用到f-string**
:::
**4. `樣板字串(Template String)`**
在此省略不談,此方法適用於工程師在設計安全性程式碼,避免惡意代碼注入(Code injection)才會使用的方法,為較高階的編碼方式。
### 總結
以`f-string`為Pythonic的方式,也是最簡便、好用的格式化輸出方式,
但是需要Python版本3.6+以後才可使用!
其中,`f-string`可直接在`{}`放表達式與呼叫函數。
```python=
print(f'A total number of {100 * 2 + 20}')
print(f'Complex number {(2 + 2j) / (2 - 3j)}')
print(f'convert STUDENT to lower words are {"STUDENT".lower()}')
import math
print(f'The answer is {math.log(math.pi)}')
score = 90
print(f'My score is {score}, so I am {"good" if score > 80 else "bad"}.')
```
---
## 運算子
- **算術運算子**
+, -, *, /, %(取餘數), //(取得整除的商數), ** (次方, 7**2 = 49)
```python=
a = 100
b = 2
print(a%b)
print(a//b)
print(a**b)
```
- **關係運算子**
==(等於), !=(不等於), >(大於), <(小於), >=(大於或等於), <=(小於或等於)
```python=
a = 50
b = 30
print(a==b)
print(a!=b)
print(a>b)
```
- **邏輯運算子**
not(否), and(且), or(或)
- **複合指定運算子**
+=, -=, *=, /=, %=, //=, **=
```python=
x += x #相當於 x = x + 2
x -= x #相當於 x = x - 2
#其他依此類推
```
## 條件判斷式
```flow
st=>start: 條件
e=>end: 執行條件內敘述
op=>operation: 敘述1、敘述2...
op2=>operation: 跳出判斷式
cond=>condition: 是否滿足條件
st->op->cond->op2
cond(yes)->e
cond(no)->op2
```
```python=
if(condition):
statement
elif(condition):
statement
else:
statement
```
:::success
補充 :mega:
- if 後面的條件可以加括號,也可以省略,如果沒加括號需要有一空白隔開。
- **巢狀判斷式**表示許多層判斷式疊加。
:::
---
## 縮排
Python程式語言裡面的縮排可用來判斷「**代碼與前一行的關係**」,功能就如同C、C++語言裡面的大括號,**可以將程式不同的「層級」作區分**,**通常在「:」下一行就需要縮排,表示那個程式區塊為函式「內部程式」**。
```python=
a = 5
b = 3
if a > b:
print(f'a+b={a+b}')
```
此時,`print(f'a+b={a+b}')`前面就有縮排(tab鍵),**表示這個程式區塊在if內部執行**,符合「if」條件才會執行,如果不滿足就不會執行。
:::danger
挑戰 :fire:
- f-string進階用法:
https://tw511.com/a/01/9107.html
:::