# 陣列
#### 114/10/31
#### 講師:昱山
---
## 多變數輸入
----
### 在 `input()` 後加上 `.split()`
```python
a, b = input().split()
```
----
意義: `.split()` 括號內代表資料如何分隔。
預設為空一格
----
### 範例一
程式碼:
```python=
a, b = input().split()
print(a, "喜歡吃", b, sep = "")
```
輸入:
```bash
小明 蘋果
```
輸出:
```bash
小明喜歡吃蘋果
```
----
### 範例二
(改用頓號分隔)
程式碼:
```python=
a, b = input().split("、")
print(a, "喜歡吃", b, sep = "")
```
輸入:
```bash
小明、蘋果
```
輸出:
```bash
小明喜歡吃蘋果
```
----
`input().split()` 預設為字串**串列**(**list** of strings),不能直接用 `int()` 轉換,需要改用 `map()`
----
### 範例:
程式碼:
```python
a, b, c = map(int, input().split()) #a, b, c為整數
print(a + b + c) #輸出總和
```
輸入:
---
## 陣列
#### (`array`)
----
每個陣列可以儲存很多資料
目的是減少需要設太多變數
----
### 四種陣列種類
<table class="table table-bordered bg-white text-center border-c" style="color: #333333; border: 1px solid #58595a;" data-darkreader-inline-color="" data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="">
<tr>
<td>中文</td>
<td>英文</td>
<td>範例</td>
</tr>
<tr>
<td>串列</td>
<td>List</td>
<td>[1, 2, 3]</td>
</tr>
<tr>
<td>元組</td>
<td>Tuple</td>
<td>(1, 2, 3)</td>
</tr>
<tr>
<td>集合</td>
<td>Set</td>
<td>{1, 2, 3}</td>
</tr>
<tr>
<td>字典</td>
<td>Dictionary</td>
<td>{"1" : "小明",
"2" : "小美" }</td>
</tr>
</table>
<br>
[這張表好像在哪看過?](https://hackmd.io/@CRC-YUSHAN/B1c4-HH2gx#/2/4)
----
課程會先著重在 `list`
其它類型之後再說
---
## 串列
#### (`list`)
----
### 簡介:
* `list` 裡可以放不同種類的資料型態
* 資料由 `0` 開始
----
### 建立方式
創建 `list` 的方法有很多種
----
### 方法一
直接在程式打出來
```
list1 = [1, 2, 3, "昱山", 5]
print(list1)
```
輸出:
```bash
[1, 2, 3, "昱山", 5]
```
----
### 方法二
從輸入打出來
```python
list2 = list(map(int, input().split()))
print(list2)
```
輸入:
```bash
1 2 3 4 5
```
輸出:
```bash
[1, 2, 3, 4, 5]
```
----
### 方法三
用 `range()` 生成
```python
list3 = list(range(2, 10, 2))
print(list3)
```
輸出:
```bash
[2, 4, 6, 8]
```
----
一次性將多個資料做成`list`
,會用到 `list()` 函式
---
## `.append()` 與 `.pop()`
----
在一個list中增加、減少資料
* list.append(要增加的資料)
會增加在list最右邊
* 刪減 list.pop(位置)
會刪除該位置的資料
----
範例:
```python=
list4 = [1, 2, 3, "hello", 9.9]
print(list4)
list4.append("wow") #加上 "wow"
print(list4)
list4.pop(3) #移除第 3 個( 1 為第 0 個)
print(list4)
```
輸出:
```bash
[1, 2, 3, 'hello', 9.9]
[1, 2, 3, 'hello', 9.9, 'wow']
[1, 2, 3, 9.9, 'wow']
```
---
## 處理個別元素
----
### `list[索引值]`
```python
list5 = [1, 2, 3, "昱山", 5]
print(list5[0]) #輸出 1 (第 0 個元素)
print(list5[1]) #輸出 2 (第 1 個元素)
print(list5[-1]) #輸出 5 (最後 1 個元素)
```
----
為什麼索引值從 `0` 開始?
<img src="https://storage.googleapis.com/lds-media/images/python-arrays.width-1200.jpg">
圖片來源:[
`IndexError: list index out of range and python`
](https://www.learndatasci.com/solutions/python-indexerror-list-index-out-range-and-python/)
----
A:因為第一個元素在記憶體位置,索引值相當於偏移量,紀錄到記憶體位置的距離。
<img style="width: 80%; height: 80%;" src="https://log2base2.com/images/c/array-indexing.png ">
圖片來源:[
Array index always starts from 0](https://log2base2.com/c-questions/array/why-array-index-start-with-0.html)
---
## 切片
#### (`slicing`)
----
明明只改變 `b` ,為什麼連 `a` 也跟著改了?
* 程式:
```python
a = [1, 2, 3]
b = a
b[0] = 999 #改變 b 的第 0 項
print(a)
print(b)
```
* 輸出:
```bash
[999, 2, 3]
[999, 2, 3]
```
----
A: 因為 `b = a` 不只是複製 `a` 的元素,更是複製 `a` 的記憶體位置。 `b[0] = 999` 會在該記憶體位置根據偏移量改變元素
----
正確寫法:`b = a[:]`
```python
a = [1, 2, 3]
b = a[:] # ←-- 這才是正確寫法
b[0] = 999
print(a)
print(b)
```
----
### 切片的基本語法
```python
list[start:end:step]
```
| 參數 | 意義 | 說明 |
| ------- | --------- | ---------------- |
| `start` | 起始索引(包含) | 從哪個位置開始(預設為 `0`) |
| `end` | 結束索引(不包含) | 到哪個位置結束(預設為列表長度) |
| `step` | 步長 | 每次跳幾個元素(預設為 `1`) |
跟 `range()` 很像
----
### 範例一
```py=
a = [10, 20, 30, 40, 50]
b = a[1:4]
print(b) # 輸出:[20, 30, 40]
```
----
### 範例二
省略起點或終點
```py=
a = [10, 20, 30, 40, 50]
print(a[:3]) # [10, 20, 30] → 從頭取到索引 2
print(a[2:]) # [30, 40, 50] → 從索引 2 取到結尾
print(a[:]) # [10, 20, 30, 40, 50] → 整個列表的淺拷貝
```
----
### ★ 範例三
反轉列表
```python=
a = [1, 2, 3, 4, 5]
b = a[::-1]
print(b) # [5, 4, 3, 2, 1]
```
(這很重要,大家要記起來)
----
### 範例四
每隔幾個取一個
```python
a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(a[::2]) # [0, 2, 4, 6, 8]
print(a[1::3]) # [1, 4, 7]
```
說明:第三個值 `step` 控制間隔。
----
### 範例五
負索引
```python
a = [10, 20, 30, 40, 50]
print(a[-3:]) # [30, 40, 50]
print(a[:-2]) # [10, 20, 30]
```
說明:`-n` 表示最後 `n` 個元素。
----
### 範例六
修改部分列表
```python
a = [1, 2, 3, 4, 5]
a[1:4] = [9, 9, 9]
print(a) # [1, 9, 9, 9, 5]
```
說明:切片也可以**直接替換**那一段的內容。
----
### 小結
| 語法 | 功能 |
| -------------- | --------------- |
| `a[start:end]` | 取部分元素 |
| `a[:end]` | 從頭取到某位置 |
| `a[start:]` | 從某位置取到結尾 |
| `a[:]` | **複製整個列表(淺拷貝)** |
| `a[::step]` | 每隔幾個取一個 |
| `a[::-1]` | **反轉列表** |
----
[等等這用法好像在哪裡看過?](https://hackmd.io/@CRC-YUSHAN/BySlh2r5ge#/5/7)
----
`str` 也適用切片的用法,
但無法藉由 `s[0] = "H"` 更改
```
s = "hello"
l = [1, 2, 3]
s[0] = "H" # ❌ 錯誤:'str' object does not support item assignment
l[0] = 9 # ✅ 可行
print(l) # [9, 2, 3]
```
---
若串列裡還有串列,
可以再加一組中括號讀取內層串列裡的元素
如:
```py
# 建立一個包含內層串列的串列
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 讀取內層串列裡的元素
print(a[0][1]) # 讀取第一個內層串列的第二個元素 -> 2
print(a[2][0]) # 讀取第三個內層串列的第一個元素 -> 7
```
---
## 歡樂 ~~`zerojudge`~~ 時間
## `kahoot`
---
## THE END.
{"title":"陣列","description":"試教","slideOptions":"{\"theme\":\"sky\",\"transition\":\"convex\"}","contributors":"[{\"id\":\"b831f9fa-52bb-4a09-bfbb-148e4fdadd0f\",\"add\":5936,\"del\":211,\"latestUpdatedAt\":1761902338727}]","lang":"zh-TW"}