# Python 基礎技術整理 [![](https://img.shields.io/badge/dynamic/json?color=orange&label=總觀看人數&query=%24.viewcount&url=https://hackmd.io/3L8iXhnVR2uFC_4iJs-n3g%2Finfo)]() > [name=AndyChiang][time=Fri, Jan 29, 2021 4:19 PM][color=#00CDAF] ###### tags: `Python` ## 安裝 [使用 Visual Studio Code 設定您的 Python 初學者開發環境](https://docs.microsoft.com/zh-tw/learn/modules/python-install-vscode/) 在Window的命令提示字元(CMD)輸入以下指令: ``` $ py -- version ``` 如果回應是這個,代表已經安裝成功,沒有的話就去安裝吧。 ``` Python 3.X.X ``` [Python 載點](https://www.python.org/downloads/) ## Python 互動模式 ### 啟動 Python 的互動模式 在CMD輸入: ``` $ py -3 ``` 會得到: ``` >>> ``` 然後就可以在 `>>>` 之後接上程式碼,電腦將一行行執行。 ### 離開互動模式 在 `>>>` 之後輸入: ``` exit() ``` ## Python 註解(comments) ### 單行註解 ``` # 註解寫在這行 ``` ### 多行註解 ``` """ 第一行註解 第二行註解 """ ``` Python內建沒有提供多行註解,但因為編譯器會自動忽略未定義變數的字串,所以這樣也行。 ## Python 變數(variables) ### 基本型態 Python不像C或Java,不需要宣告型態,而是在初次賦予值時決定,通常有這幾種型態: * int:整數 * float:浮點數(小數) * complex:虛數,虛部以 j 表示 * str:字串,用單引號或雙引號都一樣 * list:列表,以 `[ ]` 包覆 * tuple:組合,以 `( )` 包覆 * range:範圍,形式為 `range(數字)` * set:集合,以 `{ }` 包覆 * dict:字典,JSON格式 `{ "A" : a, "B" : b }` * bool:布林值,有True和False ### 型態轉換(Casting) * int():將內容轉為整數 * float():將內容轉為浮點數 * str():將內容轉為字串 ### 取得型態 * type():取得內容的型態 ### 變數命名 基本上和C是一樣的,且有分大小寫。 ### 賦予值 #### 多個變數賦予多個值 ``` x, y, z = "Orange", "Banana", "Cherry" ``` #### 多個變數賦予單個值 ``` x = y = z = "Orange" ``` #### 拆包(Unpacking) 當賦予值是清單時,Python允許使用拆包。 ``` fruits = ["apple", "banana", "cherry"] x, y, z = fruits ``` ``` # x = apple # y = banana # z = cherry ``` ### 全域變數 如果在函式內宣告變數的話,該變數為局部變數。但如果想要在函式內宣告全域變數的話,請在變數前加上 `global` 。 ### 隨機數 ``` import random print(random.randrange(1, 10)) ``` 基礎函式庫沒有,所以要另外引入。 ## Python 字串(strings) 和C一樣,字串就是一個字元的陣列,以下為字串的函式: ### 字串長度 ``` str = "Hello, World!" print(len(str)) #13 ``` 使用 `len(字串)` 可以取得字串長度。 ### 搜尋單字 ``` str = "The best things in life are free!" print("free" in str) #True ``` 使用 `字串A in 字串B` ,如果有就回傳**True**,反之回傳**False**。 ### 切割字串 ``` str[2:5] ``` 切割str從第二位到第四位的部分。 ### 轉大寫 ``` str.upper() ``` ### 轉小寫 ``` str.lower() ``` ### 刪除多餘空格 刪除字串前後多餘的空格。 ``` str.strip() ``` ### 替換字串 將字串內一個單字替換成另一個單字。 `replace()` 並不會改變原字串。 ``` a = a.replace("H", "J") ``` ### 分割字串 以某個單字做分割,回傳值為一個字串的list。 ``` str.split(",") ``` ### 格式化字串 使用 `.format(內容)` 將內容置入字串中 `{}` 的位置,預設會依照順序排,如果要指定的話,則可以寫:`{數字}`。 ``` age = 36 str = "I am {}" print(str.format(age)) ``` ``` quantity = 3 itemno = 567 price = 49.95 myorder = "I want to pay {2} dollars for {0} pieces of item {1}." print(myorder.format(quantity, itemno, price)) ``` #### 格式化字符 * `{:數字}`,預留N個空格,類似C語言中的 `%Nd` * `{:.2f}`,小數點下N位 * [更多...](https://www.w3schools.com/python/ref_string_format.asp) #### 210208更新 - New way! 如果在字串前加上英文字母 `f` 或 `F`,字串會轉成格式化字串,直接在字串內的 {} 中加入變數即可。 ``` name = "Andy" pro = "student" string = f"My name is {name}, and I am a {pro}" ``` * 參考網址:[Python 3's f-Strings: An Improved String Formatting Syntax (Guide)](https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python) #### 210729更新 - 正規表達式 字串前加上 `r` 表示正規表達式,像 `r"[0-9]"`。 ### 跳脫字元 常見的跳脫字元有: * `\`:區分關鍵字和字串 * `\n`:換行 ## Python 運算子(operators) 基本上和C差不多,我只講幾個較特別的。 ### 算術運算符 * `**`:指數(次方) ### 邏輯運算符 * `and`:且,等於`&&` * `or`:或,等於`||` * `not`:非,等於`!` ### 身份運算符 * `is`:跟`==`的差別在於,不只內容一樣,更要是相同的物件 * `is not`:`is`的相反 ### 會員運算符 * `in`:檢查A有沒有在B之中 * `not in`:`in`的相反 ## Python 容器(Collections) Python提供了四種容器,分別為: * 列表(list):有序且可更改的容器,允許重複的成員。 * 組合(tuple):是有序且不可更改的容器,允許重複的成員。 * 集合(set):是無序和未索引的容器,沒有重複的成員。 * 字典(dict):是無序且可變的容器,沒有重複的成員。 ### 列表(list) ``` list = ["a","b","c"] ``` #### 轉成列表 ``` list(("a","b","c")) #注意要雙括號 ``` #### 切割列表 **別忘了列表陣列第一個的索引值是 0 喔!** 從第二個切到第三個(不包括第四個)。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[1:3]) # ["b", "c"] ``` 從第三個切到列表底。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[2:]) # ["c", "d", "e"] ``` 從列表頭切到第四個(不包括第五個)。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[:4]) # ["a", "b", "c", "d"] ``` 從第一個切到第四個(不包括第五個),每兩個取一個。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[0:4:2]) # ["a", "c"] ``` 另外,負索引則代表從列表底倒數第幾個。 從列表頭切到倒數第三個("c"),但不包刮 "c",所以切到 "b"。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[:-3]) # ["a", "b"] ``` 此小技巧將**列表反轉**。 ``` thislist = ["a", "b", "c", "d", "e"] print(thislist[::-1]) # ['e', 'd', 'c', 'b', 'a'] ``` #### 追加項目 使用 `.append()` 將項目加在陣列末端。 #### 插入項目 使用 `.insert()` 會在其index的前面插入新的值,並把原先的值往後移動一格。 ``` thislist = ["apple", "banana", "cherry"] thislist.insert(1, "orange") # thislist = ['apple', 'orange', 'banana', 'cherry'] ``` #### 擴展列表 使用 `extend()` ,將其他任意陣列類型接在當前列表末端。 ``` thislist = ["apple", "banana", "cherry"] tropical = ["mango", "pineapple", "papaya"] thislist.extend(tropical) # thislist = ['apple', 'banana', 'cherry', 'mango', 'pineapple', 'papaya'] ``` #### 刪除指定項目 ``` list.remove("banana") ``` #### 刪除指定索引 ``` list.pop(1) ``` 未指定數字則刪除最後一位。 #### 刪除(del) 刪除指定索引: ``` del list[0] ``` 刪除整個陣列: ``` del list ``` #### 清空列表 ``` list.clear() ``` 陣列還存在,只是內容清空。 #### 列表理解(List Comprehension) 比如說我今天想要篩選出 `fruit` 列表中包含 `a` 的項目,我可能會這樣寫: ``` fruits = ["apple", "banana", "cherry", "kiwi", "mango"] newlist = [] for x in fruits: if "a" in x: newlist.append(x) print(newlist) ``` 其實可以簡化成一行: ``` fruits = ["apple", "banana", "cherry", "kiwi", "mango"] newlist = [x for x in fruits if "a" in x] print(newlist) ``` ##### 語法 ``` newlist = [expression for item in iterable if condition == True] ``` * newlist:新列表 * expression:新列表的項目 * item:原列表的項目 * iterable:原列表 * condition:條件式,True就會加入新列表 #### 排序列表 ``` list.sort() ``` 英文的話會照英文字母排,數字則是從小排到大。 ##### 降冪排序 ``` list.sort(reverse = True) ``` ##### 自訂排序 ``` list.sort(key = myfunc) ``` myfuc可以是任何自訂的函式。 #### 反轉列表 ``` list.reverse() ``` #### 複製列表 ``` newlist = thislist.copy() ``` #### 計算指定值的個數 ``` x = thislist.count("apple") ``` ### 組合(tuple) ``` tuple = ("a","b","c") ``` 基本上跟列表的函式一樣,差別在於組合不可更改成員,因此想要新增或刪除成員時,解決方法是將組合轉為列表 `list()` ,更改內容,然後再轉回組合。 ``` thistuple = ("apple", "banana", "cherry") y = list(thistuple) y.append("orange") thistuple = tuple(y) ``` #### 轉成組合 ``` tuple(("a","b","c")) #注意要雙括號 ``` ### 集合(set) ``` set = {"a","b","c"} ``` #### 轉成集合 ``` set(("a","b","c")) #注意要雙括號 ``` #### 新增單一值到集合中 ``` thisset.add("orange") ``` #### 新增其他陣列到集合中 ``` set1.update(set2) ``` ``` set3 = set1.union(set2) ``` union也行,只是會返回新集合。 #### 刪除指定項目 ``` thisset.remove("banana") ``` ``` thisset.discard("banana") ``` 一樣是刪除,但 `remove()` 如果刪除項目不存在將會引發錯誤, `discard()` 則不會。 ``` x = thisset.pop() ``` pop() 則是刪除並傳回最後一位的值,但記得集合是無序的嗎? 因此沒辦法知道會刪掉什麼。 #### 兩集合交集(AND) ``` z = x.intersection(y) ``` #### 兩集合互斥或(XOR) ``` z = x.symmetric_difference(y) ``` ### 字典(dict) ``` dict = {"a" : A, "b" : B, "c" : C} ``` 基本形式為 `key : value` #### 訪問項目 ``` x = thisdict["key"] ``` ``` x = thisdict.get("key") ``` 兩種都是獲取key相對的value。 #### 取得key ``` x = thisdict.keys() ``` 回傳值為字典中所有key的列表(list)。 #### 取得value ``` x = thisdict.values() ``` 回傳值為字典中所有value的列表(list)。 #### 取得項目 ``` x = thisdict.items() ``` 回傳值為字典中所有項目的列表(list),項目以組合(tuple)型態回傳,如`(key, value)`。 #### 變更/新增項目 ``` thisdict["color"] = "red" ``` ``` thisdict.update({"color": "red"}) ``` 如果不存在此key,則為新增項目。 #### 刪除項目 ``` thisdict.pop("key") ``` 刪除指定key的項目。 #### 複製項目 ``` dict2 = ditc1.copy() ``` `dict2 = ditc1` 是無效的,必須使用 `copy()`。 #### 巢狀字典 簡單講,就是字典內再包一個字典。 ``` myfamily = { "child1" : { "name" : "Emil", "year" : 2004 }, "child2" : { "name" : "Tobias", "year" : 2007 }, "child3" : { "name" : "Linus", "year" : 2011 } } ``` ### 陣列(array) Python並沒有提供原生的陣列,但我們可以用list來實作。 #### 一維陣列 ``` A = [0]*5 ``` 產生一個5列的一維陣列,初始為0。 #### 二維陣列 ``` B = [[0]*5 for i in range(3)] ``` 產生一個3列5行的二維陣列,初始為0。 #### 三維陣列 ``` C = [[[0]*5 for i in range(3)] for j in range(2)] ``` 產生一個2*3*5的三維陣列,初始為0,其他依此類推。 [其他方法:如何在 Python 中建立二維陣列](https://www.delftstack.com/zh-tw/howto/python/how-to-initiate-2-d-array-in-python/) ### 陣列通用函數 #### 是否存在?(any()) 使用 `any()` 函數,參數可以是任意陣列(例如:list、tuple...等等),只要陣列中有任意元素為 True ,則回傳 True ,反之則 False。 如果是空字串會回傳 False。 ``` print(any([2>5, 5>0, 0>2])) # True print(any([])) # False ``` #### 是否全部?(all()) 使用 `all()` 函數,參數可以是任意陣列(例如:list、tuple...等等),必須陣列中所有元素為 True,才回傳 True,反之則 False。 如果是空陣列會回傳 True。 ``` print(all([2>1, 3>2])) # True print(all([])) # True ``` #### 串鏈資料(zip()) 使用 `zip()` 函數,參數為多個任意陣列(例如:list、tuple...等等),類別不同也可以,而此函數可以將這多個陣列相對索引的資料重新打包成組合(tuple),並傳回新的陣列物件。 ``` a = ["a", "b", "c"] b = ("A", "B", "C") c = {"1", "2", "3"} print(zip(a, b, c)) # <zip object at 0x000001C538DEA780> ``` 回傳的是一個物件,所以還要強制轉換成我們想要的型態。 ``` a = ["a", "b", "c"] b = ("A", "B", "C") c = {"1", "2", "3"} print(list(zip(a, b, c))) # [('a', 'A', '1'), ('b', 'B', '2'), ('c', 'C', '3')] ``` 如果把他想成二維陣列,眼尖的人就會發現,其實zip()就是做==轉置矩陣==! 如果陣列長度不一樣,則取最短長度。 ``` a = ["a", "b", "c", "d"] b = ("A", "B", "C", "D") c = ["1", "2", "3"] print(list(zip(a, b, c))) # [('a', 'A', '1'), ('b', 'B', '2'), ('c', 'C', '3')] ``` ##### 小技巧 * **未知參數量** 有時候我們會不清楚參數的數量,這時只要將資料存為一個列表,並在列表名稱前加 `*` 就好了。 * **還原** 只要了解未知參數量的方法,就很容易實作了(長度要一樣)! ``` a = ["a", "b", "c"] b = ("A", "B", "C") c = ["1", "2", "3"] print(list(zip(a, b, c))) # [('a', 'A', '1'), ('b', 'B', '2'), ('c', 'C', '3')] ziped = list(zip(a, b, c)) reziped = list(zip(*ziped)) for x in reziped: print(list(x)) # ['a', 'b', 'c'] # ['A', 'B', 'C'] # ['1', '2', '3'] ``` * 字典key、value互換 ``` D = {'s':"黑桃", 'h':"紅心", 'd':"方塊", 'c':"梅花"} print(dict(zip(D.values(), D.keys()))) # 關鍵在於values放於keys前面 # {'黑桃': 's', '紅心': 'h', '方塊': 'd', '梅花': 'c'} ``` * 二維矩陣 - 向右轉90度、向左轉90度 右轉就是先上下翻轉,再做行列互換。 左轉就是先行列互換,再做上下翻轉。 ``` def rotateRight(arr): A = arr[::-1] # 利用切片上下翻轉 return list(map(list, (zip(*A)))) # 行列互換,再利用map函數將zip內的元組轉列表 def rotateLeft(arr): A = list(map(list, (zip(*arr)))) # 行列互換,再利用map函數將zip內的元組轉列表 return list(A[::-1]) # 利用切片上下翻轉 arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for x in rotateRight(arr): print(x) # [7, 4, 1] # [8, 5, 2] # [9, 6, 3] for y in rotateLeft(arr): print(y) # [3, 6, 9] # [2, 5, 8] # [1, 4, 7] ``` 參考網址:[【python入門教室】(13) 內建函數any(), all(), zip()介紹](https://ithelp.ithome.com.tw/articles/10230859) ## Python if...else ``` a = 200 b = 33 if b > a: print("b is greater than a") elif a == b: print("a and b are equal") else: print("a is greater than b") ``` Python中的if是靠著縮排來定義區塊的,因此**縮排很重要!!!** 然後Python不管是if或for或function,**都記得加`:`!** * `if condition:`:if * `elif condition:` :else if * `else:` :else ### 簡短if...else ``` print("A") if a > b else print("B") #if成立印出A,否則印出B ``` ### 宣告通過 ``` if a > b: pass ``` 照理來說,如果if後面不做事情的話會報錯。加 `pass` 就沒這個問題了,並不會發生任何事情。 ## Python 迴圈(loops) Python就跟其他程式語言一樣,提供兩種迴圈: ### While 迴圈 ``` i = 1 while i < 6: print(i) i += 1 ``` 只要條件為真,迴圈就會一直執行下去。 ### For 迴圈 ``` fruits = ["apple", "banana", "cherry"] for x in fruits: print(x) ``` 和一般的For迴圈不太一樣,Python的For迴圈比較像是在走訪任意一種陣列(list、tuple...)的每個項目。 #### range()函數 ``` range(5) #表示從0到4的值 range(2, 5) #表示從2到4的值 range(2, 30, 3) #表示2到29的值,每次遞增3 ``` ### 迴圈關鍵字 While 以及 For 迴圈皆可使用 * `break` * `continue` * `else:` :當迴圈結束時執行 ## Python 函數(functions) ### 宣告函數 使用 `def` 來宣告函數。 ``` def my_function(): #TO DO ``` ### 呼叫函數 直接寫名稱就好了,記得加括號。 ``` my_function() ``` ### 參數(args) ``` def my_function(name): print("Hello, " + name) my_function("Andy") ``` ### 任意參數(\*args) 當參數數量不確定時,在參數前加上 `*` ,參數將以組合(tuple)形式傳入函數。 ``` def my_function(*names): print("Hello, " + names[0]) my_function("Andy", "Tobias", "Linus") ``` ### 關鍵字參數(kwargs) 可以指定 key = value,此時的順序不重要。 ``` def my_function(name3, name2, name1): print("Hello, " + name2) my_function(name1 = "Andy", name2 = "Tobias", name3 = "Linus") ``` ### 任意關鍵字參數(\*\*kwargs) 當參數數量不確定時,在參數前加上 `**` ,參數將以字典(dict)形式傳入函數。 ``` def my_function(**names): print("Hello, " + name["name2"]) my_function(name1 = "Tobias", name2 = "Refsnes") ``` ### 傳回值 ``` return value ``` ### Lambda 函數 Lambda是一個簡單的匿名函數,格式為: ``` x = lambda a, b : a * b print(x(5, 6)) #30 ``` 為何要使用Lambda函數? 因為可以讓一個函數重複使用,例如: ``` def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) mytripler = myfunc(3) print(mydoubler(11)) #22 print(mytripler(11)) #33 ``` **當短時間需要多個相似功能的函數時,可選擇使用Lambda函數。** ## Python 類別/物件(class/object) Python 和 Java 一樣是物件導向程式語言(object oriented),支援所謂的類別以及物件,而物件為類別的實作。 ### 建立類別 使用 `class` 關鍵字: ``` class MyClass: x = 5 ``` ### 建立物件 接續上一個,我們現在有了一個名為 MyClass 的類別,實作出名為 p1 的物件: ``` p1 = MyClass() ``` ### 建構函數 使用 `__init__()` 函數,並於宣告時在括號中加入對應的值。 ``` class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("John", 36) ``` ### 類別內函數 直接在類別中宣告一個函數就好了。 ``` class Person: def myfunc(self): print("Hello my name is " + self.name) ``` ### 自身參數 等於 Java 的 `this` ,不過 Python 中可以任意命名,只要放在第一個參數即可。 ### 刪除物件屬性 使用 `del`,刪除 p1 的 name 屬性。 ``` del p1.name ``` ### 空物件 使用 `pass` ,物件為空且不會出錯。 ``` class Person: pass ``` ## Python 繼承(inheritance) 類似 Java 繼承的概念,有父類別和子類別之分,子類別會繼承父類別所有的變數以及函數。 ### 建立子類別 ``` class Child(Parent): pass ``` 父類別可以是任意的類別,在建立子類別時將父類作為參數引入。 ### 子類別建構函數 ``` class Child(Parent): def __init__(self, fname, lname): ``` 建立子類別的 `__init__` 函數時,會覆蓋過父類別的 `__init__` 函數,這就是所謂的==override==。 ``` class Child(Parent): def __init__(self, fname, lname): Parent.__init__(self, fname, lname) self.age = 20 ``` 如果想保留父類別的 `__init__` 函數,請另外呼叫父類別的 `__init__` 函數,也可以在底下添加子類別才有的屬性。 也可以使用 `super()` 函數,將取代父類別的名稱。 ## Python 引用(import) Python之所以會好用,import是精隨阿!! ### 模組 就是一般的Python檔案,副檔名為 `.py`。 ``` # mymod.py def show(name) print("Hello, "+name) ``` ### 引用模組 ``` import mymod mymod.show("Andy") ``` 引用名為 `mymod.py` 的檔案,繼承所有的變數及函數。 ### 重新命名模組 ``` import mymod as m m.show("Andy") ``` 覺得模組名稱太長懶得打,可以重新命名。 ### 從模塊導入部分功能 ``` from mymod import show mymod.show("Andy") ``` 有時模組包太大,只想要部分功能時可使用。 ## Python 日期時間(datetime) Python 沒有原生的時間,必須引用名為 `datetime` 的模組。 ### 取得當前時間 ``` import datetime x = datetime.datetime.now() print(x) # 2021-02-01 08:13:59.312312 ``` ### 建立日期物件 ``` x = datetime.datetime(年, 月, 日, 小時, 分鐘, 秒, 毫秒, 時區) ``` 小時、分鐘、秒、毫秒、時區非必填,預設值為0(時區為None) ### 格式化日期 ``` x.strftime("%A") ``` * %a:星期英文簡寫 * %A:星期英文 * %b:月份英文簡寫 * %D:月份英文 * %d:日期 * %m:月份 * %Y:西元年 * 還有很多... ## Python 數學(math) ### 內建函數 #### 最小值 ``` x = min(5, 10, 25) ``` #### 最大值 ``` y = max(5, 10, 25) ``` #### 絕對值 ``` x = abs(-7.25) ``` #### 次方 ``` z = pow(x, y) ``` #### 小數點以下四捨五入 ``` x = round(x) ``` ### 數學模組 ``` import math ``` #### 平方根 ``` x = math.sqrt(64) ``` #### 無條件進位 ``` x = math.ceil(1.4) ``` #### 無條件捨去 ``` y = math.floor(1.4) ``` [更多...](https://www.w3schools.com/python/module_math.asp) ## Python JSON ### 導入JSON模組 ``` import json ``` ### JSON轉Python ``` p = json.loads(j) ``` ### Python轉JSON ``` j = json.dumps(p) ``` #### 縮排 ``` json.dumps(p, indent=4) ``` 以四個空白為一格tab。 #### 排序 ``` json.dumps(p, sort_keys=True) ``` 依照key字首字母,由A排到Z。 ## Python 正規表達式(RegEx) ### 導入re模組 ``` import re ``` ### 元字符 (metacharacter) 元字符為具有特殊意義的符號: * `[ ]`:數組 * `[A-Z]`:A到Z間的任意字母 * `[0-9]`:0到9間的任意數字 * `[aio]`:包含a或i或o * `[^aio]`:包含a或i或o以外的其他字母 * `\`:特殊字符,通常會在字串開頭加 `r` ,以確保字串被辨識為**原始字符串** * `\A`:指定單字在字串的開頭 * `\Z`:指定單字在字串的尾端 * `\b`:指定單字在字串的開頭或尾端 * `\d`:包含數字(0~9) * `\s`:包含空白格(space) * `\w`:包含字(word),字可以是(任意字母、任意數字以及下底線) * `.`:任意字元 * `^`:指定單字在字串的開頭 * `$`:指定單字在字串的尾端 * `*`:指定單字出現一次以上(包含零次) * `+`:指定單字出現一次以上(不包含零次) ### findall()函數 傳回包含所有匹配項的列表,如果沒找到則傳回空列表。 ``` x = re.findall("ai", txt) ``` ### search()函數 傳回第一個找到的匹配項,傳回值為物件,沒找到則傳回 `None`。 ``` x = re.search("\s", txt) print(x.start()) ``` ### split()函數 傳回一個列表,列表中的字串會依照指定字符切割。 ``` x = re.split("\s", txt) ``` ### sub()函數 傳回一個字串,新字串將匹配字符替代成指定字符,類似replace。 ``` x = re.sub("\s", "9", txt) ``` ## Python 報錯機制(try...except...) 和 Java 的 try...catch... ,一樣的原理,學過就簡單。 ### 架構 ``` try: print(x) except: print("Something went wrong") else: print("Nothing went wrong") finally: print("The 'try except' is finished") ``` * try:測試這段程式碼。 * except:如果在try階段出錯,就會直接來執行這段。 * else:如果在try階段沒有出錯,最後會來執行這段。 * finally:無論有無出錯,最後一定會執行這段。 ### 拋出異常(raise an exception) 如同Java的throw: ``` if x < 0: raise Exception("Sorry, no numbers below zero") ``` ## Python 輸入/輸出(I/O) ### 使用者輸入 input()函數回傳使用者在屏幕上輸入的值,`()`內的字則印在輸入之前: ``` username = input("Enter username:") print("Username is: " + username) ``` ### 輸出 最簡單就是用 `print()` 函數,印出結果在屏幕上,會自動換行: ``` print("Hello, World!") ``` ## Python 檔案(file) ### 開啟檔案 ``` f = open("demo.txt","r") ``` 開啟檔案需要兩個參數,檔案路徑和開啟模式。 #### 檔案路徑 * 絕對路徑 * 相對路徑 #### 開啟模式 * "r":讀取(預設值),讀取文件內容,如果檔案不存在則返回錯誤。 * "a":追加,追加內容在文件後面,如果不存在則創建文件。 * "w":寫入,會覆蓋掉原先文件的內容,如果不存在則創建文件。 * "x":創建,創建指定的文件,如果文件存在則返回錯誤。 另外可以選讀取模式 * "t",文本(默認值),文字模式 * "b",二進制,二進制模式(例如圖像) ### 讀取檔案 ``` f = open("demo.txt", "r") print(f.read()) ``` 可以指定讀取的字元數: ``` print(f.read(5)) # 只讀前五個字元 ``` 也可以一次讀一行: ``` print(f.readline()) ``` ### 寫入檔案 ``` f = open("demo.txt", "a") f.write("New content!") ``` ``` f = open("demo.txt", "w") f.write("New content!") ``` ### 創建檔案 ``` f = open("demo.txt", "w") ``` ### 刪除檔案 **必須引用 os 模組!** ``` import os os.remove("demo.txt") ``` ### 檢查檔案是否存在 如果檔案不存在會報錯,所以建議在刪除檔案前檢查一遍,其他創建、寫入檔案也是一樣的道理。 ``` import os if os.path.exists("demo.txt"): os.remove("demo.txt") else: print("The file does not exist") ``` ### 新增資料夾 ``` import os os.mkdir("folder1") ``` ### 刪除資料夾 ``` import os os.rmdir("folder1") ``` ### CMD操作 ``` os.system("CMD 指令") ``` 更多:[python 讀寫、建立檔案的方法](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/368002/) ### with...as...(建議寫法) 上面開關檔的方法當然也可以,但檔案處理過程中若是出了什麼意外,程式會直接中斷,造成已開啟的檔案未正常關檔,這時可以使用Python的with...as...寫法: ``` with open('demo.txt', 'w') as file: file.write('Hello, world!') ``` 優點為 file 只會在區塊內生效,跳出區塊便會自動關檔,非常方便! 也可以自己客製化資源管理器,但這裡不多說,有需要可以去以下連結看。 參考網址:[Python 的 with 語法使用教學:Context Manager 資源管理器](https://blog.gtwang.org/programming/python-with-context-manager-tutorial/) ## Python 查詢詳細資料 有三個步驟: 1. `type()`:了解它的型態 2. `dir()`:了解它有哪些變數、函數可以使用 3. `help()`:查詢變數、函數的功能 ### Python Help Python內建`help()`,顯示函數的功能簡介。 ``` help(print) >> print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream. ``` 也可以在自訂函數前,加上簡介,使用`"""`包圍起來。 ``` def function(a, b): """ Sum a and b and return """ return a+b help(function) >> function(a, b) Sum a and b and return ``` ## Python 小抄(好東西) ![](https://i.imgur.com/AIwaQhN.png) ## 相關文章 [Python 進階技術整理](/Q9gE7WIhSVCzvjCbqerCgg) ## 參考網站 * [W3School Python教學](https://www.w3schools.com/python/default.asp) * [Python 官方document](https://docs.python.org/zh-tw/3/tutorial/index.html)