我是在翻譯如何選擇程式語言?海報時才認識 Python 這個程式語言。

在我心中它取代當年 BASIC 語言的角色,語法單純易上手,格外適合非資訊相關領域但想或需要寫程式的人學習,Python 因此在科學研究與學術領域十分受歡迎,應用廣泛。

自己有多年 C# 開發經驗,面對一般程式需求,不論命令列工具、桌面程式(Windows Form/WPF)、網站,打開 Visual Studio 幾乎都能信手拈來,一方面是 C#/.NET 夠成熟夠強大,相關資源豐富;另一方面是自己在這塊投入己深(應該超過一萬小時了),熟能生巧。 寫 C# 已能飛簷走壁,換個語言得重新從走路學起,自然就不太有學其他語言的強烈動機。

不過,這些年來,還有不免會接觸到 Python,例如玩 Raspberry Pi 搞冰箱測溫上傳雲端控制 WebCam 伺服馬達時,與電子元件溝通我就選擇直接用 Python 寫,理由很簡單,Raspberry 社群鍾愛 Python,不論是文章範例還是程式庫,現成資源滿坑滿谷,放著不用非要走自己的路,豈不自尋痛苦?另外,先前玩 3D 列印用到 Inkscape,發現 Inkscape 擴件套件也是用 Python 寫的(原本以為會是 JavaScript 或 Java),這才驚覺資訊領域早已 Python Everyone!

這幾年,伴隨人工智慧與機器學習熱潮,Python 在當中擔當要角,聲勢更是如日中天,整個 AI 生態體系幾乎都是 Python 的天下。在我心中,Python 頗有當年 JavaScript 的氣勢,快速滲透到各種「需要寫程式」的應用場合,所以也跟 JavaScript 一樣,即使你主修 Java、C#、C/C++,Python 仍是一門投資報酬率高,值得學習的第二程式語言,遲早派得上用場。不然退一百步,就算抱著「快學,不然人家會以為我們不懂」的心態,也該對它有點了解。

微軟最近有個意外之舉,推出一系列給初學者的 Python 教學影片,整套影片共 44 集,每集時間不長,短則 3 分鐘,最長不到 13 分鐘,不難入口;從最基本一步一步教起,稍具程式基礎就一定能上手,真心不騙。

微軟製作的教學格外對我胃口,工具又是 Visual Studio Code,索性趁著周末一股作氣把 44 集刷完,Python 技能點數 +1。

註:課程雖是英文,但用詞蠻淺白的(Christopher 還刻意放慢語速,佛心來著),但只怪我的英聽不爭氣,用力聽是能聽懂啦,但很快就 CPU 過熱,開啟字幕就完全沒障礙了。

做筆記是逼自己認真最最有效的方法,也方便日後復習或分享給其他要入門的同學,所以,44 集學習筆記來了。

  1. 課程簡介
    講師 Christopher Harrison 與 Susan Ibach 先做自我介紹,兩位講師都是馬拉松跑者。(劃錯重點)
    教學會以 Python 3 為主,並假設學員已有一點程式語言基礎(例如 JavaScript, Scratch 也成), 如果不習慣影片步調或覺得聽 ICRT 太累,直接看投影片程式範例也沒問題。
    另外,這系列課程的主旨只在於奠定大家能看懂其他 Python 線上教學持續自我學習的能力,要能發揮 Python 的威力仍需更多的學習。
  2. Python 簡介
    Python 是直譯式語言,由 Guido van Rossum 推出於 1991。其具有高彈性,語法接近英文易於閱讀(沒有 😉,開發社群強大,資源豐富,被廣泛用於 AI、機器學習、網站開發、自動化工具...
  3. Python 下載與安裝
    介紹如何下載及安裝 Python,除非有相容 2.x 版需求,請用 Python 3。 另外,既然是微軟的影片,自然會介紹開發 Python 的最佳工具 Visual Stduio Code (以下簡稱 VSCode,支援 Windows/Mac/Linux)。
  4. VSCode 安裝 Python 套件
    示範如何在 VSCode 安裝 Python 擴充套件。
  5. Hello World 來了
    終於等到 Hello world 了 😛
    字串用單雙引號包夾都可以,一致就好(好像比較多人偏愛單引號,看起來清爽,打字時不用 Shift 就能按出來)。
    要跳脫換行符號字元也是用「\n」,順便介紹用 print() 顯示訊息方便偵錯的小技巧。 註:這集的字幕放錯了
  6. VSCode 操作演練
    示範實際用 VSCode 顯示 Hello World、用 input() 讀取使用者輸入、多加 print() 訊息偵錯
  7. 寫註解救自己
    Python 註解以 # 起首,解釋程式碼用意及注意事項(很多時候是幫自己,幾個月後回來看 Code 才知自己在寫什麼鬼),另外把可疑程式碼暫時註解掉是很常用的除錯技巧。
  8. 註解示範
    快速鍵 Ctrl K,C 與 Ctrl K,U 加註解與移除註解
  9. 使用字串
    在 Python 要用變數不必宣告,字串用 + 相加,.upper()、.lower()、.capitalize() 第一個字元大寫、.count() 取字串長度
  10. 字串應用示範
    順便示範了 VSCode 的程式碼提示與自動完成功能(Intellisense),以及語法警告標示(綠蚯蚓)
  11. 字串格式
    Python 2.x "blah ".format(a, b)、"blah {0} {1}".format(a, b)、Python 3 則建議用 f"blah " (如 C# 字串插值)
  12. 字串格式示範
  13. 數字
    ** 為次方(6**2 == 36),數字變數直接加字串變數會出錯,str(n) 數字轉字串,float(s)、int(s) 轉浮點數、整數
  14. 數字應用示範
  15. 日期
    記得先引用程式庫 from datetime import datatime, datetime.now() 現在時間, str(dateVar) 得到 2012-12-21 00:00:00.000; 計算一天前 datetime.now() - timedelta(days=1);取年月日用 .year, .month, .day; datetime.strptime("2019/09/28", "%Y/%m/%d") 將字串轉日期
  16. 日期應用示範
    時分秒 .hour, .minute, .second;留下strptime() 日期格式不符錯誤的狀況下集待續
  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('暗,除數不能為零啦')
    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. 多重條件示範
  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 ['Jeffrey','Darkthead']:
    跑數字從 0 到 2 for i in range(0, 3):
    while 迴圈:條件成立就一直跑 while flag == 'RUN':
  28. 迴圈示範
  29. 函數(Function)
    一再重複出現的相似程式邏輯寫成函數(Function)以重複利用,未來要修改只改一處,函數可接受外部傳入參數產生差異化的執行結果。
    def print_time(task_name):
        print(f'task {task_name} completed')
        print(datetime.now())
    
    字串 string_var[0:1] 取第一個字元,程式拆成多行時在尾巴加 \
  30. 函數示範
    也可以不引用 datetime from datetime import datetime,直接寫 datetime.datetime.now(),但引用後只需寫 datetime.now()
  31. 函數參數
    增加額外參數控制函數行為(例如:要不要強制轉大寫),參數可以給預設值,呼叫時省略
    def get_initial(name, forece_uppercase=True)
        if force_uppercase:
            initial = name[0:1].upper()
        else:
            initial = name[0:1]
        return initial
    
    呼叫時參數若具名可不照順序,而且較好閱讀,error_log(code=45, severity=1, write_to_db=True, message='Oops')
  32. 函數參數示範
  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 或爬文。
    安裝 Python 套件 pip install colorama、安裝文字檔清單列舉的套件 pip install -r requirements.txt
  34. 虛擬環境
    套件預設裝成全機共用,但有時某些程式必須使用套件的特定版本,整台機器統一本無法滿足所有程式要求,此時可靠虛擬環境(Virtual Environment)套件解決問題。
    用 pip install virtualenv 安裝,使用 python -m venv <資料夾名稱> (Windows) 或 virtualenv <資料夾名稱> (OSX/Linux) 建立虛擬環境資料夾。
    進入虛擬環境 <資料夾名稱>\Scripts\Activate.bat (Cmd)、<資料夾名稱>\Scripts\Activate.ps1 (PowerShell)、. ./<資料夾名稱>/Scripts/activate (Bash)、 <資料夾名稱>/bin/activate (OSX/Linux bash),之後跟平常一樣 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 前要查文件確認所需參數及回傳結果規格。
    Python 需要 requests 程式庫簡化 API 呼叫程式的寫法。requests.post(url, http_headers, function_parameters, message_body)
  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示範
    示範從北極熊照片分析 JSON 結果取出資訊,以及憑空捏出物件轉成 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])
    @rount('api/products')
    def get_products:
        # 從 DB 讀資料...
        pass
    
  43. Decorator示範
    自己寫一個 Decorator
    def logger(func) 
        def wrapper():
            print('Logging execution')
            func()
            print('Done logging')
        return wrapper
    
    @logger
    def sample():
        print('--- Inside sample function')
    
  44. 踏出 Python 新手村
    這系列教學的終極目標的是讓不懂 Python 的人有能力看懂線上教學繼續自我學習,例如:
    * 建置 Flask 應用程式以翻譯、合成和分析文字
    * 快速入門:分析本機影像 - REST、Python
    刷完整套影片,我還真能看懂上述兩篇教學裡的程式範例,不再有陌生感。

呼! 拎杯現在略懂 Python 了。(灑花)

My notes of going throuhg 44 tutorial videos of "Python for Beginners".


Comments

# by ByTIM

不錯,剛好快國慶連假了,那時來學一波好了! 到時候再來請教一下樓主。

# by paicheng0111

在VSCode的終端機模式跑Python程式,時不時地出現CP950錯誤。 不知道黑暗大有沒有遇過?

# by m

推薦這個 pandas 的使用技巧. https://leemeng.tw/practical-pandas-tutorial-for-aspiring-data-scientists.html

# by ByTIM

想問下,VS CODE一直說 ,Linter pylint is not installed. ,我點安裝,會跑下面的指令 & C:/Users/....Python/Python37-32/python.exe -m pip install -U pylint --user 最後抱錯 ERROR: Error [WinError 87] 參數錯誤。 while executing command python setup.py egg_info ERROR: Could not install packages due to an EnvironmentError: [WinError 87] 參數錯誤。 目前用設定.json把它關掉 { "python.linting.enabled": false } 這個您有遇過嗎?

# by Jeffrey

to ByTIM, 我也有跳出安裝 pylint 提示,點安裝就順利安裝啟用了,沒遇到問題。

# by jade

請教一下 如果用C# 當主體程式端 某個Function透過 Python包好的Function執行 ~ 這樣做法建議嗎?

# by Jeffrey

to jade, 這樣的程式架構頗複雜,我唯一想到的優點是已會 C# 不想學 Python,而 Python 有一些 C# 缺乏的現成函式想直接叫用。理論上把 Python 看成外部 EXE 程式,是有方法整合:https://blog.darkthread.net/blog/outputdatereceived/ 但真心不覺得這是有效率的好做法,不推。

# by Johnny

黑大請問一下,投影片這個網址沒有東西,是因為有版權被下架了嗎?

# by Jeffrey

to Johnny,作者在定稿 Commit 時把檔案移掉了(未說明原因) https://github.com/microsoft/c9-python-getting-started/commit/c66cb7c9d392dd8e9f49bbc7a42034d24421a422 如果想看可以 git clone 回來,再從歷史把它們取出來。

Post a comment