上一次玩Python 是如何將透過Raspberry Pi將溫濕度上傳到雲端。
前一陣子剛好看到跟著微軟一起學 Python(黑暗大..),So,Let's do it
IDE:Visual Studio Code 1.39
Python:Python 3.8.0
Youtube:微軟影片Python教學
Code: Getting started with Python
影片雖然有教學,還是是簡化一下安裝步驟 (or Use Chocolatey)
1.安裝Visual Studio Code
2.安裝Python
3.打開Visual Studio Code的擴充畫面,安裝微軟的Python套件,就可以開始練習
Code: Getting started with Python
影片雖然有教學,還是是簡化一下安裝步驟 (or Use Chocolatey)
1.安裝Visual Studio Code
2.安裝Python
3.打開Visual Studio Code的擴充畫面,安裝微軟的Python套件,就可以開始練習
以下內容部分擷取自黑暗部分重點或更正內容(數字為為微軟影片集數)
9.使用字串,應更正 count() 在Python時,是查詢出現幾次,並非取字串長度
12.字串格式示範,跟C#很相近,須注意Python版本是否.3以上的寫法
#記得先引用程式庫 from datetime import datatime
#記得先引用程式庫 from datetime import datatime
18.錯誤處理示範
9.使用字串,應更正 count() 在Python時,是查詢出現幾次,並非取字串長度
12.字串格式示範,跟C#很相近,須注意Python版本是否.3以上的寫法
# Python 2
first_name = 'Ben'
last_name = 'Tseng'
output1 = 'Hello {0} {1}'.format(first_name,last_name)
print(output1)
# Only available in Python 3
output2 = f'Hello {first_name} {last_name}'
print(output2)
15.日期#記得先引用程式庫 from datetime import datatime
#取得現在時間 today = datetime.now() #將字串轉日期 datetime.strptime("2019/09/28", "%Y/%m/%d")16.日期應用示範
#記得先引用程式庫 from datetime import datatime
#Get single time print('Day: ' + str(today.day)) print('Month: ' + str(today.month)) print('Year: ' + str(today.year)) print('Hour: ' + str(today.hour)) print('Minute: ' + str(today.minute)) print('Second: ' + str(today.second)) #計算前一天的日期 datetime.now() - timedelta(days=1);17.錯誤處理
錯誤處理(Error Handling)是事前就預期到可能出錯加以防範;偵錯(Debugging)是出現沒料想到的錯誤,事後調查及修復 錯誤有三種:語法錯誤(Syntax Error)、執行期錯誤(Runtime Error)、邏輯錯誤(Logic Error)。 語法錯誤:程式寫法不符合規則,根本無法執行。 執行期錯誤:兩數相除,除數為零;執行期錯誤多是程式沒寫好,錯在 Python 的機率如同中樂透。 邏輯錯誤:想錯了,永遠不會成立不會執行到的 if 條件。 錯誤處理不是用來發現 Bug 的,不必捕捉所有可能的錯誤,不能處理就往上層丟,讓呼叫你的人處理, 都沒人處理就讓程式壞掉突顯問題,有時並不是壞事。 Stack Trace 列出整串呼叫來源(A 呼叫 B、B 呼叫 C、C 再呼叫你的程式碼)、你的程式碼在最下方,並會有程式行數。 除錯方式:再檢查程式碼、查文件、爬文、休息一下讓頭袋清醒
VSCode 有個方便功能,輸入完 try,會帶出 try、try/except、try/except/finally 選項,自動生出 try except 語法結構
try: print(x/y) except ZeroDivisionError as e: print('XD,除數不能為零啦') else: print('發生其他錯誤') finally: print('不輪對錯都會執行到這裡')19.錯誤處理示範
某個條件成立時才執行某段邏輯,用if 條件: 帶著一段 Tab 縮排的程式碼,由於 Python 不用 定義區塊,縮排也是程式碼的一部分,要遵循規則。 比較子跟 JavaScript 一樣是 > < >= <= == !=。字串比較注意大小寫視為不同(解法 .lower() 強轉小寫再比較)
20.條件式示範
21.多重條件
視變數值做不同處理可用 if ... elif (就是 else if) ... else。 if 條件可以用 or 合併兩個條件(還教了 or 成立與否的規則組合,真的是給初學者看的),很多 or 可以合併成 if X in ('A', 'B', 'C')。 有時你需要在 if 中再做第二層 if 以達成要求。
22.多重條件示範
country = input("What country do you live in? ") if country.lower() == 'canada': province = input("What province/state do you live in? ") #換行時,需使用"\",當連接符號 if province in('Alberta',\ 'Nunavut','Yukon'): tax = 0.05 elif province == 'Ontario': tax = 0.13 else: tax = 0.15 else: tax = 0.0 print(tax)23.複合條件
介紹用 and 合併兩個條件(果然也教了 and 原理),用"旗標"變數在 if 邏輯中存成布林變數記下 True / Flase 後續再利用
24.複合條件示範
25.集合
定義集合 col = ['Jeffrey', 'Darkthread', 9527] 可放入任何型別
新增元素 scores = []、scores.append(9527) 讀取元素 scores[0] (0 是第一個) 陣列跟集合有一點不同,要先引用 from array import array,陣列的元素型別必須一致,scores = new array('d') d 表 Digit 為數字陣列。
長度 len(colNames)、插入 names.insert(0, 'Jeffrey')、print(names) 會顯示所有元素(似 JSON 陣列表示方式)、排序 names.sort()、names[0:2] 從零開始取出兩個得到子集合/子陣列。 Dictionary,寫法似 JSON 表示法,curDict = { 'TW': 'TWD' }、curDict['US'] = 'USD'、print(curDict['TW'])
26.集合示範
VSCode Ctrl-D,D 變數批次一次更名,多個 Dictionary 放在一個集合中
27.迴圈
for 迴圈:用 in 決定跑的次數 (其實較類似 C# foreach) 逐一取得集合值 for name in ['Ben1','Ben2']:
跑數字從 0 到 2 for i in range(0, 3):
while 迴圈:條件成立就一直跑 while flag == 'RUN':
28.迴圈示範
# For loops names = ['Christopher', 'Susan'] for name in names: print(name) # While loops names = ['Christopher', 'Susan'] index = 0 while index < len(names): name = names[index] print(name) index = index + 129.函數(Function)
一再重複出現的相似程式邏輯寫成函數(Function)以重複利用,未來要修改只改一處,函數可接受外部傳入參數產生差異化的執行結果。
30.函數示範
也可以不引用 datetime from datetime import datetime,直接寫 datetime.datetime.now(),但引用後只需寫 datetime.now()
31.函數參數
#增加額外參數控制函數行為(例如:要不要強制轉大寫),參數可以給預設值,呼叫時省略 def get_initial(name, force_uppercase=True): if force_uppercase: initial = name[0:1].upper() else: initial = name[0:1] return initial32.函數參數示範
#類似C#具名參數,可以讓使用者知道傳了什麼參數 def error_logger(error_code, error_severity, log_to_db, error_message, source_module): print('oh no error: ' + error_message) # Imagine code here that logs our error to a database or file first_number = 10 second_number = 5 if first_number > second_number: # This function call by itself is easier to understand because I can # see how the values I pass in map to the function parameters error_logger(error_code=45, error_severity=1, log_to_db=True, error_message='Second number greater than first', source_module='adding_method')33..模組(Module)與套件(Package)
建立模組很簡單,把函數存成獨立 helpers.py 檔,引用方法
# 匯入命名空間(Namesapce),使用時要加註 Namesapce import helpers helpers.display('Not a warning') # 將所有內容匯入到目前的 Namespace from helpers import * display('Not a warning') # 只將特定項目匯入到目前的 Namespace from helpers import display display('Not a warning')只匯入特定項目的優點,避免匯入一大包東西讓 VSCode 的 Intellisense 變慢。
套件是一堆模組的集合,要知道有哪些 Package 可以用? 查 Python Package Index 或爬文。
#Install an indivdual packages 安裝 Python 套件 pip install colorama #Install from list of packages 安裝文字檔清單列舉的套件 pip install -r requirements.txt #requirements.txt colorama34.虛擬環境
套件預設裝成全機共用,但有時某些程式必須使用套件的特定版本,整台機器統一本無法滿足所有程式要求,此時可靠虛擬環境(Virtual Environment)套件解決問題。
#Install virtual environment(Only Global ) pip install virtualenv #Windows systems (-m venv or virtualenv),安裝成功會出現檔案 python -m venv <foder_name>如何進入虛擬環境,可在VSCode底下執行#OSX/Linux(bash),安裝成功會出現檔案 virtualenv <foder_name>
#Windows systems #Cmd,進入成功會顯示資料夾名稱在左邊 <foder_name>\Scripts\Activate.bat #PowerShell,進入成功會顯示資料夾名稱在左邊 <foder_name>\Scripts\Activate.ps1 #Bash . ./<foder_name>/Scripts/activate #OSX/Linux bash <foder_name>/bin/activate進入成功會顯示資料夾名稱在左邊,之後跟平常一樣 pip install,套件會裝在虛擬環境。
35. 虛擬環境示範
VSCode 能偵測到虛擬環境建立(慣例命名為 venv),主動詢問要不要把工作區切過去(3'45"),VSCode 改參考安裝在虛擬環境的套件,狀況列也會顯示目前所在的虛擬環境(5'40")
匯入多個項目:from pip._verndor.colorama import init, Fore
36.呼叫 API
透過網站提供函數、功能(Function)供其他人呼叫是目前整合第三方服務的主流做法,例如:OCR、語音識別、語言翻譯... 等等都是以 Web API 方式提供。 呼叫 API 時需附上對方發給你的 Key 以識別身分,確認有付費取得授權才提供服務。請求有兩種 GET 及 POST,GET 參數以 URL 查詢字串傳入,長度有限,特殊字元要先轉碼;POST 可從 URL 字串跟請求內文(Body)傳參數,可傳大量資料。呼叫 API 前要查文件確認所需參數及回傳結果規格。
37.API 呼叫示範
以 Azure 認知服務(Cognitive Services) 為例,從申請 Key 到完成一個上傳北極熊照片取得照片描述及顏色資訊的範例
38.JSON
API 傳回結果通常會是無排版的 JSON 格式,縮排排版後會較好閱讀;JSON 有 key/value, 陣列、Dictionary 等資料結構,results = response.json() 的 results 可用來存取 JSON 結構,results['requestId']、results['color']['domaintColorBackground']、 results['descriptions']['tags'][0]。
建立 JSON 的方法,建一個 Dictionary,放入資料(字串、數字、集合/陣列、另一個 Dictionary...),呼叫 json.dumps(objectVar)
JSON 應用技巧:偵錯時可 print 檢視、使用 Linting 工具排版方便閱讀、印出完整結構較容易看出存取寫法(如:esults['descriptions']['tags'][0])
39.JSON示範
import json # Create a dictionary object person_dict = {'first': 'Christopher', 'last':'Harrison'} # Add additional key pairs to dictionary as needed person_dict['City']='Seattle' # Create a list object of programming languages languages_list = ['CSharp','Python','JavaScript'] # Add list object to dictionary for the languages key person_dict['languages']= languages_list # Convert dictionary to JSON object person_json = json.dumps(person_dict) # Print JSON object print(person_json)40.Key 管理
Key 可用來取得付費服務,像信用卡一樣,要小心保管,不小心寫在程式碼裡上傳到 Github 分享就悲劇了。這集介紹將值保存在程式之外的方法。
import os 取得環境變數,例如:os.getenv('OS') (Windows 會傳回 WINDOWS_NT)
使用 dotnev
# 寫個 .env 檔(不要放進版控不要外流,加入 .gitignore 排除之) # 敏感內容如果能加密更好 DATABASE=my_conn_string # app.py form dotenv import load_dotenv import os load_dotenv() # 先讀系統參數,若沒有,則讀 .env 檔(預設值) database = os.getenv('DATABASE')41.Key 管理示範
安裝 pip install python-dotenv、在 .gitignore 加入 .env 防止誤存入版控上傳、示範在 Azure App 服務可以設定環境變數供 Python 讀取
42.Decorator
Decorator 是 Flask 等 Framework 的重要機制,不一定要會寫,但至少要懂。
Objects (名詞/資料構成)、Functions/Method (動詞/動作)、Decorator (形容詞)
Decorator 為程式加入額外功能,常見於 Framework,如 Django、Flask (可想像成 C# [Attribute])
def logger(func) def wrapper(): print('Logging execution') func() print('Done logging') return wrapper @logger def sample(): print('--- Inside sample function') #執行sample() # Logging execution # --- Inside sample function # Done logging43.Decorator示範
import functools from colorama import init, Fore init() def color(color): def wrapper(func): @functools.wraps(func) def runner(*args, **kwargs): print(color + 'changing to blue') func(*args, **kwargs) return runner return wrapper @color(color=Fore.BLUE) def greeter(): print('Hello, world!!') print('Just saying hi again') #執行greeter() greeter()44.踏出 Python 新手村
這系列教學的終極目標的是讓不懂 Python 的人有能力看懂線上教學繼續自我學習,例如:
* 建置 Flask 應用程式以翻譯、合成和分析文字
* 快速入門:分析本機影像 - REST、Python
Reference
跟著微軟一起學 Python(黑暗執行緒)
Programming with Python(Microsoft Developer)
沒有留言:
張貼留言