---
tags : Python
---
###### 國立臺北大學資工系江宥旻
[Python](https://docs.python.org/3/library/) 語法
===
編譯
---
```py
python xxx.py
```
```py
python3 xxx.py
```
變數
---
+ 命名規則
1. 由英文、數字及底線組成。
2. 開頭不可以是數字
3. 不能與Python內建的保留字相同
+ Python變數不需宣告,依指派值自動設定資料型態,可以多個變數指派相同值。
資料型態 Data Type
---
| Type | 語法 |
|:------------------:|:-----:|
| 整數 | int |
| 浮點數 | float |
| 布林值(True/False) | bool |
| 字串 | str |
---
+ 字串 string
```py
name = "Yumin"
name = "江小宥"
```
+ 列表 list
+ 有很多資料
+ 不知道有多少資料
+ 希望資料有編號
```py
data = ["Yumin", 19, [171, 50]]
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```
+ 元組 tuple
```py
data = ("Yumin", 19, [171, 50])
```
+ 字典 dict
```py
data = {"Yumin" : 19, "Dodo" : 7}
```
+ 集合 set
```py
data = {1, 2, 3, "Yumin", "Dodo"}
```
| 資料型別 | 符號 | 資料修改 | 資料有序 | 資料類型 |
|:--------:|:------:|:--------:|:--------:|:-------------:|
| string | ""or'' | X | O | 相同(字元) |
| list | [] | O | O | 可不同 |
| tuple | () | X | O | 可不同 |
| dict | {} | O | X | 相同(key:value) |
| set | {} | O | X | 可不同 |
> [index],若index為負,代表從尾端算回去,也就是倒數。
### number function
+ str(number)
+ abs(number)
+ pow(2, 4)
+ max(num1, num2, num3, ...)
+ min(num1, num2, num3, ...)
+ round(number) `四捨五入`
+ floor(number) `無條件捨去`
+ ceil(number) `無條件進位`
+ sqrt(number)
### sring function
+ len(str)
+ str.lower()
+ str.upper()
+ str.islower()
+ str.isupper
+ str.index()
+ str.replace("被取代", "取代")
+ str.reverse()
### list function
+ data1.extend(data2) `合併`
+ data.append(element) `把元素加入尾端`
+ data.insert(i, element)
+ data.remove(element)
+ data.clear()
+ data.pop()
+ data.sort()
+ data.reverse()
+ data.index(element) `回傳element的位置`
+ data.count(element) `有幾個element`
### dict function
+ my_dict.pop("Robert")
+ my_dict.clear()
輸出 Output
---
```py
print()
```
| 跳脫字元 | 說明 |
|:---------|:-------------|
| \\\ | 印出\ |
| \' | 印出' |
| \“ | 印出” |
| \n | 換行 |
| \t | [tab] |
| \b | 倒退一格字元 |
輸入 Input
---
```py
variable = input() # variable->string
variable = int(input()) # variable->int
```
> 預設是字串,若希望不是字串型態可以做轉型
註解
---
+ 單行註解
```py
# 單行註解
```
+ 多行註解
```py
/#
多行註解
/#
以下寫法,若有賦值,則是多行字串
"""
多行註解
"""
```
運算子
---
| 運算子 | 說明 |
|:------:|:------------:|
| + | 加 |
| - | 減 |
| * | 乘 |
| / | 除 |
| % | 除,取餘數 |
| // | 除,取商的整數 |
| ** | 次方 |
| 運算子 | 範例 | 說明 |
|:------:|:-------:|:----------:|
| += | a += 2 | a = a + 2 |
| -= | a -= 2 | a = a - 2 |
| *= | a *= 2 | a = a * 2 |
| /= | a /= 2 | a = a / 2 |
| %= | a %= 2 | a = a % 2 |
| //= | a //=2 | a = a // 2 |
| **= | a **= 3 | a = a ** 3 |
| 運算子 | 說明 |
|:------:|:------:|
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
| == | 等於 |
| != | 不等於 |
| 邏輯運算子 |
|:----------:|
| and |
| or |
| not |
判斷結構
---
```py
if expression:
statement
if expression
statement1
else
statement2
if expression1
statement1
elif expression2
statement2
else
statement3
```
迴圈 Loop
---
+ while loop
+ for loop
>continue 強制跳出本次迴圈,進行下次迴圈
break 強制跳出整個迴圈
### while
---
基本
```py
while condition:
statement
i = 1
while (i <= 10):
print(i)
i += 1
```
### for
---
基本
```py
for variable in range(n): # 重複n(到n - 1)次
statement
```
range進階用法
1. range(stop)
2. range(start, stop)
3. range(start, stop, step)
+ start : 開始的地方
+ stop : 到哪裡跳出迴圈
+ step : 公差
---
遍歷列表 Traversal list
+ 針對index做遍歷,且可修改list
```py
for i in range(len(data)):
```
+ 針對value做遍歷,不可修改list
```py
for i in data:
```
+ 同時對index和value做遍歷
```py
for i, v in enumerate(data)
for i, _ in enumerate(data) # 沒有用到v
```
遍歷字典 Traversal dict
+ 遍歷key
```py
for k in my_dict.keys():
print(k)
```
+ 遍歷value
```py
for v in my_dict.values():
print(v)
```
+ 同時遍歷key跟value,其中裡面的元素是(key, value)的tuple
```py
for k, v in my_dict.items():
print(k, v)
```
reverse
```py
number_list = [1, 2, 4, 5, 3, 100, 50 ,30 ,20]
for num in reversed(number_list):
print(num)
```
sort
```py
fruit_list = ['apple', 'orange', 'banana', 'kiwi']
for fruit in sorted(fruit_list):
print(fruit)
```
單行
```py
a = [i for i in range(10)]
print(a)
```
單行+if-else
```py
number_list = [3, 4, 2, 3, 4.5, 8, 9, 8.2, 9.1, 10, 1]
get_number = [num for num in number_list if num > 8]
print(get_number)
```
函式 function
---
> 若函式沒有回傳值,則會預設回傳None
```py
def fucn_name(parameter):
operation
return return_val
def fucn_name(parameter)->return_type:
operation
return return_val
```
import
---
+ 利用其他檔案的程式碼
+ 將常用的程式碼寫好並包乘一個檔案,需要時不必重寫
+ 使用其他人寫好的功能,不用知道詳細的實作細節
+ 大型的專案通常會有許多檔案,作為檔案與檔案之間溝通的橋樑
import的三種方式
+ import `模組`
+ import `模組` as `自訂名稱`
+ from `模組` import `模組的東西`
```py
import math
x, y = 12, 18
z = math.gcd(x, y)
print(z)
```
> 使用'.'連接檔案與函數名稱
```py
import math as m
x, y = 12, 18
z = m.gcd(x, y)
print(z)
```
```py
from math import gcd
x, y = 12, 18
z = gcd(x, y)
print(z)
```
> import math裡的gcd函數
```py
from math import *
x = ceil(11.6)
y = floor(18.2)
z = gcd(x, y)
print(z)
```
> '*'一次import模組內所有東西(不推薦的寫法)
關於import的自訂名稱
+ import `numpy` as `np`
> 陣列運算與矩陣運算
+ import `pandas` as `pd`
> 數據分析
+ import `matplotlib.pyplot` as `plt`
> 資料視覺化
+ import `tensorflow` as `tf`
> 機器學習
| import | method |
|:----------------------------|:----------------|
| import `模組` | `模組`.東西 |
| import `模組` as `自訂名稱` | `自訂名稱`.東西 |
| from `模組` import `東西` | 東西 |
### module
math
+ math.gcd()
+ math.ceil() and math.floor()
+ math.log()
+ math.sin() and math.cos()
+ math.pi and math.e
> 有括號的是函數,沒有括號的是常數
string
+ string.ascii_lowercase
> "abcdefghijklmnopqrstuvwxyz"
+ string.ascii_uppercase
> "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ string.digits
> "0123456789"
+ string.punctuation
> "!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
random
+ random.random()
> 回傳[0, 1)之間的浮點數
+ random.uniform(a, b)
> 回傳[a, b)之間的浮點數
+ random.randint(a, b)
> 回傳[a, b)之間的整數
+ random.choice(x)
> 回傳一個list內的元素
+ random.shuffle(x)
> 重組list內的元素(洗牌)
os 操作文件
+ os.getcwd()
> 取得當前的工作路徑
+ os.listdir(path)
> 列出目錄path底下的文件
+ os.path.exists(path)
> 檢查path是否存在
+ os.remove(path)
> 刪除文件
sys 操作執行環境
+ sys.argv
> 命令列的參數list
+ sys.version
> 取得python的版本
+ sys.platform
> 取得系統平台名稱
+ sys.stdout
> 標準輸出
pip
---
> pip是一個Python安裝管理套件工具,如果你今天要使用任何與Python有關的套件,基本上都會用到pip來安裝或是更新Python相關套件唷!
> 基本上安裝套件都會建議安裝在虛擬環境上,不然電腦的文件會很雜亂
虛擬環境
`virtualenv`
```py
pip install virtualenv
```
```py
pip3 install virualenv
```
+ 不同專案可以使用不同版本的相同套件,且不互相影響。
+ 啟動虛擬環境後,pip 安裝的套件會被放在虛擬環境中,每個專案就可以擁有一個獨立的環境。
+ 套件版本升級時不會影響到其他的專案。
+ 在沒有權限的情況下安裝新套件。
> 我們會在開啟一個專案之前都會先建立一個環境,來安裝該專案需要的套件,就不會跟本機電腦的Python套件互相衝突。
1. cd 到開發專案的檔案夾裡
2. python3 -m venv venv(自訂義名稱) or python3 -m virtualenv venv(自訂義名稱)
3. source venv/bin/activate
4. which python
5. 複製python的絕對路徑,並用那裡的python版本
6. 離開虛擬環境,deactivate
pip的版本
```py
pip --version
```
安裝套件
```py
pip install module
```
刪除套件
```py
pip unistall module
```
列出已安裝的套件
```py
pip list
```
[pip官方文件](https://pip.pypa.io/en/stable/user_guide/)
File I/O
---
路徑 path
> 檔案的位置
+ 絕對路徑
+ 從最上層的目錄開始描述
+ 相對路徑
+ 從當前的目錄開始描述
> file_object代表我們所要讀的檔案
> file_name是我們為file_object取的變數名稱
### 開檔
```py
file_object = open(file_path, mode)
```
以編碼開啟
```py
file_object = open(file_path, mode, encoding = "utf-8")
```
| mode | 功能 |
|------|-----------|
| r | 讀 |
| w | 寫 |
| r+ | 讀寫 |
| a | 寫在最後面 |
> w : 如果檔案不存在,則會新建一個新的檔案;存在的話,會覆蓋原本的檔案。
### 讀檔
+ 讀一整行
```py
str = file_object.readline()
```
+ 一行一行的讀
```py
for i in file_object
print(i)
```
+ 讀特定數量的字元
```py
str = file_object.read(length)
# 若不打要讀的長度的話,則會直接把整個檔案讀進來
```
### 寫檔
```py
file_object.write(str)
```
### 關檔
```py
file_object.close()
```
使用完檔案,卻不關檔會造成以下事情發生
+ 看起來很菜
+ 佔用記憶體空間,讓程式執行速度變慢
+ 在關檔之前,檔案都不會被真的寫入
+ 可能會開超過數量上限的檔案
---
### 常用寫法
```py
with open(file_path, mode) as file_object :
# do something
with open("hello.txt", 'r') as f :
print(f.read(), end = ' ')
```
```py
f = open("hello.txt", 'r')
print(f.read(), end = ' ')
f.close()
```
> 只有在那迴圈裡時,檔案才是開的,所以不用關檔
> 上面的那兩個寫法相等
遍歷所有行
```py
with open(file_name, 'r') as file_object
for line in file_object
# do something
with open("hello.txt", 'r') as f
for line in f
print(line, end = ' ')
```
使用print取代file.write()
```py
with open(file_name, 'w') as file_object:
print(string, file = file_object)
```
[pickle](https://linnote.com/python-pickle/)
類別 Class
---
```py
class class_name:
pass
```
介紹
+ class又稱類別
+ class底下的資料又稱為「屬性」
+ 底下的函式又稱為「方法 (method)」
作用
+ 看起來不會那麼菜
+ 可讀性高
+ 減少重複性高的程式碼
> class中的函式第一個參數要放self
實體 Instance
> 依照class真的某個東西做出來
| Class | Instance |
|:------:|:------------:|
| 設計圖 | 做出來的東西 |
範例
```py
class Computer:
def __init__(self, cpu, size, price):
self.cpu = cpu
self.size = size
self.price = price
```
> __init__是比較特殊的函式,會在「建構物件」時自動呼叫
### 繼承
```py
class Animal:
def __init__(self, name):
self.name = name
def hello(self):
print(self.name)
class Dog(Animal):
def __init__(self, name, color):
super().__init__(name)
self.color = color
def sound(self):
print("Woof")
```
[參考資料](https://tw-csie-sprout.github.io/py2020/#!slides.md)