---
# System prepended metadata

title: '[筆記] Python 基礎'
tags: [Python, 程式語言, 筆記]

---

# [筆記] Python 基礎

### 語言特性與熱門應用

* Python 是泛用的程式語言，強調易學好懂
* 最近常用在數據分析、人工智慧

### 安裝

下載地址 : [Python](https://www.python.org/)

![](https://i.imgur.com/wBDpXag.png)

* 勾起來，之後操作方便許多

### 資料與運算

#### 1. 變數與資料型態

* 數字 : `3.5`
* 字串 : `"hello"`
* 布林值 : `True`、`False` ( python 的 T 跟 F 為大寫 )
* 可變列表 ( List ) : `[3,4,5]`、`["hello","world"]`
* 固定列表 ( Tuple ) : `(3,4,5)`、`("hello","world")`
* 集合 : `{3,4,5}`、`{"hello","world"}`
* 字典 : `{"apple":"蘋果","data":"資料"}`
* 變數 : `data=3` data 為變數，不用宣告

#### 2. 運算

1. 數字

    * `7//6` : 整數除法
    * `2**3` : 2 的 3 次方

2. 字串

    * `"hell\"o` 輸出為 `hell"o` : 想在字串中加入雙引好可以用 `\` 跳脫
    * `"""hello"""` or `'''hello'''` : 在裡面的換行會直接呈現
    * 字串會對內部的字元編號 ( 索引 )，從 0 開始算起，假設 `s = "hello"`

        * `s[0]` 輸出為 `h`
        * `s[1:4]` 輸出為 `ell` : 輸出字串中編號 1 到 4 ( 不包含 )
        * `s[1:]` 輸出為 `ello`
        * `s[:4]` 輸出為 `hell`

3. 有序列表 ( List、Tuple )

    * List，假設 `grades = [12,60,15,70,90]`

        * `grades[1:4] = []` 輸出為 `[12,90]` : 連續刪除列表中編號 1 到 4 ( 不包含 )
        * `grades = grades + [12,33]` 輸出為 `[12,60,15,70,90,12,33]`

    * Tuple : 除了更動會出錯，其他都跟 List 一樣

3. 集合與字典

    * 集合，假設 `s1 = {3,4,5}` `s2 = {4,5,6,7}`

        * `10 in s1` 輸出為 `False`，`10 not in s1` 輸出為 `True`
        * `&` : 交集，`|` : 聯集，`-` : 差集，`^` : 反交集
        * `s = set("hello")` s 輸出為 `{'l','h','e','o'}` : 把字串拆解為集合
        
    * 字典，假設 `dic = {"apple":"蘋果","bug":"蟲蟲"}`

        * `test in dic` 輸出為 `False`，`test not in dic` 輸出為 `True`
        * `del dic["apple"]` : 刪除字典中的鍵值對
        * `dic = {x:x*2 for x in [3,4,5]}` dic 輸出為 `{3:6,4:8,5:10}` : 從列表資料產生字典

### 流程控制

* 在 python `{}` 用縮排 ( tab ) 取代

#### 1. 判斷式

```python=
if True:
    print("True 執行")
elif False:
    print("False 執行")
else:
    print("跑不到")
```

**python 目前不支援 switch**

#### 2. 迴圈

1. while

```python=
n = 1
while n<10:
    printf(n)
    n+=1
```

2. for

    * 迴圈跑列表

    ```python=
    for x in [3, 5, 1]:
        print(x)
    ```

    * 迴圈跑字串

    ```python=
    for x in "hello":
        print(x)
    ```
    
    * 迴圈跑range

    ```python=
    for x in range(5):
        print(x)
    ```
    
    `range(5)` : 0，1，2，3，4
    `range(3,7)` : 3，4，5，6
    
**迴圈最後可加 `else:`，else 在迴圈結束前執行，被 break 強制結束就不會執行 else**

### 函式、模組與封包

#### 函式 : 用來做程式的包裝，同樣邏輯可以重複利用

```python=
def add(n1 = 1,n2 = 2):
    result = n1 + n2
    return result

print(add(3, 4)) #7
print(add()) #3
print(add(n2 = 3,n1 = 4))
```

```python=
def avg(*ns): #無限不定參數資料
    sum = 0
    for n in ns:
        sum += n
    print(sum/len(ns))

avg(3, 4) #3.5
avg(3, 5, 10) #6.0

```

#### 模組 : 將程式寫在一個檔案中，此檔案可重複載入使用

1. 載入

```python=
import sys as system #載入模組並取別名 system
```

2. 使用

```python=
print(system.platform)
print(system.maxsize)
print(system.path) #印出模組的搜尋路徑
```

3. 內建模組與自訂模組

* 主程式

```python=
import sys #內建的模組
sys.path.append("modules") #在模組的搜尋路徑列表中新增路徑，這裡 "modules" 為資料夾
import geometry #自訂的模組，放在 "modules" 資料夾內
print(geometry.distance(1, 1, 5, 5))
```

* 模組 : 放在 `modules` 資料夾內

```python=
def distance(x1, y1, x2, y2):
    return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
def slope(x1, y1, x2, y2):
    return (y2 - y1)/(x2 - x1)
```

#### 封包 : 用來整理、分類模組

* 檔案中的資料夾為封包，檔案為模組

1. 建立封包

    檔案配置 :

    * 專案資料夾

        * `主程式.py`
        * 封包資料夾

            * `__init__.py` : 必要
            * `模組一.py`
            * `模組二.py`

2. 使用封包

```python=
import 封包名稱.模組名稱 as 模組別名
```

### 類別與實體物件

* 封裝的變數或函式，統稱類別的屬性

#### 類別

1. 定義類別
```python=
class 類別名稱:
    定義封裝的變數
    定義封裝的函式
```

2. 使用類別

```python=
類別名稱.屬性名稱
```

#### 實體物件

1. 建立實體物件

```python=
class 類別名稱:
    def __init__(self): #定義初始化函式
        透過操作 self 來定義實體屬性
# 建立實體物件，放入變數 obj 中
obj = 類別名稱() #呼叫初始化函式
```

```python=
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1,5)
```

2. 使用實體物件

```python=
#實體物件.實體屬性名稱
p = Point(1,5)
print(p.x + p.y)
```

#### 實體方法

1. 建立實體方法

* 封裝在實體物件中的函式

```python=
class 類別名稱:
    def __init__(self): #定義初始化函式
        封裝在實體物件中的變數
    def 方法名稱(self,更多自訂參數):
        方法主體，透過 self 操作實體物件
# 建立實體物件，放入變數 obj 中
obj = 類別名稱() #呼叫初始化函式
```

```python=
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def show(self):
        print(self.x, self.y)
p = Point(1,5)
```

2. 使用實體方法

```python=
#實體物件.實體方法名稱(參數資料)
p = Point(1,5) #建立實體物件
p.show() #呼叫實體方法
```

### 文字檔案的讀取與儲存

#### 1. 開啟檔案

```python=
檔案物件 = open(檔案路徑, mode = 開啟模式, encoding = 編碼)
```

* 開啟模式

    * `"r"` : 讀取模式
    * `"w"` : 寫入模式
    * `"r+"` : 讀寫模式

* 編碼

    * `"utf-8"` : 中文常用編碼

#### 2. 讀取檔案

* 讀取全部文字

```python=
檔案物件.read()
```

* 一次讀取一行

```python=
for 變數 in 檔案物件:
    從檔案依序讀取每行文字到變數中
```

* 讀取 JSON 格式

```python=
import json
讀取到的資料 = json.load(檔案物件)
```

#### 3. 儲存檔案

* 寫入文字

```python=
檔案物件.write("字串\n") #要換行就 \n
```

* 寫入 JSON 格式

```python=
import json
json.dump(要寫入的資料, 檔案物件)
```

#### 4. 關閉檔案

```python=
檔案物件.close()
```

#### 最佳實務

```python=
with open(檔案路徑, mode = 開啟模式) as 檔案物件:
    讀取或寫入檔案的程式
#以上區塊會自動、安全的關閉檔案，不需 close
```

### 亂數與統計模組

#### random

1. 載入模組

```python=
import random
```

2. 使用 random

```python=
random.choice([0, 1, 5, 8]) #從列表中隨機選取 1 個資料
random.sample([0, 1, 5, 8], n) #從列表中隨機選取 n 個資料
random.shuffle([0, 1, 5, 8]) #將列表的資料就地隨機調換順序
random.random() # 0 ~1 之間的隨機數亂數
random.uniform(n, m) # 取得 n ~ m 之間的隨機亂數
random.normalvariate(n, m) # 取得平均數 n，標準差 m 的常態分配亂數
```

常態分配範例 : 

![](https://i.imgur.com/Ilx8LtH.png)


#### statistics

1. 載入模組

```python=
import statistics
```

2. 使用 statistics

```python=
statistics.mean([1, 4, 6, 9]) #計算列表中數字的平均數
statistics.median([1, 4, 6, 9]) #計算列表中數字的中位數
statistics.stdev([1, 4, 6, 9]) #計算列表中數字的標準差
```

### 網路連線與公開資料串接

#### 網路連線

1. 載入模組

```python=
import urllib.request as request
```

2. 下載特定網址資料

```python=
with request.urlopen(網址) as response:
    data = response.read().decode("utf-8")
print(data)
```

#### 公開資料串接

1. 確認資料格式

    * JSON、CSV、或其他格式
    
2. 解讀格式

    * 解讀 JSON 使用內建的 JSON 模組

###### tags: `筆記` `程式語言` `Python`