# Python
###### tags: `CSIE_CAMP_2020` `Python`
---
# 為什麼要學 Python?

----
- 社群驅動與管理的自由軟體
- 跨平台的直譯式語言
- 簡潔易懂的語法
- 知名的網站 (`Google`, `YouTube`) 與作業系統都在用
---
# 建置編譯環境
----
1. 前往 [Python官網](https://python.org)
2. 點選 `Downloads`
3. 選擇 Python **3.8.1** 版本
4. 安裝過程中記得勾選 `Add to PATH`
----

---
# 如何玩?
----
# 開啟Terminal / Commander
輸入`Python`並按下 <kbd>Enter</kbd>

----
# Python shell mode
現場即時口譯
> 你輸入什麼他就回答你甚麼?
----
## 跟傳統的程式語言有什麼不同?
| | 編譯式程式語言 | 直譯式程式語言 |
| ---- |:--------------:|:--------------:|
| | C/C++ | Python |
| 編譯 | 透過編譯器編譯 | 不需經過編譯 |
| 執行 | 直接執行 | 透過直譯器執行 |
---
# Hello Python !
```python
print('Hello World')
```
----
## 基本運算子介紹
| 運算 | | 用法 |
|:------:| --- |:--------:|
| 加 | | `a + b` |
| 減 | | `a - b` |
| 乘 | | `a * b` |
| 除 | | `a / b` |
| 取商數 | | `a // b` |
| 取餘數 | | `a % b` |
| 次方 | | `a ** b` |
----
## 小試身手
利用Python算出 $$3^{15} + 5^{12} = ?$$
---
# 輸入/輸出
讓程式可以根據使用者的輸入計算
</br>
`print` / `input`
----
## 輸入
```python
# input(string) return string
a = input('Enter something')
```
----
## `string` + `string` = `string`
大部分的變數都可以使用`+`與字串組合成一個字串
方便辨識與輸出計算結果
----
## 小試身手
使用 `input()` 取得使用者輸入的名稱後
輸出‘Hello, (使用者名稱)’
---
# 基礎資料型態
資料是怎麼被存在電腦裡面?
int, float, double, str, list...?
----
## Python 已經幫你決定好囉
使用 `type()` 查看該變數的資料型態
----
# 轉換資料型態
(要轉變成的型態)(要被轉變的變數)
``` python
a = '11'
b = int(a)
b = b + 11
print(type(b))
```
----
## 小試身手
使用 input 取得使用者所輸入的攝氏溫度 °C,並計算出相對應的華式溫度數值 °F 為多少?
</br>
公式如下
$$
F = \frac{9}{5} \times C + 32
$$
---
# 但程式不是這樣寫的
程式通常不是一行一行的輸入進去讓使用者使用
而是寫好很多行之後一次執行
----
# 寫成 .py 的格式後再一次執行
使用 [Sublime Text](https://www.sublimetext.com) 或是其他編輯器來撰寫
----
## 開啟方法

----
# 註解怎麼打?
程式寫完隔天腦袋一片空白?!
</br>
- 單行註解 `#`
- 多行註解 `'''` or `"""`
----
## 範例
``` python
# 註解放後面
'''
註解放裡面
'''
```
---
# 條件判斷
### (if / elif / else)
根據不同的情況執行不同的動作
----
# 電腦要怎麼知道現在該執行什麼?
當你所描述的情況為「真」的時候
bool 為 true 的時候
---
# 比較運算子
| 運算子 | | | 用法 |
|:-------- |:----:| --- |:--------:|
| 等於 | $=$ | | `a == b` |
| 不等於 | $\neq$ | | `a != b` |
| 大於等於 | $\geq$ | | `a >= b` |
| 大於 | $>$ | | `a > b` |
| 小於等於 | $\leq$ | | `a <= b` |
| 小於 | $<$ | | `a < b` |
----
# 布林邏輯
| 運算子 | | | 用法 |
|:------:| -------- | --- |:---------:|
| 且 | $\wedge$ | | `a and b` |
| 或 | $\vee$ | | `a or b` |
| 非 | $\sim$ | | `not a` |
----
- 當情況成立的時候 得到的值就是 `True` ,反之則得到 `False`
- `且`只有在兩者都為`真`時才為為`真`
- `或`是只要有一者為`真`就會為`真`
---
# if
當...,則...
``` python
if 情況:
做什麼
```
----
```python
day = int(input('今天星期幾?'))
if day == 1:
print('憂鬱星期一:(')
```
----
# else
與 `if` 合併使用
當...不成立時,則...
```python
if 情況:
做什麼
else:
做別的
```
----
```python
day = int(input(''))
if day == 1:
print('憂鬱星期一:(')
else:
print('至少沒那麼憂鬱:>')
```
----
## 小試身手
寫一個程式判斷使用者輸入的數字是不是偶數
如果是偶數的話,輸出 `YES`
如果是奇數的話,輸出 `NO`
----
# elif
多個情況個別判斷
```python
if 情況1:
做什麼
elif 情況2:
做什麼
elif 情況3:
...
else:
做什麼
```
----
```python
day = int(input('今天星期幾?'))
if day == 1:
print('憂鬱星期一:(')
elif day == 5:
print('要放假囉:)')
else:
print('至少沒那麼憂鬱:>')
```
----
## 小試身手
假設學期成績的分級為:
90 ~ 100 為 **A** 等級
70 ~ 89 為 **B** 等級
60 ~ 69 為 **C** 等級
0 ~ 59 為 **F** 等級
請設計一個程式判斷使用者所輸入的分數屬於哪個等級?
---
# 迴圈
重複執行一些程式碼
----
# while 迴圈
```python
while 情況:
做什麼
```
----
```python
money = 0
while money > 100:
earn = int(input('今天賺了多少?'))
money = money + earn
print('存到了') # 只有在 money 超過 100 的時候才會被執行到
```
----
## 小試身手
設計一個讓使用者猜數字的遊戲
---
# list, Range
> Python沒有陣列
>> 不過有列表
----
list是什麼?
可以把所有資料放在一起的一個容器
```python
a = [1, 2, 3, 'a', [5, 6], True, 'hello']
```
----
如果你需要一個數列呢?
ex:1 ~ 100
```python
# range(起點, 邊界)
range(1, 100 + 1) # 起點從1開始
# range(邊界)
range(3) # 預設起點從0開始
```
----
# for
將清單、範圍、字串中的元素逐一取出運算
```python
list = ['a', 1, False]
for i in list:
print(i) # 輸出結果: a 1 True
for i in range(3):
print(i) # 輸出結果: 0 1 2 3
for i in 'Hello':
print(i) # 輸出結果: H e l l o
```
----
## 兩種迴圈的比較
| 迴圈 | 結束條件 |
|:-----:|:-------------------------------- |
| while | 當情況為「非」時 |
| for | 當所有容器裡的元素都已經拿出來時 |
----
## 小試身手
利用 for 迴圈計算出
$$
\sum_{i = 0}^{100} {2 \times i^2 + 5 \times i} = ?
$$
---
# 檔案處理
將資料儲存起來
```python
file = open([檔案名稱], [開啟模式])
```
----
## 開啟模式
| 模式 | | 字元 |
|:-------- | --- |:----:|
| 寫入 | | `w` |
| 讀取 | | `r` |
| 位元寫入 | | `wb` |
----
```python
file = open('output.txt', 'w')
file.write('Hello World')
file.close()
file = open('output.txt', 'r')
content = file.read()
print(content)
# output: Hello World
```
----
## 使用方法
```python
# 在使用 "w" 模式的時候可以使用
file.write([寫入內容]) # 將字串寫入檔案
file.close() # 儲存變更 (與使用 word 按下「儲存」概念的類似)
# 在使用 "r" 模式的時候可以使用
content = file.read() # 將檔案內容存入 in 字串中
```
----
## 小試身手
---
# 套件管理器 (pip)
用來管理透過 [Python套件索引(PyPI)](https://pypi.org) 下載的套件
```shell
> pip install [套件名稱]
```
----
安裝`requests` 與`beautifulsoup`
```shell
> pip install requests
> pip install beautifulsoup4
```
----
# 引用套件
```python
import [套件名稱] # 引用套件的所有內容
from [函式名稱] import [套件名稱] # 引用套件的部分內容
```
---
# Python 應用
## 爬蟲 (Spider)
依照一定規則自動抓取網路資料的程式
----
# 用途?
- 資料搜集
- 搜尋引擎的資料來源
- 社群發文留言分析
----
# 分類有哪些?
- 透過網站提供的相關接口([`API`](https://zh.wikipedia.org/zh-tw/应用程序接口))
- 透過網站原始碼(`html`, `css`, `js`)進行分析與提取
---
# 如何取得原始碼?
----
利用`requests`套件
```python
from requests import get # 將 get 函式引入這個script
res = get([URL]) # 將原始碼下載並存進 res 變數中
```
----
## 確認是否取得成功
檢查 `status_code` 是否為 `200`
| status_code | | 代表 |
| ----------- | --- | -------- |
| 200 | | 取得成功 |
| 404 | | 找不到 |
| 403 | | 被禁止 |
----
## 小試身手
1. 使用 requests 的 get 方法取得[範例網站](http://nckucamp2020.000webhostapp.com/carear.html)的原始碼並確定成功取得( status_code == 200 )
2. 計算「職業」這個詞出現在原始碼裡的個數
---
# 分析原始碼
利用 html tag 的結構來分析資料
----
## 使用 BeautifulSoup 套件
分析原始碼並產生出 html 的結構
```python
from bs4 import BeautifulSoup
soup = BeautifulSoup(res.text, 'html.parser')
```
----
# 提取資料
使用 `find` 或 `find_all` 尋找具特定名稱之標籤的文字
```python
soup.find('h1') # 尋找具 h1 標籤的第一組文字
soup.find_all('h1') # 尋找所有具 h1 標籤的文字
```
----
如果我們想要取得網頁的標題
我們可以這樣寫
```python
title = soup.find('title')
print(title.text) # 取得具有 title 標籤的文字並印出
```
----
## 網頁上還有許多特徵可以利用
我們可以透過 css 的特徵來取得特定資料
</br>
> 還記得在使用 css 的時候寫過的
> `h1`, `.red`, `#first` 這些東西嗎?
----
## 小試身手
利用 `select` 函式試著取出[範例網站](http://nckucamp2020.000webhostapp.com/index.html)的標題
---
# 一次性下載網站上的圖片
> 我們學會了迴圈跟爬蟲
> 可以開始來做一些神奇的事啦
----
# 首先
## 觀察網頁原始碼的特徵
按下 <kbd>F12</kbd> 開啟開發者工具
----
根據特徵取得所有的圖片超連結
利用以下方法儲存圖片
```python
img = get([圖片超連結])
file = open([圖片名稱], 'wb')
file.write(img.content)
file.close()
```
{"metaMigratedAt":"2023-06-15T03:23:56.328Z","metaMigratedFrom":"YAML","title":"Python - 成大資訊營課程","breaks":true,"slideOptions":"{\"transition\":\"convex\"}","contributors":"[{\"id\":\"59aaf2bc-cfcc-4ee3-a45e-d1046a516cbd\",\"add\":8322,\"del\":1178}]"}