# Module
2022 資訊之芽 北區py班
yjrubixcube
---
## What
- `xxx.py` `zzz.pyc`
- 一些別人寫好的library. eg: `math`, `random`
----
## Why
- 把別人寫好的功能拿來用
- 常用的東西不用每次重寫
- 讓你的每個檔案不會太長
- 大一點的project可能會分很多檔案
- 總而言之就是偷懶
----
## How
1. 基本款
```python=
import math
print(math.gcd(18, 30)) # 6
```
----
2. 取個暱稱
```python=
import numpy as np
x = [[],[],[]]
print(np.shape(x)) # (3, 0)
```
----
### 常用的暱稱
```python=
import numpy as np
import matplotlib.pyplot as plt
import pillow as pil
import requests as req
import bs4.BeautifulSoup as bs
```
----
3. 只import一部份
```python=
from random import randint, shuffle
print(randint(0, 100)) # 包含端點
l = list(range(10))
print(l)
shuffle(l)
print(l)
print(uniform(1, 10)) # NameError
```
from可以import的東西: 變數, class, 函數
----
4. ![](https://i.imgur.com/b5nvVmh.jpg)
```python=
from math import *
```
盡量不要這樣做
----
```python=
import NeverGonnaGiveYouUp
# ModuleNotFoundError
```
![](https://i.imgur.com/z84kG38.jpg)
----
## 所以現在是練習時間( :email: judge)
輸入三角形的三個邊長,算出每個邊對面的角度
神奇公式: $\angle A =\arccos (\frac{b^2+c^2-a^2}{2bc})$
可能會需要: `math` `acos` `pow` `pi`
冷知識1: `acos` 算出來的結果是弧度
冷知識2: 角度$=\frac{180}{\pi}*$弧度
[求救](https://www.google.com/)
----
## :rice:解
```python=
from math import acos, pi
a, b, c = map(int, input().split())
print(acos((b**2+c**2-a**2)/(2*b*c))/pi*180)
print(acos((c**2+a**2-b**2)/(2*a*c))/pi*180)
print(acos((b**2+a**2-c**2)/(2*b*a))/pi*180)
```
---
## 自己寫一個module
----
建立一個 `factorial.py`
```python=
def fact(n):
if n == 0: return 1
return n*fact(n-1)
```
----
再另一個檔案或jupyter notebook裡面打
```python=
from factorial import fact
print(fact(10))
```
----
## 所以現在又是練習時間
寫一個module,裡面有一個`fib()` 函數。
呼叫`fib(n)` 會回傳第`n`個費波納契數
`fib(0) = 0, fib(1) = 1`
----
:rice: 解
```python=
def fib(n):
if n == 0: return 0
if n == 1: return 1
return fib(n-1) + fib(n-2)
```
----
大作業的架構
![](https://i.imgur.com/hVwxTi7.png)
如果檔案被分散在不同資料夾裡面呢
----
```
project
├── Controller
| └── controller.py
├── Model
| ├── items.py
| └── player.py
└── main.py
```
在 `main.py`
```python=
from .Controller import controller
from .Model.items import item_names
```
在 `controller.py`
```python=
from ..Model.items import item_names
```
`.`: 檔案的資料夾開始
`..`: 檔案的上一層資料夾開始
---
# 常用的module介紹
----
- **math**
- **sys**
- **random**
- **os**
- **time**
- **datetime**
- pygame
- numpy
- matplotlib
- pickle
- pandas
[這些幹嘛用的](https://google.com)
----
## math
```python=
import math
print(math.gcd(15, 20)) # 5
print(math.ceil(math.pi)) # 4
print(math.floor(math.pi)) # 3
print(math.pow(2, 10)) # 1024
print(math.sqrt(87)) # 9.327379053088816
print(math.log(10)) # 2.302585092994046 這裡是以e為底
print(math.log2(8)) # 3 以2為底
print(math.exp(3)) # 20.085536923187668 e的3次方
```
----
## math continued
```python=
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
```
----
## random
```python=
import random
print(random.random()) # [0, 1)
print(random.randint(1, 10)) # 包含端點
```
----
## random continued
```python=
l = list(range(10))
print(random.choice(l))
print(l)
random.shuffle(l)
print(l)
```
----
## string
```python=
import string
print(string.ascii_lowercase)
print(string.ascii_uppercase)
print(string.digits)
print(string.punctuation)
print(string.printable)
```
----
## sys
![](https://i.imgur.com/9Uwo0NX.png)
```python=
import sys
print(sys.platform) # 操作系統平台名稱
print(sys.version) # python的版本
print(sys.argv) # command line的參數
```
----
## os
```python=
import os
print(os.getcwd())
print(os.listdir("/"))
print(os.path.join("documents", "folder")) # documents/folder
```
----
## time
:zzz:
```python=
import time
print(time.time())
time.sleep(2)
print(time.time())
```
----
## datetime
```python=
import datetime
print(datetime.datetime.now()) # YYYY-mm-dd HH:MM:SS.ffffff
print(datetime.date.today()) # YYYY-mm-dd
delta = datetime.timedelta(weeks = 2)
print(datetime.date.today()+delta)
print(datetime.datetime.now().strftime("Year: %Y, micro: %f"))
```
----
## 所以現在還是練習時間
第一行輸入整數 N 代表字串長度
第二行包含4個整數,每個整數必為0或1(1代表是0代表否)
第0個數代表是否包含大寫字母
第1個數代表是否包含小寫字母
第2個數代表是否包含數字
第3個數代表是否包含標點符號
請輸出長度為N的隨機字串
---
## 延伸閱讀
![](https://i.imgur.com/tJ147Lq.jpg)
[python的docs](https://docs.python.org/3/library/)
[strftime的格式](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)
[萬用的方法](https://google.com)
---
## 參考資料
[2022竹區py班簡報](https://hackmd.io/@Sean64/py-module#/)
[2021北區py班簡報](https://drive.google.com/file/d/1rBZs-HSJ0-Km_3Zoi4NHlVne_56o3rIE/view)
{"metaMigratedAt":"2023-06-16T21:14:33.301Z","metaMigratedFrom":"YAML","title":"Module","breaks":true,"contributors":"[{\"id\":\"54bbdba3-ffbf-423a-b026-751cb8a77149\",\"add\":5555,\"del\":1049}]"}