---
# System prepended metadata

title: 資研 1/5 社課講義
tags: [社課講義, 資研]

---

# 資研 1/5 社課講義

[**提問表單**](https://forms.gle/z4dPC1JPV6uA2q9w7)

---

## 字典 Dictionaries

### 迭代

#### <font color='#004B97'>**items**</font>

```python=
D = {'一': 'one', '二': 'Two', '三': 3, '四': 'Four', '五':5}

for i in D.items():
  print(i)
# 輸出：('一', 'one')
#      ('二', 'Two')
#      ('三', 3)
#      ('四', 'Four')
#      ('五', 5)
```

#### <font color='#004B97'>**keys**</font>

```python=
D = {'一': 'one', '二': 'Two', '三': 3, '四': 'Four', '五':5}

for i in D.keys():
  print(i)
# 輸出：一
#      二
#      三
#      四
#      五
```

#### <font color='#004B97'>**values**</font>

```python=
D = {'一': 'one', '二': 'Two', '三': 3, '四': 'Four', '五':5}
for i in D.values():
  print(i)
# 輸出：one
#      Two
#      3
#      Four
#      5
```

### 巢狀字典 Nested Dictionaries

:::warning
**巢狀迴圈 Nested Loop**

- 雙重迴圈（迴圈中的迴圈）
- **記得使用不同變數**

```python=
# 印出"九九乘法表"
for i in range(1, 10):
    for j in range(1, 10):
        print(f'{i}*{j}={i*j}', end='\t')
    print()
```

:::

宣告法一
```python=
Members = {
    'num_1':{
        'age': 17, 
        'birth': '一月三十日'
    }, 
    'num_2':{
        'age': 18, 
        'birth': '四月十日'
    }
}

print(Members['num_1']['age'])
# 輸出：17
```

宣告法二
```python=
num_1 = {
      'age': 17, 
      'birth': '一月三十日'
    }
num_2 = {
      'age': 18, 
      'birth': '四月十日'
    }
Members = {
    'num_1': num_1,
    'num_2': num_2
}

print(Members['num_1']['age'])
# 輸出：17
```

### 函式

|          函式寫法           |              用途              |
|:---------------------------:|:------------------------------:|
|       `Dict.items()`        |          取得整個字典          |
|        `Dict.keys()`        |          取得所有key           |
|       `Dict.get(key)`       |      取得所指定key的value      |
|       `Dict.values()`       |         取得所有value          |
|`Dict.setdefault(key1, key2)`|回傳所指定key的value（可同時回傳多個）|
| `Dict.update({key: value})` |     更改、新增字典中的資料     |
|       `Dict.pop(key)`       |    刪除所指定key的該項資料     |
|      `Dict.popitem()`       |        刪除隨機一項資料        |
|       `del Dict[key]`       |    刪除所指定key的該項資料     |
|       `Dict.clear()`        |     清除該字典內的所有資料     |
|         `len(Dict)`         |        回傳該字典的長度        |
|    `dict.fromkeys(x, y)`    | 回傳一個字典其key為x，value為y |

```python=
# len
D = {'一': 'one', '二': 'Two', '三': 3, '四': 'Four', '五':5}
print(len(D))
# 輸出：5

# fromkeys
x = ['Tom', 'Cindy', 'Chris'] # 可以是tuple也可以是list
y = 60
D = dict.fromkeys(x, y) # 此時的dict為函式必須，非字典名稱
print(D)
# 輸出：{'Tom': 60, 'Cindy': 60, 'Chris': 60}
```

### 排序

1. 直接排序
>依照key去排序（ASCII碼）

法一
```python=
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }

print(sorted(D))
# 輸出：['Albert', 'Cindy', 'Molly', 'Sally', 'Sam']
```

法二
```python=
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }

print(sorted(D.keys()))
# 輸出：['Albert', 'Cindy', 'Molly', 'Sally', 'Sam']
```

法三
```python=
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }

print(sorted(D.items()))
# 輸出：[('Albert', 80), ('Cindy', 65), ('Molly', 80), ('Sally', 20), ('Sam', 95)]
```

2. 使用value來排序

:::warning
**lambda**

- 小型的自訂義函式（？
- 語法：

```python=
x = lambda a, b: a**b
print(x(2, 5))
```
:::

```python=
# 依value排序_由低到高
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }
print(sorted(D.items(), key=lambda x:x[1]))
# 輸出：[('Sally', 20), ('Cindy', 65), ('Molly', 80), ('Albert', 80), ('Sam', 95)]
```

```python=
# 依value排序_由高到低
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }

print(sorted(D.items(), key=lambda x:-x[1]))
# 輸出：[('Sam', 95), ('Molly', 80), ('Albert', 80), ('Cindy', 65), ('Sally', 20)]
```

```python=
# 依value排序_先按value降冪，若相同再按key升冪
D = {
    'Sam': 95, 
    'Molly': 80, 
    'Albert': 80, 
    'Cindy': 65, 
    'Sally': 20
    }

print(sorted(D.items(), key=lambda x:(-x[1], x[0])))
# 輸出：[('Sam', 95), ('Albert', 80), ('Molly', 80), ('Cindy', 65), ('Sally', 20)]
```

## 內建函式－數學函式

1. **abs()**
- `abs( a )`
- 回傳該數的絕對值
- 不改變資料型態

```python=
x = -123.0
print( abs(x) )
# 輸出：123.0
```

2. **pow()**
- `pow( a, b, c )`
- 回傳以a為底數；b為指數；%c的數值
>意同：( a \** b ) % c
>a、b為必須參數；c可有可無

```python=
print( pow(2, 3, 3), (2**3)%3 )
# 輸出：2 2
```

3. **round()**
- `round( a, b )`
- 回傳將小數a，四捨五入至小數點後第b位
>a為必須參數；b可有可無

```python=
print( round(1.233333, 3) )
# 輸出：1.233
```

4. **min()**
- `min( a, b , c ... )`
- 回傳該容器或多個物件的最小值
- 只能比較同一資料型態的物件
>可放置int、float、list、tuple...等可迭代物件

```python=
print( min(1, -3, 44, 6, 8) )
# 輸出：-3
```

5. **max()**
- `max( a, b , c ... )`
- 回傳該容器或多個物件的最大值
- 只能比較同一資料型態的物件
>可放置int、float、list、tuple...等可迭代物件

```python=
print( max(1, -3, 44, 6, 8) )
# 輸出：44
```

## **練習題**

**Zerojudge**

[**連結**](https://zerojudge.tw/)

---

## 補充資料

**推薦網站：**[**W3Schools**](https://www.w3schools.com/)