作者:駱昊
最近有很多想學習Python的小夥伴陸陸續續加入我們的交流群,目前我們的交流群人數已經超過一萬人,光靠我自己已經無法及時處理小夥伴們的入群申請,更無法及時為大家解答問題。目前我的想法是分技術方向建立討論群並安排專門的人來管理這些群,群管理者應該具備專業的知識並有相對充裕的時間,可以解答小夥伴們提出的問題。當然,我會向這些管理者支付報酬,如果有興趣成為管理者的可以跟我私聊。希望通過這種方式,我們能匯聚更多優秀的Python開發者,一方面打造溝通和交流的平臺,另一方面讓新入行的開發者獲得問道的途徑並藉此迅速成長。我會繼續努力做好線上公開課以及線下技術交流活動,也希望各位小夥伴一如既往的支持我們。創作不易,感謝大家的打賞支持,這些錢不會用於購買咖啡而是捐贈給支教組織(點擊瞭解捐贈情況)。感謝北京千鋒互聯科技有限公司Python教學部對公開課提供的支持。
溫馨提示:中間的Python100天交流群之初入江湖為付費群,會安排專門的群管理者為大家解答問題;右側的Python後端開發討論群和Python爬蟲開發討論群為免費群,從事Web後端開發和爬蟲開發的小夥伴可以加群交流,萌新勿入。
簡單的說,Python是一個“優雅”、“明確”、“簡單”的編程語言。
- 學習曲線低,非專業人士也能上手
- 開源系統,擁有強大的生態圈
- 解釋型語言,完美的平臺可移植性
- 支持面向對象和函數式編程
- 能夠通過調用C/C++代碼擴展功能
- 代碼規範程度高,可讀性強
目前幾個比較流行的領域,Python都有用武之地。
- 雲基礎設施 - Python / Java / Go
- DevOps - Python / Shell / Ruby / Go
- 網絡爬蟲 - Python / PHP / C++
- 數據分析挖掘 - Python / R / Scala / Matlab
- 機器學習 - Python / R / Java / Lisp
作為一名Python開發者,主要的就業領域包括:
- Python服務器後臺開發 / 遊戲服務器開發 / 數據接口開發工程師
- Python自動化運維工程師
- Python數據分析 / 數據可視化 / 大數據工程師
- Python爬蟲工程師
- Python聊天機器人開發 / 圖像識別和視覺算法 / 深度學習工程師
下圖顯示了主要城市Python招聘需求量及薪資待遇排行榜(截止到2018年5月)。
給初學者的幾個建議:
- Make English as your working language.
- Practice makes perfect.
- All experience comes from mistakes.
- Don't be one of the leeches.
- Either stand out or kicked out.
Day01~15 - Python語言基礎
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求和 / 判斷素數 / 猜數字遊戲 / 打印九九表 / 打印三角形圖案 / 猴子吃桃 / 百錢百雞
Day05 - 構造程序邏輯
- 基礎練習 - 水仙花數 / 完美數 / 五人分魚 / Fibonacci數列 / 迴文素數
- 綜合練習 - Craps賭博遊戲
Day06 - 函數和模塊的使用
- 函數的作用 - 代碼的壞味道 / 用函數封裝功能模塊
- 定義函數 - def語句 / 函數名 / 參數列表 / return語句 / 調用自定義函數
- 調用函數 - Python內置函數 / 導入模塊和函數
- 函數的參數 - 默認參數 / 可變參數 / 關鍵字參數 / 命名關鍵字參數
- 函數的返回值 - 沒有返回值 / 返回單個值 / 返回多個值
- 作用域問題 - 局部作用域 / 嵌套作用域 / 全局作用域 / 內置作用域 / 和作用域相關的關鍵字
- 用模塊管理函數 - 模塊的概念 / 用自定義模塊管理函數 / 命名衝突的時候會怎樣(同一個模塊和不同的模塊)
Day07 - 字符串和常用數據結構
- 字符串的使用 - 計算長度 / 下標運算 / 切片 / 常用方法
- 列表基本用法 - 定義列表 / 用下表訪問元素 / 下標越界 / 添加元素 / 刪除元素 / 修改元素 / 切片 / 循環遍歷
- 列表常用操作 - 連接 / 複製(複製元素和複製數組) / 長度 / 排序 / 倒轉 / 查找
- 生成列表 - 使用range創建數字列表 / 生成表達式 / 生成器
- 元組的使用 - 定義元組 / 使用元組中的值 / 修改元組變量 / 元組和列表轉換
- 集合基本用法 - 集合和列表的區別 / 創建集合 / 添加元素 / 刪除元素 / 清空
- 集合常用操作 - 交集 / 並集 / 差集 / 對稱差 / 子集 / 超集
- 字典的基本用法 - 字典的特點 / 創建字典 / 添加元素 / 刪除元素 / 取值 / 清空
- 字典常用操作 - keys()方法 / values()方法 / items()方法 / setdefault()方法
- 基礎練習 - 跑馬燈效果 / 列表找最大元素 / 統計考試成績的平均分 / Fibonacci數列 / 楊輝三角
- 綜合案例 - 雙色球選號 / 井字棋
Day08 - 面向對象編程基礎
- 類和對象 - 什麼是類 / 什麼是對象 / 面向對象其他相關概念
- 定義類 - 基本結構 / 屬性和方法 / 構造器 / 析構器 / __str__方法
- 使用對象 - 創建對象 / 給對象發消息
- 面向對象的四大支柱 - 抽象 / 封裝 / 繼承 / 多態
- 基礎練習 - 定義學生類 / 定義時鐘類 / 定義圖形類 / 定義汽車類
Day09 - 面向對象進階
- 屬性 - 類屬性 / 實例屬性 / 屬性訪問器 / 屬性修改器 / 屬性刪除器 / 使用__slots__
- 類中的方法 - 實例方法 / 類方法 / 靜態方法
- 運算符重載 - __add__ / __sub__ / __or__ /__getitem__ / __setitem__ / __len__ / __repr__ / __gt__ / __lt__ / __le__ / __ge__ / __eq__ / __ne__ / __contains__
- 類(的對象)之間的關係 - 關聯 / 繼承 / 依賴
- 繼承和多態 - 什麼是繼承 / 繼承的語法 / 調用父類方法 / 方法重寫 / 類型判定 / 多重繼承 / 菱形繼承(鑽石繼承)和C3算法
- 綜合案例 - 工資結算系統 / 圖書自動折扣系統 / 自定義分數類
Day10 - 圖形用戶界面和遊戲開發
- 使用tkinter開發GUI
- 使用pygame三方庫開發遊戲應用
- “大球吃小球”遊戲
Day11 - 文件和異常
- 讀文件 - 讀取整個文件 / 逐行讀取 / 文件路徑
- 寫文件 - 覆蓋寫入 / 追加寫入 / 文本文件 / 二進制文件
- 異常處理 - 異常機制的重要性 / try-except代碼塊 / else代碼塊 / finally代碼塊 / 內置異常類型 / 異常棧 / raise語句
- 數據持久化 - CSV文件概述 / csv模塊的應用 / JSON數據格式 / json模塊的應用
Day12 - 字符串和正則表達式
- 字符串高級操作 - 轉義字符 / 原始字符串 / 多行字符串 / in和 not in運算符 / is開頭的方法 / join和split方法 / strip相關方法 / pyperclip模塊 / 不變字符串和可變字符串 / StringIO的使用
- 正則表達式入門 - 正則表達式的作用 / 元字符 / 轉義 / 量詞 / 分組 / 零寬斷言 /貪婪匹配與惰性匹配懶惰 / 使用re模塊實現正則表達式操作(匹配、搜索、替換、捕獲)
- 使用正則表達式 - re模塊 / compile函數 / group和groups方法 / match方法 / search方法 / findall和finditer方法 / sub和subn方法 / split方法
- 應用案例 - 使用正則表達式驗證輸入的字符串
Day13 - 進程和線程
- 進程和線程的概念 - 什麼是進程 / 什麼是線程 / 多線程的應用場景
- 使用進程 - fork函數 / multiprocessing模塊 / 進程池 / 進程間通信
- 使用線程 - thread模塊 / threading模塊 / Thread類 / Lock類 / Condition類 / 線程池
Day14 - 網絡編程入門和網絡應用開發
- 計算機網絡基礎 - 計算機網絡發展史 / “TCP-IP”模型 / IP地址 / 端口 / 協議 / 其他相關概念
- 網絡應用模式 - “客戶端-服務器”模式 / “瀏覽器-服務器”模式
- 基於HTTP協議訪問網絡資源 - 網絡API概述 / 訪問URL / requests模塊 / 解析JSON格式數據
- Python網絡編程 - 套接字的概念 / socket模塊 / socket函數 / 創建TCP服務器 / 創建TCP客戶端 / 創建UDP服務器 / 創建UDP客戶端 / SocketServer模塊
- 電子郵件 - SMTP協議 / POP3協議 / IMAP協議 / smtplib模塊 / poplib模塊 / imaplib模塊
- 短信服務 - 調用短信服務網關
Day15 - 圖像和文檔處理
- 用Pillow處理圖片 - 圖片讀寫 / 圖片合成 / 幾何變換 / 色彩轉換 / 濾鏡效果
- 讀寫Word文檔 - 文本內容的處理 / 段落 / 頁眉和頁腳 / 樣式的處理
- 讀寫Excel文件 - xlrd模塊 / xlwt模塊
- 生成PDF文件 - pypdf2模塊 / reportlab模塊
Day16~Day20 - Python語言進階
- 常用數據結構
- 函數的高級用法 - “一等公民” / 高階函數 / Lambda函數 / 作用域和閉包 / 裝飾器
- 面向對象高級知識 - “三大支柱” / 類與類之間的關係 / 垃圾回收 / 魔術屬性和方法 / 混入 / 元類 / 面向對象設計原則 / GoF設計模式
- 迭代器和生成器 - 相關魔術方法 / 創建生成器的兩種方式 /
- 併發和異步編程 - 多線程 / 多進程 / 異步IO / async和await
Day21~30 - Web前端入門
- 用HTML標籤承載頁面內容
- 用CSS渲染頁面
- 用JavaScript處理交互式行為
- jQuery入門和提高
- Vue.js入門
- Element的使用
- Bootstrap的使用
Day31~35 - 玩轉Linux操作系統
- 操作系統發展史和Linux概述
- Linux基礎命令
- Linux中的實用程序
- Linux的文件系統
- Vim編輯器的應用
- 環境變量和Shell編程
- 軟件的安裝和服務的配置
- 網絡訪問和管理
- 其他相關內容
Day36~40 - 數據庫基礎和進階
- 關係型數據庫MySQL
- 關係型數據庫概述
- MySQL的安裝和使用
- SQL的使用
- DDL - 數據定義語言 - create / drop / alter
- DML - 數據操作語言 - insert / delete / update / select
- DCL - 數據控制語言 - grant / revoke
- 相關知識
- 範式理論 - 設計二維表的指導思想
- 數據完整性
- 數據一致性
- 在Python中操作MySQL
- NoSQL入門
- NoSQL概述
- Redis概述
- Mongo概述
Day41~55 - 實戰Django
Day41 - 快速上手
- Web應用工作原理和HTTP協議
- Django框架概述
- 5分鐘快速上手
- 使用視圖模板
Day42 - 深入模型
- 關係型數據庫配置
- 管理後臺的使用
- 使用ORM完成對模型的CRUD操作
- Django模型最佳實踐
- 模型定義參考
Day43 - 靜態資源和Ajax請求
- 加載靜態資源
- 用Ajax請求獲取數據
Day44 - 表單的應用
- 表單和表單控件
- 跨站請求偽造和CSRF令牌
- Form和ModelForm
- 表單驗證
Day45 - Cookie和Session
- 實現用戶跟蹤
- cookie和session的關係
- Django框架對session的支持
- 視圖函數中的cookie讀寫操作
Day46 - 報表和日誌
- 通過HttpResponse修改響應頭
- 使用StreamingHttpResponse處理大文件
- 使用xlwt生成Excel報表
- 使用reportlab生成PDF報表
- 使用ECharts生成前端圖表
- 配置日誌和Django-Debug-Toolbar
Day47 - 中間件的應用
- 什麼是中間件
- Django框架內置的中間件
- 自定義中間件及其應用場景
Day48 - 前後端分離開發入門
- 返回JSON格式的數據
- 用Vue.js渲染頁面
Day49 - RESTful架構和DRF入門
Day50 - RESTful架構和DRF進階
Day51 - 使用緩存
-
網站優化第一定律
-
在Django項目中使用Redis提供緩存服務
-
在視圖函數中讀寫緩存
-
使用裝飾器實現頁面緩存
-
為數據接口提供緩存服務
Day52 - 文件上傳和富文本編輯
- 文件上傳表單控件和圖片文件預覽
- 服務器端如何處理上傳的文件
- 富文本編輯器概述
- wangEditor的使用
Day53 - 短信和郵件
- 常用短信網關平臺介紹
- 使用螺絲帽發送短信
- Django框架對郵件服務的支持
Day54 - 異步任務和定時任務
- 網站優化第二定律
- 配置消息隊列服務
- 在項目中使用celery實現任務異步化
- 在項目中使用celery實現定時任務
Day55 - 單元測試和項目上線
- Python中的單元測試
- Django框架對單元測試的支持
- 使用版本控制系統
- 配置和使用uWSGI
- 動靜分離和Nginx配置
- 配置HTTPS
Day56~60 - 實戰Flask
Day56 - Flask入門
Day57 - 模板的使用
Day58 - 表單的處理
Day59 - 數據庫操作
Day60 - 項目實戰
Day61~65 - 實戰Tornado
Day61 - 預備知識
- 併發編程
- I/O模式和事件驅動
Day62 - Tornado入門
- Tornado概述
- 5分鐘上手Tornado
- 路由解析
- 請求處理器
Day63 - 異步化
- aiomysql和aioredis的使用
Day64 - WebSocket的應用
- WebSocket簡介
- WebSocket服務器端編程
- WebSocket客戶端編程
- 項目:Web聊天室
Day65 - 項目實戰
- 前後端分離開發和接口文檔的撰寫
- 使用Vue.js實現前端渲染
- 使用ECharts實現報表功能
- 使用WebSocket實現推送服務
Day66~75 - 爬蟲開發
Day66 - 網絡爬蟲和相關工具
- 網絡爬蟲的概念及其應用領域
- 網絡爬蟲的合法性探討
- 開發網絡爬蟲的相關工具
- 一個爬蟲程序的構成
Day67 - 數據採集和解析
- 數據採集的標準和三方庫
- 頁面解析的三種方式:正則表達式解析 / XPath解析 / CSS選擇器解析
Day68 - 存儲數據
- 如何存儲海量數據
- 實現數據的緩存
Day69 - 併發下載
- 多線程和多進程
- 異步I/O和協程
- async和await關鍵字的使用
- 三方庫aiohttp的應用
Day70 - 解析動態內容
- JavaScript逆向工程
- 使用Selenium獲取動態內容
Day71 - 表單交互和驗證碼處理
- 自動提交表單
- Cookie池的應用
- 驗證碼處理
Day72 - Scrapy入門
- Scrapy爬蟲框架概述
- 安裝和使用Scrapy
Day73 - Scrapy高級應用
- Spider的用法
- 中間件的應用:下載中間件 / 蜘蛛中間件
- Scrapy對接Selenium抓取動態內容
- Scrapy部署到Docker
Day74 - Scrapy分佈式實現
- 分佈式爬蟲的原理
- Scrapy分佈式實現
- 使用Scrapyd實現分佈式部署
Day75 - 爬蟲項目實戰
- 爬取招聘網站數據
- 爬取房地產行業數據
- 爬取二手車交易平臺數據
Day76~90 - 數據處理和機器學習
Day76 - 機器學習基礎
Day77 - Pandas的應用
Day78 - NumPy和SciPy的應用
Day79 - Matplotlib和數據可視化
Day80 - k最近鄰(KNN)分類
Day81 - 決策樹
Day82 - 貝葉斯分類
Day83 - 支持向量機(SVM)
Day84 - K-均值聚類
Day85 - 迴歸分析
Day86 - 大數據分析入門
Day87 - 大數據分析進階
Day88 - Tensorflow入門
Day89 - Tensorflow實戰
Day90 - 推薦系統
Day91~100 - 團隊項目開發
第91天:團隊項目開發準備
-
軟件過程模型
-
經典過程模型(瀑布模型)
- 可行性分析(研究做還是不做),輸出《可行性分析報告》。
- 需求分析(研究做什麼),輸出《需求規格說明書》和產品界面原型圖。
- 概要設計和詳細設計,輸出概念模型圖、物理模型圖、類圖、時序圖等。
- 編碼 / 測試。
- 上線 / 維護。
-
敏捷開發(Scrum)- 產品所有者、Scrum Master、研發人員 - Sprint
- 產品的Backlog(用戶故事、產品原型)。
- 計劃會議(評估和預算)。
- 日常開發(站立會議、番茄工作法、結對編程、測試先行、代碼重構……)。
- 修復bug(問題描述、重現步驟、測試人員、被指派人)。
- 評審會議(Showcase)。
- 回顧會議(當前週期做得好和不好的地方)。
補充:敏捷軟件開發宣言
- 個體和互動 高於 流程和工具
- 工作的軟件 高於 詳盡的文檔
- 客戶合作 高於 合同談判
- 響應變化 高於 遵循計劃
角色:產品所有者(決定做什麼,能對需求拍板的人)、團隊負責人(解決各種問題,專注如何更好的工作,屏蔽外部對開發團隊的影響)、開發團隊(項目執行人員,具體指開發人員和測試人員)。
準備工作:商業案例和資金、合同、憧憬、初始產品需求、初始發佈計劃、入股、組建團隊。
敏捷團隊通常人數為8-10人。
工作量估算:將開發任務量化,包括原型、Logo設計、UI設計、前端開發等,儘量把每個工作分解到最小任務量,最小任務量標準為工作時間不能超過兩天,然後估算總體項目時間。把每個任務都貼在白板上面,白板上分三部分:to do(待完成)、in progress(進行中)和done(已完成)。
-
-
項目團隊組建
-
團隊的構成和角色
說明:謝謝付祥英女士繪製了下面這張精美的公司組織架構圖。
-
編程規範和代碼審查(flake8、pylint)
-
Python中的一些“慣例”(請參考《Python慣例-如何編寫Pythonic的代碼》)
-
影響代碼可讀性的原因:
- 代碼註釋太少或者沒有註釋
- 代碼破壞了語言的最佳實踐
- 反模式編程(意大利麵代碼、複製-黏貼編程、自負編程、……)
-
-
團隊開發工具介紹
請參考《團隊項目開發》。
-
選題範圍設定
-
CMS(用戶端):新聞聚合網站、問答/分享社區、影評/書評網站等。
-
MIS(用戶端+管理端):KMS、KPI考核系統、HRS、CRM系統、供應鏈系統、倉儲管理系統等。
-
App後臺(管理端+數據接口):二手交易類、報刊雜誌類、小眾電商類、新聞資訊類、旅遊類、社交類、閱讀類等。
-
其他類型:自身行業背景和工作經驗、業務容易理解和把控。
-
-
需求理解、模塊劃分和任務分配
- 需求理解:頭腦風暴和競品分析。
- 模塊劃分:畫思維導圖(XMind),每個模塊是一個枝節點,每個具體的功能是一個葉節點(用動詞表述),需要確保每個葉節點無法再生出新節點,確定每個葉子節點的重要性、優先級和工作量。
- 任務分配:由項目負責人根據上面的指標為每個團隊成員分配任務。
-
制定項目進度表(每日更新)
模塊 功能 人員 狀態 完成 工時 計劃開始 實際開始 計劃結束 實際結束 備註 評論 添加評論 王大錘 正在進行 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
第92天:Docker的使用
第93天:數據庫設計和OOAD
第94天:網絡API接口設計
第95天:使用Django開發項目
- 數據庫的配置(多數據庫、主從複製、數據庫路由)
- 緩存的配置(分區緩存、鍵設置、超時設置、主從複製、故障恢復(哨兵))
- 日誌的配置
- 分析和調試(Django-Debug-ToolBar)
- 好用的Python模塊(日期計算、圖像處理、數據加密、三方API)
- RESTful架構
- API接口文檔的撰寫
- django-REST-framework的應用
- 使用緩存緩解數據庫壓力 - Redis
- 使用消息隊列做解耦合和削峰 - Celery + RabbitMQ
第96天:軟件測試和自動化測試
- 測試的種類
- 編寫單元測試(unittest、pytest、nose2、tox、ddt、……)
- 測試覆蓋率(coverage)
- 部署前的準備工作
- 關鍵設置(SECRET_KEY / DEBUG / ALLOWED_HOSTS / 緩存 / 數據庫)
- HTTPS / CSRF_COOKIE_SECUR / SESSION_COOKIE_SECURE
- 日誌相關配置
- Linux常用命令回顧
- Linux常用服務的安裝和配置
- uWSGI/Gunicorn和Nginx的使用
- Gunicorn和uWSGI的比較
- 對於不需要大量定製化的簡單應用程序,Gunicorn是一個不錯的選擇,uWSGI的學習曲線比Gunicorn要陡峭得多,Gunicorn的默認參數就已經能夠適應大多數應用程序。
- uWSGI支持異構部署。
- 由於Nginx本身支持uWSGI,在線上一般都將Nginx和uWSGI捆綁在一起部署,而且uWSGI屬於功能齊全且高度定製的WSGI中間件。
- 在性能上,Gunicorn和uWSGI其實表現相當。
- Gunicorn和uWSGI的比較
- 虛擬化技術(Docker)
- AB的使用
- SQLslap的使用
- sysbench的使用
- 使用Shell和Python進行自動化測試
- 使用Selenium實現自動化測試
- Selenium IDE
- Selenium WebDriver
- Selenium Remote Control
- 測試工具Robot Framework介紹
第97天:電商網站技術要點剖析
第98天:項目部署上線和性能調優
- MySQL數據庫調優
- Web服務器性能優化
- Nginx負載均衡配置
- Keepalived實現高可用
- 代碼性能調優
- 多線程
- 異步化
- 靜態資源訪問優化
- 雲存儲
- CDN
第99天:面試中的公共問題
第100天:英語面試
致謝:感謝的我的同事古曄、張旭、肖世榮、王海飛、榮佳偉、路豐坤等在技術上給予的指導和幫助。