google code prettify

2020年2月9日 星期日

[Python] 我也來Python 一下 P_Y

上一次玩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套件,就可以開始練習

以下內容部分擷取自黑暗部分重點或更正內容(數字為為微軟影片集數)

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 再呼叫你的程式碼)、你的程式碼在最下方,並會有程式行數。
除錯方式:再檢查程式碼、查文件、爬文、休息一下讓頭袋清醒
18.錯誤處理示範
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 + 1
29.函數(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 initial
32.函數參數示範
#類似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
colorama
34.虛擬環境
套件預設裝成全機共用,但有時某些程式必須使用套件的特定版本,整台機器統一本無法滿足所有程式要求,此時可靠虛擬環境(Virtual Environment)套件解決問題。
#Install virtual environment(Only Global )
pip install virtualenv 

#Windows systems (-m venv or virtualenv),安裝成功會出現檔案
python -m venv <foder_name> 

#OSX/Linux(bash),安裝成功會出現檔案
virtualenv <foder_name>

如何進入虛擬環境,可在VSCode底下執行
#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 logging
43.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)

沒有留言:

張貼留言