--- 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)