# Python 新手指南:01 變數、資料型態、語法
**作者:** Tsung-Min Pai
**單位:** NTUEE
---
## 大綱
### 1 變數
- 定義
- 宣告與初始化
- 賦值
- 命名慣例
### 2 資料型態
### 3 語法
- print()
- input()
- 運算子
---
## 什麼是變數?
- 一個在電腦記憶體中,用來儲存值的命名空間。
- 這個值在程式執行過程中可以被改變、操作或覆寫。
- 在程式碼中,變數就像一個標籤,指向資料儲存的位置。
```python
# 這是一個變數,儲存一個整數值
age = 30
# 這個變數儲存一個字串
name = "tsung-min pai"
# 你可以改變變數的值
age = 31
```
---
## 宣告與初始化
- **宣告**:定義變數並給予名稱。
- **初始化**:給予變數一個初始值。
在 Python 中,宣告與初始化通常一步完成,你不需要預先聲明變數型態。
```python
# 在 Python 中,這是宣告與初始化的過程
score = 100
```
---
## 賦值
- **賦值**:將一個值賦予給變數,這個過程使用 `=` 運算子。
- 賦值可以發生在初始化時,或是在程式執行的任何時間點。
```python
# 第一次賦值 (初始化)
x = 10
# 第二次賦值,改變變數的值
x = 20
# 賦值可以將一個變數的值賦予給另一個變數
y = x
```
---
## 命名慣例
- 使用有意義的名稱,讓程式碼易於閱讀和理解。
- 推薦使用 **蛇形命名 (snake_case)**,這是 Python 的標準慣例。
```python
# 好的命名慣例 (snake_case)
user_first_name = "Tsung-min"
total_items = 5
# 駝峰式命名 (camelCase) 在 Python 中較少見,但仍可使用
userFirstName = "Tsung-min"
totalItems = 5
```
---
## 資料型態
Python 會自動推斷變數的資料型態,但了解這些型態對於編寫程式碼至關重要。
| 型態 | 意義 | 描述 | 範例 |
| ----- | --------------- | ------------------------------- | ------------------------- |
| int | integer | 整數 (正數、負數、零) | `12`, `-3`, `0` |
| float | floating number | 浮點數 (帶有小數點的數字) | `5.0`, `-0.9`, `3.14159` |
| str | string | 字元組合 (用單引號或雙引號包圍) | `"hello"`, `'A'`, `"123"` |
| bool | boolean | 布林值 (代表真或假) | `True`, `False` |
---
## 語法 (Syntax)
語法是編程語言的規則,它定義了如何正確地寫出程式碼。Python 的語法以其簡潔和易讀性聞名。
```python
# 範例:一個簡單的 Python 程式
message = "Hello, World!"
print(message)
```
---
## input()
- 用於從使用者那裡獲取輸入。
- `input()` 函式會暫停程式執行,並等待使用者在終端機中輸入文字。
- 它總是將使用者輸入的內容作為一個**字串 (string)** 返回。
```python
# 提示使用者輸入名字,並將輸入的文字儲存到變數中
user_name = input("請輸入您的名字:")
# 顯示輸入的內容
print("您好," + user_name)
```
---
## 算術運算子
這些運算子用於執行數學計算。以下範例假設變數 `a` 的值為 `4`。
| 運算子 | 描述 | 範例 | 簡寫 (Self Assignment) | 結果 (a=4) |
| ------ | --------------------- | -------- | ---------------------- | ---------- |
| + | 加法 (Addition) | a + 3 | a += 3 | 7 |
| - | 減法 (Subtraction) | a - 3 | a -= 3 | 1 |
| \* | 乘法 (Multiplication) | a \* 3 | a \*= 3 | 12 |
| \*\* | 次方 (Power) | a \*\* 3 | a \*\*= 3 | 64 |
| / | 除法 (Division) | a / 3 | a /= 3 | 1.333... |
| // | 商數 (Floor Division) | a // 3 | a //= 3 | 1 |
| % | 餘數 (Remainder) | a % 3 | a %= 3 | 1 |
---
## print()
- 用於將資料輸出到標準輸出設備,通常是終端機或命令提示字元。
- 這是一個內建函式,用於向使用者顯示訊息或進行除錯。
```python
# 印出一個字串
print("Python 很有趣!")
# 印出變數的值
name = "Tsung-min"
print(name)
```
---
## 新手常見的 print() 錯誤
**錯誤 1:忘記換行符號**
```python
# 錯誤:沒有換行,輸出會擠在一起
print("第一行", end="")
print("第二行")
# 輸出: 第一行第二行
# 正確:明確加入換行符號
print("第一行")
print("第二行")
# 輸出:
# 第一行
# 第二行
# 或者使用 \n
print("第一行\n第二行")
```
**錯誤 2:字串與變數連接類型錯誤**
```python
name = "小明"
age = 20
# 錯誤:無法直接串接字串和數字
# print("我是" + name + ",今年" + age + "歲") # TypeError
# 正確方法 1:轉換類型
print("我是" + name + ",今年" + str(age) + "歲")
# 正確方法 2:使用逗號分隔
print("我是", name, ",今年", age, "歲")
# 正確方法 3:使用 f-string (推薦)
print(f"我是{name},今年{age}歲")
```
**錯誤 3:引號配對錯誤**
```python
# 錯誤:引號不匹配
# print("Hello World') # SyntaxError
# 正確
print("Hello World")
print('Hello World')
# 字串中包含引號的處理
print("他說:'今天天氣很好'")
print('他說:"今天天氣很好"')
print("他說:\"今天天氣很好\"") # 使用跳脫字元
```
**錯誤 4:忘記括號**
```python
# 錯誤:Python 3 必須使用括號
# print "Hello World" # SyntaxError
# 正確
print("Hello World")
```
---
## 除錯技巧
**技巧 1:使用 print(0/0) 快速除錯**
```python
def calculate_something():
x = 10
y = 20
print(0/0) # 這會立即停止程式並顯示錯誤,用來檢查程式執行到這裡
result = x + y
return result
# 當你想知道程式是否執行到某個位置時,使用 print(0/0)
# 程式會在這裡停止並顯示 ZeroDivisionError
```
**技巧 2:使用 print() 追蹤變數值**
```python
def debug_example():
numbers = [1, 2, 3, 4, 5]
total = 0
for i, num in enumerate(numbers):
print(f"第 {i+1} 次迴圈: num={num}, total={total}") # 追蹤變數
total += num
print(f" 加法後: total={total}") # 追蹤計算結果
return total
result = debug_example()
print(f"最終結果: {result}")
```
**技巧 3:使用分隔線讓輸出更清楚**
```python
print("=" * 50)
print("開始處理資料")
print("=" * 50)
# 你的程式碼
print("-" * 30)
print("處理完成")
print("-" * 30)
```
**技巧 4:print() 的進階參數**
```python
# end 參數:控制結尾字元
print("載入中", end="")
for i in range(3):
print(".", end="")
print(" 完成!") # 輸出: 載入中... 完成!
# sep 參數:控制分隔字元
print("蘋果", "香蕉", "橘子", sep=" | ") # 輸出: 蘋果 | 香蕉 | 橘子
# file 參數:輸出到檔案
with open("log.txt", "w") as file:
print("這是日誌訊息", file=file) # 輸出到檔案而不是終端機
```
---
## 實用的 print() 格式化範例
```python
# 表格式輸出
print(f"{'姓名':<10} {'年齡':<5} {'科系':<15}")
print("-" * 35)
print(f"{'張小明':<10} {20:<5} {'資訊工程':<15}")
print(f"{'李小華':<10} {21:<5} {'電機工程':<15}")
# 進度顯示
total = 100
current = 45
percentage = current / total * 100
bar_length = 20
filled_length = int(bar_length * current // total)
bar = "█" * filled_length + "░" * (bar_length - filled_length)
print(f"進度: |{bar}| {percentage:.1f}% ({current}/{total})")
# 多行字串輸出
text = """
這是一個多行字串的範例,
可以包含多行內容,
保持原有的格式和縮排。
"""
print(text)
```
---
## f-string 格式化
**f-string 是 Python 3.6+ 的現代字串格式化方法:**
```python
# 基本 f-string 用法
name = "Tsung-min"
age = 25
print(f"我是 {name},今年 {age} 歲") # 輸出: 我是 Tsung-min,今年 25 歲
# 在 f-string 中進行計算
price = 100
quantity = 3
print(f"總價是 {price * quantity} 元") # 輸出: 總價是 300 元
# 格式化數字
pi = 3.14159
print(f"圓周率約為 {pi:.2f}") # 輸出: 圓周率約為 3.14
# 格式化百分比
score = 0.85
print(f"及格率:{score:.1%}") # 輸出: 及格率:85.0%
```
**與舊式格式化的比較:**
```python
name = "王小明"
score = 95
# 舊式方法 (較複雜)
print("學生 %s 的分數是 %d" % (name, score))
# .format() 方法
print("學生 {} 的分數是 {}".format(name, score))
# f-string (推薦)
print(f"學生 {name} 的分數是 {score}")
```
---
## rich 函式庫的 print()
**安裝 rich:**
```bash
pip install rich
```
**rich.print() 與一般 print() 的差異:**
```python
# 一般的 print()
print("這是普通的文字")
print({"name": "張三", "age": 25, "skills": ["Python", "JavaScript"]})
# 從 rich 匯入 print
from rich import print
# rich 的 print() 有更好的顯示效果
print("這是 [bold red]粗體紅色[/bold red] 文字")
print({"name": "張三", "age": 25, "skills": ["Python", "JavaScript"]})
# rich 自動美化資料結構
data = {
"使用者資訊": {
"姓名": "李小華",
"年齡": 22,
"技能": ["Python", "機器學習", "資料分析"],
"專案": [
{"名稱": "網站開發", "完成": True},
{"名稱": "AI 聊天機器人", "完成": False}
]
}
}
print(data) # rich 會自動產生彩色、縮排的輸出
```
---
## JSON 格式輸出展示
**使用 json.dumps() 美化輸出:**
```python
import json
# 複雜的資料結構
student_data = {
"基本資訊": {
"姓名": "陳小美",
"學號": "B10901001",
"科系": "資訊工程學系"
},
"成績": {
"數學": 95,
"英文": 88,
"程式設計": 92
},
"選修課程": ["機器學習", "資料結構", "演算法"]
}
# 一般 print (較難閱讀)
print("一般 print:")
print(student_data)
print("\n" + "="*50 + "\n")
# JSON 格式化輸出 (較易閱讀)
print("JSON 格式化輸出:")
print(json.dumps(student_data, ensure_ascii=False, indent=2))
print("\n" + "="*50 + "\n")
# rich print (最美觀)
from rich import print as rprint
print("Rich print 輸出:")
rprint(student_data)
```
---
## 註解 (Comments)
在程式碼中,註解用於解釋程式碼的功能,對編譯器來說是無效的。單行註解使用 `#` 開頭。
```python
# 這是一個單行註解
name = "Tsung-min" # 這個變數儲存使用者的名字
print(name)
```
---
## 多行註解
多行註解通常用於解釋較複雜的程式碼區塊或函式。在 Python 中,多行註解可以使用三個雙引號或單引號來建立。
```python
"""
這是一個多行註解的範例。
它可以用來解釋程式碼區塊的作用。
這個區塊計算圓的面積和周長。
"""
radius = 5
area = 3.14 * radius * radius
circumference = 2 * 3.14 * radius
print("圓的面積:", area)
print("圓的周長:", circumference)
```