Skip to content

Latest commit

 

History

History
618 lines (434 loc) · 28.6 KB

README.md

File metadata and controls

618 lines (434 loc) · 28.6 KB

Python - 100天從新手到大師

作者:駱昊

說明:從專案上線到獲得8w+星標以來,一直收到反饋說基礎部分(前15天的內容)對新手來說是比較困難的,建議有配套影片進行講解。最近把基礎部分的內容重新制作了一個名為“Python-Core-50-Courses”的專案,用更為簡單通俗的方式重寫了這部分內容並附帶了影片講解,初學者可以關注下這個新專案。如果需要Python基礎影片,可以在“B站”搜尋《Python零基礎快速上手》,這套影片是我講課的時候錄製的隨堂影片,畫質尚可、音質一般,但是對初學者應該會有些幫助,歡迎大家留言、評論、發彈幕。學習之後覺得有收穫的小夥伴可以“一鍵三連”來支援UP主(千鋒Python)。國內使用者如果訪問GitHub比較慢的話,可以關注我的知乎號Python-Jack,上面的“從零開始學Python”專欄比較適合初學者,其他的專欄也在持續創作和更新中,歡迎大家關注並點贊評論。

創作不易,感謝大家的打賞支援,這些錢不會用於個人消費(例如:購買咖啡),而是透過騰訊公益、美團公益、水滴籌等平臺捐贈給需要幫助的人(點選瞭解捐贈情況)。需要加入QQ學習群的可以掃描下面的二維碼,三個群加一個即可,不要重複進群。學習群會為大家提供學習資源問題解答,如果有Python體驗課行業公開課會提前在群裡通知大家,歡迎大家加入。

專案“Day80~90”部分目前仍在創作中,因為作者平時也擠不出太多時間來寫文件,因此更新的速度比較緩慢,感謝大家的理解。

Python應用領域和職業發展分析

簡單的說,Python是一個“優雅”、“明確”、“簡單”的程式語言。

  • 學習曲線低,非專業人士也能上手
  • 開源系統,擁有強大的生態圈
  • 解釋型語言,完美的平臺可移植性
  • 動態型別語言,支援面向物件和函數語言程式設計
  • 程式碼規範程度高,可讀性強

Python在以下領域都有用武之地。

  • 後端開發 - Python / Java / Go / PHP
  • DevOps - Python / Shell / Ruby
  • 資料採集 - Python / C++ / Java
  • 量化交易 - Python / C++ / R
  • 資料科學 - Python / R / Julia / Matlab
  • 機器學習 - Python / R / C++ / Julia
  • 自動化測試 - Python / Shell

作為一名Python開發者,根據個人的喜好和職業規劃,可以選擇的就業領域也非常多。

  • Python後端開發工程師(伺服器、雲平臺、資料介面)
  • Python運維工程師(自動化運維、SRE、DevOps)
  • Python資料分析師(資料分析、商業智慧、數字化運營)
  • Python資料探勘工程師(機器學習、深度學習、演算法專家)
  • Python爬蟲工程師
  • Python測試工程師(自動化測試、測試開發)

說明:目前,資料分析和資料探勘是非常熱門的方向,因為不管是網際網路行業還是傳統行業都已經積累了大量的資料,各行各業都需要資料分析師從已有的資料中發現更多的商業價值,從而為企業的決策提供資料的支撐,這就是所謂的資料驅動決策。

給初學者的幾個建議:

  • Make English as your working language. (讓英語成為你的工作語言)
  • Practice makes perfect. (熟能生巧)
  • All experience comes from mistakes. (所有的經驗都源於你犯過的錯誤)
  • Don't be one of the leeches. (不要當伸手黨)
  • Either outstanding or out. (要麼出眾,要麼出局)

Day01 - 初識Python

  • Python簡介 - Python的歷史 / Python的優缺點 / Python的應用領域
  • 搭建程式設計環境 - Windows環境 / Linux環境 / MacOS環境
  • 從終端執行Python程式 - Hello, world / print函式 / 執行程式
  • 使用IDLE - 互動式環境(REPL) / 編寫多行程式碼 / 執行程式 / 退出IDLE
  • 註釋 - 註釋的作用 / 單行註釋 / 多行註釋

Day02 - 語言元素

  • 程式和進位制 - 指令和程式 / 馮諾依曼機 / 二進位制和十進位制 / 八進位制和十六進位制
  • 變數和型別 - 變數的命名 / 變數的使用 / input函式 / 檢查變數型別 / 型別轉換
  • 數字和字串 - 整數 / 浮點數 / 複數 / 字串 / 字串基本操作 / 字元編碼
  • 運算子 - 數學運算子 / 賦值運算子 / 比較運算子 / 邏輯運算子 / 身份運算子 / 運算子的優先順序
  • 應用案例 - 華氏溫度轉換成攝氏溫度 / 輸入圓的半徑計算周長和麵積 / 輸入年份判斷是否是閏年

Day03 - 分支結構

  • 分支結構的應用場景 - 條件 / 縮排 / 程式碼塊 / 流程圖
  • if語句 - 簡單的if / if-else結構 / if-elif-else結構 / 巢狀的if
  • 應用案例 - 使用者身份驗證 / 英制單位與公制單位互換 / 擲骰子決定做什麼 / 百分制成績轉等級制 / 分段函式求值 / 輸入三條邊的長度如果能構成三角形就計算周長和麵積

Day04 - 迴圈結構

  • 迴圈結構的應用場景 - 條件 / 縮排 / 程式碼塊 / 流程圖
  • while迴圈 - 基本結構 / break語句 / continue語句
  • for迴圈 - 基本結構 / range型別 / 迴圈中的分支結構 / 巢狀的迴圈 / 提前結束程式
  • 應用案例 - 1~100求和 / 判斷素數 / 猜數字遊戲 / 列印九九表 / 列印三角形圖案 / 猴子吃桃 / 百錢百雞
  • 經典案例:水仙花數 / 百錢百雞 / Craps賭博遊戲
  • 練習題目:斐波那契數列 / 完美數 / 素數
  • 函式的作用 - 程式碼的壞味道 / 用函式封裝功能模組
  • 定義函式 - def關鍵字 / 函式名 / 引數列表 / return語句 / 呼叫自定義函式
  • 呼叫函式 - Python內建函式 / 匯入模組和函式
  • 函式的引數 - 預設引數 / 可變引數 / 關鍵字引數 / 命名關鍵字引數
  • 函式的返回值 - 沒有返回值 / 返回單個值 / 返回多個值
  • 作用域問題 - 區域性作用域 / 巢狀作用域 / 全域性作用域 / 內建作用域 / 和作用域相關的關鍵字
  • 用模組管理函式 - 模組的概念 / 用自定義模組管理函式 / 命名衝突的時候會怎樣(同一個模組和不同的模組)
  • 字串的使用 - 計算長度 / 下標運算 / 切片 / 常用方法
  • 列表基本用法 - 定義列表 / 用下表訪問元素 / 下標越界 / 新增元素 / 刪除元素 / 修改元素 / 切片 / 迴圈遍歷
  • 列表常用操作 - 連線 / 複製(複製元素和複製陣列) / 長度 / 排序 / 倒轉 / 查詢
  • 生成列表 - 使用range建立數字列表 / 生成表示式 / 生成器
  • 元組的使用 - 定義元組 / 使用元組中的值 / 修改元組變數 / 元組和列表轉換
  • 集合基本用法 - 集合和列表的區別 / 建立集合 / 新增元素 / 刪除元素 / 清空
  • 集合常用操作 - 交集 / 並集 / 差集 / 對稱差 / 子集 / 超集
  • 字典的基本用法 - 字典的特點 / 建立字典 / 新增元素 / 刪除元素 / 取值 / 清空
  • 字典常用操作 - keys方法 / values方法 / items方法 / setdefault方法
  • 基礎練習 - 跑馬燈效果 / 列表找最大元素 / 統計考試成績的平均分 / Fibonacci數列 / 楊輝三角
  • 綜合案例 - 雙色球選號 / 井字棋
  • 類和物件 - 什麼是類 / 什麼是物件 / 面向物件其他相關概念
  • 定義類 - 基本結構 / 屬性和方法 / 構造器 / 析構器 / __str__方法
  • 使用物件 - 建立物件 / 給物件發訊息
  • 面向物件的四大支柱 - 抽象 / 封裝 / 繼承 / 多型
  • 基礎練習 - 定義學生類 / 定義時鐘類 / 定義圖形類 / 定義汽車類
  • 屬性 - 類屬性 / 例項屬性 / 屬性訪問器 / 屬性修改器 / 屬性刪除器 / 使用__slots__
  • 類中的方法 - 例項方法 / 類方法 / 靜態方法
  • 運算子過載 - __add__ / __sub__ / __or__ /__getitem__ / __setitem__ / __len__ / __repr__ / __gt__ / __lt__ / __le__ / __ge__ / __eq__ / __ne__ / __contains__
  • 類(的物件)之間的關係 - 關聯 / 繼承 / 依賴
  • 繼承和多型 - 什麼是繼承 / 繼承的語法 / 呼叫父類方法 / 方法重寫 / 型別判定 / 多重繼承 / 菱形繼承(鑽石繼承)和C3演算法
  • 綜合案例 - 工資結算系統 / 圖書自動折扣系統 / 自定義分數類
  • 使用tkinter開發GUI程式
  • 使用pygame三方庫開發遊戲應用
  • “大球吃小球”遊戲
  • 讀檔案 - 讀取整個檔案 / 逐行讀取 / 檔案路徑
  • 寫檔案 - 覆蓋寫入 / 追加寫入 / 文字檔案 / 二進位制檔案
  • 異常處理 - 異常機制的重要性 / try-except程式碼塊 / else程式碼塊 / finally程式碼塊 / 內建異常型別 / 異常棧 / raise語句
  • 資料持久化 - CSV檔案概述 / csv模組的應用 / JSON資料格式 / json模組的應用
  • 字串高階操作 - 跳脫字元 / 原始字串 / 多行字串 / innot in運算子 / is_xxx方法 / joinsplit方法 / strip相關方法 / pyperclip模組 / 不變字串和可變字串 / StringIO的使用
  • 正則表示式入門 - 正則表示式的作用 / 元字元 / 轉義 / 量詞 / 分組 / 零寬斷言 /貪婪匹配與惰性匹配懶惰 / 使用re模組實現正則表示式操作(匹配、搜尋、替換、捕獲)
  • 使用正則表示式 - re模組 / compile函式 / groupgroups方法 / match方法 / search方法 / findallfinditer方法 / subsubn方法 / split方法
  • 應用案例 - 使用正則表示式驗證輸入的字串
  • 程序和執行緒的概念 - 什麼是程序 / 什麼是執行緒 / 多執行緒的應用場景
  • 使用程序 - fork函式 / multiprocessing模組 / 程序池 / 程序間通訊
  • 使用執行緒 - threading模組 / Thread類 / RLock類 / Condition類 / 執行緒池
  • 計算機網路基礎 - 計算機網路發展史 / “TCP-IP”模型 / IP地址 / 埠 / 協議 / 其他相關概念
  • 網路應用模式 - “客戶端-伺服器”模式 / “瀏覽器-伺服器”模式
  • 基於HTTP協議訪問網路資源 - 網路API概述 / 訪問URL / requests三方庫 / 解析JSON格式資料
  • Python網路程式設計 - 套接字的概念 / socket模組 / socket函式 / 建立TCP伺服器 / 建立TCP客戶端 / 建立UDP伺服器 / 建立UDP客戶端
  • 電子郵件 - SMTP協議 / POP3協議 / IMAP協議 / smtplib模組 / poplib模組 / imaplib模組
  • 簡訊服務 - 呼叫簡訊服務閘道器
  • 用Pillow處理圖片 - 圖片讀寫 / 圖片合成 / 幾何變換 / 色彩轉換 / 濾鏡效果
  • 讀寫Word文件 - 文字內容的處理 / 段落 / 頁首和頁尾 / 樣式的處理
  • 讀寫Excel檔案 - xlrd / xlwt / openpyxl

Day16~Day20 - Python語言進階

  • 常用資料結構
  • 函式的高階用法 - “一等公民” / 高階函式 / Lambda函式 / 作用域和閉包 / 裝飾器
  • 面向物件高階知識 - “三大支柱” / 類與類之間的關係 / 垃圾回收 / 魔術屬性和方法 / 混入 / 元類 / 面向物件設計原則 / GoF設計模式
  • 迭代器和生成器 - 相關魔術方法 / 建立生成器的兩種方式 /
  • 併發和非同步程式設計 - 多執行緒 / 多程序 / 非同步IO / asyncawait

Day21~30 - Web前端入門

  • 用HTML標籤承載頁面內容
  • 用CSS渲染頁面
  • 用JavaScript處理互動式行為
  • jQuery入門和提高
  • Vue.js入門
  • Element的使用
  • Bootstrap的使用
  • 作業系統發展史和Linux概述
  • Linux基礎命令
  • Linux中的實用程式
  • Linux的檔案系統
  • Vim編輯器的應用
  • 環境變數和Shell程式設計
  • 軟體的安裝和服務的配置
  • 網路訪問和管理
  • 其他相關內容
  • 關係型資料庫概述
  • MySQL的安裝和使用
  • SQL的使用
  • DDL - 資料定義語言 - create / drop / alter
  • DML - 資料操作語言 - insert / delete / update
  • DQL - 資料查詢語言 - select
  • DCL - 資料控制語言 - grant / revoke
  • MySQL新特性
  • 視窗函式的應用
  • JSON資料型別
  • 相關知識
  • 資料完整性和一致性
  • 檢視、函式、過程、觸發器
  • 事務和鎖
  • 執行計劃和索引
  • 正規化理論和反正規化設計
  • 在Python中操作MySQL

Day41~55 - 實戰Django

  • Web應用工作機制
  • HTTP請求和響應
  • Django框架概述
  • 5分鐘快速上手

Day42 - 深入模型

  • 關係型資料庫配置
  • 使用ORM完成對模型的CRUD操作
  • 管理後臺的使用
  • Django模型最佳實踐
  • 模型定義參考
  • 載入靜態資源
  • Ajax概述
  • 用Ajax實現投票功能
  • 實現使用者跟蹤
  • cookie和session的關係
  • Django框架對session的支援
  • 檢視函式中的cookie讀寫操作
  • 透過HttpResponse修改響應頭
  • 使用StreamingHttpResponse處理大檔案
  • 使用xlwt生成Excel報表
  • 使用reportlab生成PDF報表
  • 使用ECharts生成前端圖表
  • 配置日誌
  • 配置Django-Debug-Toolbar
  • 最佳化ORM程式碼
  • 什麼是中介軟體
  • Django框架內建的中介軟體
  • 自定義中介軟體及其應用場景
  • 返回JSON格式的資料
  • 用Vue.js渲染頁面

Day51 - 使用快取

  • 網站最佳化第一定律

  • 在Django專案中使用Redis提供快取服務

  • 在檢視函式中讀寫快取

  • 使用裝飾器實現頁面快取

  • 為資料介面提供快取服務

  • 檔案上傳表單控制元件和圖片檔案預覽
  • 伺服器端如何處理上傳的檔案
  • 網站最佳化第二定律
  • 配置訊息佇列服務
  • 在專案中使用Celery實現任務非同步化
  • 在專案中使用Celery實現定時任務

Day54 - 單元測試

Day55 - 專案上線

  • Python中的單元測試
  • Django框架對單元測試的支援
  • 使用版本控制系統
  • 配置和使用uWSGI
  • 動靜分離和Nginx配置
  • 配置HTTPS
  • 配置域名解析
  • FastAPI五分鐘上手
  • 請求和響應
  • 接入關係型資料庫
  • 依賴注入
  • 中介軟體
  • 非同步化
  • 虛擬化部署(Docker)
  • 專案實戰:車輛違章查詢專案

Day61~65 - 爬蟲開發

  • 網路爬蟲的概念及其應用領域
  • 網路爬蟲的合法性探討
  • 開發網路爬蟲的相關工具
  • 一個爬蟲程式的構成

Day62 - 資料抓取和解析

Day63 - Python中的併發程式設計

Day66~80 - 資料分析

Day67 - 環境準備

Day83 - 決策樹

Day87 - 迴歸分析

Day91~100 - 團隊專案開發

  1. 軟體過程模型

    • 經典過程模型(瀑布模型)

      • 可行性分析(研究做還是不做),輸出《可行性分析報告》。
      • 需求分析(研究做什麼),輸出《需求規格說明書》和產品介面原型圖。
      • 概要設計和詳細設計,輸出概念模型圖(ER圖)、物理模型圖、類圖、時序圖等。
      • 編碼 / 測試。
      • 上線 / 維護。

      瀑布模型最大的缺點是無法擁抱需求變化,整套流程結束後才能看到產品,團隊士氣低落。

    • 敏捷開發(Scrum)- 產品所有者、Scrum Master、研發人員 - Sprint

      • 產品的Backlog(使用者故事、產品原型)。
      • 計劃會議(評估和預算)。
      • 日常開發(站立會議、番茄工作法、結對程式設計、測試先行、程式碼重構……)。
      • 修復bug(問題描述、重現步驟、測試人員、被指派人)。
      • 釋出版本。
      • 評審會議(Showcase,使用者需要參與)。
      • 回顧會議(對當前迭代週期做一個總結)。

      補充:敏捷軟體開發宣言

      • 個體和互動 高於 流程和工具
      • 工作的軟體 高於 詳盡的文件
      • 客戶合作 高於 合同談判
      • 響應變化 高於 遵循計劃

      角色:產品所有者(決定做什麼,能對需求拍板的人)、團隊負責人(解決各種問題,專注如何更好的工作,遮蔽外部對開發團隊的影響)、開發團隊(專案執行人員,具體指開發人員和測試人員)。

      準備工作:商業案例和資金、合同、憧憬、初始產品需求、初始釋出計劃、入股、組建團隊。

      敏捷團隊通常人數為8-10人。

      工作量估算:將開發任務量化,包括原型、Logo設計、UI設計、前端開發等,儘量把每個工作分解到最小任務量,最小任務量標準為工作時間不能超過兩天,然後估算總體專案時間。把每個任務都貼在看板上面,看板上分三部分:to do(待完成)、in progress(進行中)和done(已完成)。

  2. 專案團隊組建

    • 團隊的構成和角色

      說明:謝謝付祥英女士幫助我繪製了下面這張精美的公司組織架構圖。

      company_architecture

    • 程式設計規範和程式碼審查(flake8pylint

    • Python中的一些“慣例”(請參考《Python慣例-如何編寫Pythonic的程式碼》

    • 影響程式碼可讀性的原因:

      • 程式碼註釋太少或者沒有註釋
      • 程式碼破壞了語言的最佳實踐
      • 反模式程式設計(義大利麵程式碼、複製-黏貼程式設計、自負程式設計、……)
  3. 團隊開發工具介紹

    請參考《團隊專案開發的問題和解決方案》

專案選題和理解業務
  1. 選題範圍設定

    • CMS(使用者端):新聞聚合網站、問答/分享社群、影評/書評網站等。

    • MIS(使用者端+管理端):KMS、KPI考核系統、HRS、CRM系統、供應鏈系統、倉儲管理系統等。

    • App後臺(管理端+資料介面):二手交易類、報刊雜誌類、小眾電商類、新聞資訊類、旅遊類、社交類、閱讀類等。

    • 其他型別:自身行業背景和工作經驗、業務容易理解和把控。

  2. 需求理解、模組劃分和任務分配

    • 需求理解:頭腦風暴和競品分析。
    • 模組劃分:畫思維導圖(XMind),每個模組是一個枝節點,每個具體的功能是一個葉節點(用動詞表述),需要確保每個葉節點無法再生出新節點,確定每個葉子節點的重要性、優先順序和工作量。
    • 任務分配:由專案負責人根據上面的指標為每個團隊成員分配任務。

  3. 制定專案進度表(每日更新)

    模組 功能 人員 狀態 完成 工時 計劃開始 實際開始 計劃結束 實際結束 備註
    評論 新增評論 王大錘 正在進行 50% 4 2018/8/7 2018/8/7
    刪除評論 王大錘 等待 0% 2 2018/8/7 2018/8/7
    檢視評論 白元芳 正在進行 20% 4 2018/8/7 2018/8/7 需要進行程式碼審查
    評論投票 白元芳 等待 0% 4 2018/8/8 2018/8/8
  4. OOAD和資料庫設計

  • UML(統一建模語言)的類圖

    uml

  • 透過模型建立表(正向工程),例如在Django專案中可以透過下面的命令建立二維表。

    python manage.py makemigrations app
    python manage.py migrate
  • 使用PowerDesigner繪製物理模型圖。

  • 透過資料表建立模型(反向工程),例如在Django專案中可以透過下面的命令生成模型。

    python manage.py inspectdb > app/models.py
  1. Docker簡介
  2. 安裝Docker
  3. 使用Docker建立容器(Nginx、MySQL、Redis、Gitlab、Jenkins)
  4. 構建Docker映象(Dockerfile的編寫和相關指令)
  5. 容器編排(Docker-compose)
  6. 叢集管理(Kubernetes)

第95天:[使用Django開發商業專案](./Day91-100/95.使用Django開發商業項 目.md)

專案開發中的公共問題
  1. 資料庫的配置(多資料庫、主從複製、資料庫路由)
  2. 快取的配置(分割槽快取、鍵設定、超時設定、主從複製、故障恢復(哨兵))
  3. 日誌的配置
  4. 分析和除錯(Django-Debug-ToolBar)
  5. 好用的Python模組(日期計算、影象處理、資料加密、三方API)
REST API設計
  1. RESTful架構
  2. API介面文件的撰寫
  3. django-REST-framework的應用
專案中的重點難點剖析
  1. 使用快取緩解資料庫壓力 - Redis
  2. 使用訊息佇列做解耦合和削峰 - Celery + RabbitMQ
單元測試
  1. 測試的種類
  2. 編寫單元測試(unittestpytestnose2toxddt、……)
  3. 測試覆蓋率(coverage
Django專案部署
  1. 部署前的準備工作
    • 關鍵設定(SECRET_KEY / DEBUG / ALLOWED_HOSTS / 快取 / 資料庫)
    • HTTPS / CSRF_COOKIE_SECUR / SESSION_COOKIE_SECURE
    • 日誌相關配置
  2. Linux常用命令回顧
  3. Linux常用服務的安裝和配置
  4. uWSGI/Gunicorn和Nginx的使用
    • Gunicorn和uWSGI的比較
      • 對於不需要大量定製化的簡單應用程式,Gunicorn是一個不錯的選擇,uWSGI的學習曲線比Gunicorn要陡峭得多,Gunicorn的預設引數就已經能夠適應大多數應用程式。
      • uWSGI支援異構部署。
      • 由於Nginx本身支援uWSGI,在線上一般都將Nginx和uWSGI捆綁在一起部署,而且uWSGI屬於功能齊全且高度定製的WSGI中介軟體。
      • 在效能上,Gunicorn和uWSGI其實表現相當。
  5. 使用虛擬化技術(Docker)部署測試環境和生產環境
效能測試
  1. AB的使用
  2. SQLslap的使用
  3. sysbench的使用
自動化測試
  1. 使用Shell和Python進行自動化測試
  2. 使用Selenium實現自動化測試
    • Selenium IDE
    • Selenium WebDriver
    • Selenium Remote Control
  3. 測試工具Robot Framework介紹
  1. MySQL資料庫調優
  2. Web伺服器效能最佳化
    • Nginx負載均衡配置
    • Keepalived實現高可用
  3. 程式碼效能調優
    • 多執行緒
    • 非同步化
  4. 靜態資源訪問最佳化
    • 雲端儲存
    • CDN