<style>
.red {
color: red;
}
.blue{
color: blue;
}
.green{
color: green;
}
</style>
# 模組與套件
## 11-1 模組(module)
- <span class='red'>模組(module)是一個</span>檔名為 *** .py的<span class='red'>python檔案</span>,這個檔案裡面定義了一些資料、函式和類別
- 當我們要使用這個module所提供的功能(資料、函式和類別)時,要使用import指令進行匯入
```python=
# ***表示modulename
import ***
```
- 以Python內建的calendar module為例
```python=
import calendar
print(calendar.month(2024, 6))
```
> Output
```
June 2024
Mo Tu We Th Fr Sa Su
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
```
```python=
# 此函式判斷2024念是否為閏年
print(calendar.isleap(2024))
```
>Output
```
True
```
- 如果覺得每次要import的module name太冗長,可以使用下方寫法:
```python=
import calendar as cal
print(cal.month(2024, 5))
print(cal.isleap(2024))
```
>Output
```
May 2024
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
```
- 為了方便存取,我們也可以使用下方語法來從module匯入特定的class or function
```python=
from modulename import classname/functionname
```
- 以Python內建的calendar module為例
```python=
from calendar import month, isleap, weekday
print(month(2024, 5))
print(isleap(2024))
print(weekday(2024, 10, 5))
```
>Output
```
May 2024
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
True
5
```
- <span class='red'>dir( )函式可以回傳目前存取範圍內的名稱</span>
```python=
from calendar import month, isleap
print(dir())
```
>Output
```
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'isleap', 'month', 'traceback']
```
```python=
# 可以透過*來匯入所有名稱
from calendar import *
print(dir())
```
>Output
```
['Calendar', 'FRIDAY', 'HTMLCalendar', 'IllegalMonthError', 'IllegalWeekdayError', 'LocaleHTMLCalendar', 'LocaleTextCalendar', 'MONDAY', 'SATURDAY', 'SUNDAY', 'THURSDAY', 'TUESDAY', 'TextCalendar', 'WEDNESDAY', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'calendar', 'day_abbr', 'day_name', 'firstweekday', 'isleap', 'leapdays', 'month', 'month_abbr', 'month_name', 'monthcalendar', 'monthrange', 'prcal', 'prmonth', 'setfirstweekday', 'timegm', 'traceback', 'weekday', 'weekheader']
```
- 如果要查看module的**路徑**和**檔名**,可以透過module的__file__屬性(attribute)
```python=
import calendar as cal
print(cal.__file__)
```
>Output
```
/usr/local/lib/python3.11/calendar.py
```
:::success
通常我們會透過* 匯入所有名稱,因為這在使用上會比較方便。但是匯入的名稱越多,Python的負擔就越重,因此<span class='red'>盡量匯入需要使用的部分即可</span>
:::
## 11-2 套件(package)
- 相較於module是一個檔案,<span class='red'>套件(package)則是存放了數個模組</span>,有點像是一個資料夾
- 原則上只要是包含__init__.py檔案的資料夾,就會被視為Python的一個套件
### 函式庫(Library)
- Python並沒有明確定義「函式庫(Library)」,通常是將它當成模組(module)與套件(package)的統稱
- 我們通常把函式庫(Library)分成兩種類型
1. 標準函式庫(standard library)
- 指的是<span class='red'>在安裝Python時一併安裝的模組(module)和套件(package),又稱「內建函式庫(build-in library)」</span>
- Python有非常豐富的標準函式庫,例如**數學模組**、**檔案處理**、**資料壓縮**、**檔案格式**、**加密服務**、**作業系統服務**、**同步運算**、**網路通訊**、**網際網路資料處理**、**網際網路通訊協定**、**多媒體服務**、**圖形使用者介面**和**開發工具**等
- math, random, time, calendar, datetime, turtle等
2. 外部函式庫(external library)
- <span class='red'>指需要另外安裝的模組(module)與套件(package),又稱「第三方函式庫(third-party library)」</span>
:::info
Python內建的thinter套件:
1. thinter(唸做th-inter),是Tool Kit Interface的簡寫
2. <span class='red'>是一個跨平台的GUI(圖形使用者介面)套件</span>
3. 能夠在UNIX, Linux, Windows, Mac等平台開發GUI程式
:::
## 11-3 第三方套件
- 下方是常見的第三方套件:
1. NumPy:陣列與資料運算,例如矩陣運算、傳立葉變換、線性代數等。
2. Matplotlib:2D視覺化工具,可以用來繪製長條圖、直方圖、散點圖、立體圖、圓餅圖、頻譜圖、數學函數等圖形。
3. SciPy :科學計算,例如最佳化與求解、稀疏矩陣、線性代數、插值、特殊函式、統計函式、積分、傳立葉變換、訊號處理、圖像處理等。
4. pandas:資料處理與分析。
5. Django、Pyramid、Web2py、Flask: web框架,可以用來快速開發網站。
6. Kivy、Flexx、Pywin32、PyQt、WxPython: GUI程式開發。
7. BeautifulSoup: HTML/XML解析器。
8. Pillow:圖形處理。
9. PyGame:多媒體與遊戲軟體開發。
10. Requests:存取網際網路資料。
11. Scrapy:網路爬蟲套件,可以用來進行資料挖掘與統計。
12. Scikit-Learn、TensorFlow、Keras:機器學習套件。
### 11-3-1 透過pip程式安裝第三方套件
- <span class='red'>pip程式是Python的套件管理工具,可以用來查看、安裝、升級、解除安裝與管理套件</span>
- 通常pip程式會在**Scripts資料夾**中找的到
- 常見的pip指令如下:
```python=
# 列出目前安裝的套件與版本
pip list
# 安裝套件
pip install PACKAGENAME
# 查詢已經安裝的指令
pip show PACKAGENAME
# 解除安裝的套件
pip uninstall PACKAGENAME
```
:::success
```python=
# 也可以從特定的套件匯入模組
from PACKAGENAME import MODULENAME
```
:::
### 11-3-2 透過PyPI網站安裝第三方套件
- Python的第三方套件集中地: PyPI - the Python Package Index
- https://pypi.org/