Python - 100天從新手到大師
作者:駱昊
最近有很多想學習Python的小伙伴陸陸續續加入我們的交流群,目前我們的交流群人數已經超過一萬人,光靠我自己已經無法及時處理小伙伴們的入群申請,更無法及時為大家解答問題。目前我的想法是分技術方向建立討論群并安排專門的人來管理這些群,群管理者應該具備專業的知識并有相對充裕的時間,可以解答小伙伴們提出的問題。當然,我會向這些管理者支付報酬,如果有興趣成為管理者的可以跟我私聊。但愿通過這種方式,我們的群能匯聚更多優秀的Python開發者,一方面打造一個優質的溝通和交流的平臺,另一方面讓新入行的開發者獲得問道的途徑并藉此迅速成長。我會繼續努力做好線上公開課以及線下技術交流活動,也希望各位小伙伴一如既往的支持我們。創作不易,感謝大家的打賞支持,這些錢不會用于購買咖啡而是捐贈給支教組織(點擊了解捐贈情況)。感謝北京千鋒互聯科技有限公司對公開課提供的支持。
溫馨提示:中間的Python100天交流群之初入江湖為付費群,會安排專門的群管理者為大家解答問題;右側的Python后端開發討論群和Python爬蟲開發討論群為免費群,從事Web后端開發和爬蟲開發的小伙伴可以加群交流,萌新勿入。
Python應用領域和就業形勢分析
簡單的說,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語言基礎
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賭博游戲
函數的作用 - 代碼的壞味道 / 用函數封裝功能模塊
定義函數 - def語句 / 函數名 / 參數列表 / return語句 / 調用自定義函數
調用函數 - Python內置函數 / 導入模塊和函數
函數的參數 - 默認參數 / 可變參數 / 關鍵字參數 / 命名關鍵字參數
函數的返回值 - 沒有返回值 / 返回單個值 / 返回多個值
作用域問題 - 局部作用域 / 嵌套作用域 / 全局作用域 / 內置作用域 / 和作用域相關的關鍵字
用模塊管理函數 - 模塊的概念 / 用自定義模塊管理函數 / 命名沖突的時候會怎樣(同一個模塊和不同的模塊)
字符串的使用 - 計算長度 / 下標運算 / 切片 / 常用方法
列表基本用法 - 定義列表 / 用下表訪問元素 / 下標越界 / 添加元素 / 刪除元素 / 修改元素 / 切片 / 循環遍歷
列表常用操作 - 連接 / 復制(復制元素和復制數組) / 長度 / 排序 / 倒轉 / 查找
生成列表 - 使用range創建數字列表 / 生成表達式 / 生成器
元組的使用 - 定義元組 / 使用元組中的值 / 修改元組變量 / 元組和列表轉換
集合基本用法 - 集合和列表的區別 / 創建集合 / 添加元素 / 刪除元素 / 清空
集合常用操作 - 交集 / 并集 / 差集 / 對稱差 / 子集 / 超集
字典的基本用法 - 字典的特點 / 創建字典 / 添加元素 / 刪除元素 / 取值 / 清空
字典常用操作 - keys()方法 / values()方法 / items()方法 / setdefault()方法
基礎練習 - 跑馬燈效果 / 列表找最大元素 / 統計考試成績的平均分 / Fibonacci數列 / 楊輝三角
綜合案例 - 雙色球選號 / 井字棋
類和對象 - 什么是類 / 什么是對象 / 面向對象其他相關概念
定義類 - 基本結構 / 屬性和方法 / 構造器 / 析構器 / __str__方法
使用對象 - 創建對象 / 給對象發消息
面向對象的四大支柱 - 抽象 / 封裝 / 繼承 / 多態
基礎練習 - 定義學生類 / 定義時鐘類 / 定義圖形類 / 定義汽車類
Day09 - 面向對象進階
屬性 - 類屬性 / 實例屬性 / 屬性訪問器 / 屬性修改器 / 屬性刪除器 / 使用__slots__
類中的方法 - 實例方法 / 類方法 / 靜態方法
運算符重載 - __add__ / __sub__ / __or__ /__getitem__ / __setitem__ / __len__ / __repr__ / __gt__ / __lt__ / __le__ / __ge__ / __eq__ / __ne__ / __contains__
類(的對象)之間的關系 - 關聯 / 繼承 / 依賴
繼承和多態 - 什么是繼承 / 繼承的語法 / 調用父類方法 / 方法重寫 / 類型判定 / 多重繼承 / 菱形繼承(鉆石繼承)和C3算法
綜合案例 - 工資結算系統 / 圖書自動折扣系統 / 自定義分數類
使用tkinter開發GUI
使用pygame三方庫開發游戲應用
“大球吃小球”游戲
Day11 - 文件和異常
讀文件 - 讀取整個文件 / 逐行讀取 / 文件路徑
寫文件 - 覆蓋寫入 / 追加寫入 / 文本文件 / 二進制文件
異常處理 - 異常機制的重要性 / try-except代碼塊 / else代碼塊 / finally代碼塊 / 內置異常類型 / 異常棧 / raise語句
數據持久化 - CSV文件概述 / csv模塊的應用 / JSON數據格式 / json模塊的應用
字符串高級操作 - 轉義字符 / 原始字符串 / 多行字符串 / 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類 / 線程池
計算機網絡基礎 - 計算機網絡發展史 / “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的使用
操作系統發展史和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模型最佳實踐
模型定義參考
加載靜態資源
用Ajax請求獲取數據
Day44 - 表單的應用
表單和表單控件
跨站請求偽造和CSRF令牌
Form和ModelForm
表單驗證
實現用戶跟蹤
cookie和session的關系
Django框架對session的支持
視圖函數中的cookie讀寫操作
Day46 - 報表和日志
通過HttpResponse修改響應頭
使用StreamingHttpResponse處理大文件
使用xlwt生成Excel報表
使用reportlab生成PDF報表
使用ECharts生成前端圖表
配置日志和Django-Debug-Toolbar
Day47 - 中間件的應用
什么是中間件
Django框架內置的中間件
自定義中間件及其應用場景
返回JSON格式的數據
用Vue.js渲染頁面
Day51 - 使用緩存
網站優化第一定律
在Django項目中使用Redis提供緩存服務
在視圖函數中讀寫緩存
使用裝飾器實現頁面緩存
為數據接口提供緩存服務
文件上傳表單控件和圖片文件預覽
服務器端如何處理上傳的文件
富文本編輯器概述
wangEditor的使用
Day53 - 短信和郵件
常用短信網關平臺介紹
使用螺絲帽發送短信
Django框架對郵件服務的支持
網站優化第二定律
配置消息隊列服務
在項目中使用celery實現任務異步化
在項目中使用celery實現定時任務
Python中的單元測試
Django框架對單元測試的支持
使用版本控制系統
配置和使用uWSGI
動靜分離和Nginx配置
配置HTTPS
Day56~60 - 實戰Flask
Day56 - Flask入門
Day57 - 模板的使用
Day58 - 表單的處理
Day59 - 數據庫操作
Day60 - 項目實戰
Day61~65 - 實戰Tornado
Day61 - 預備知識
并發編程
I/O模式和事件驅動
Tornado概述
5分鐘上手Tornado
路由解析
請求處理器
Day63 - 異步化
aiomysql和aioredis的使用
WebSocket簡介
WebSocket服務器端編程
WebSocket客戶端編程
項目:Web聊天室
Day65 - 項目實戰
前后端分離開發和接口文檔的撰寫
使用Vue.js實現前端渲染
使用ECharts實現報表功能
使用WebSocket實現推送服務
Day66~75 - 爬蟲開發
網絡爬蟲的概念及其應用領域
網絡爬蟲的合法性探討
開發網絡爬蟲的相關工具
一個爬蟲程序的構成
Day67 - 數據采集和解析
數據采集的標準和三方庫
頁面解析的三種方式:正則表達式解析 / XPath解析 / CSS選擇器解析
Day68 - 存儲數據
如何存儲海量數據
實現數據的緩存
Day69 - 并發下載
多線程和多進程
異步I/O和協程
async和await關鍵字的使用
三方庫aiohttp的應用
Day70 - 解析動態內容
JavaScript逆向工程
使用Selenium獲取動態內容
自動提交表單
Cookie池的應用
驗證碼處理
Scrapy爬蟲框架概述
安裝和使用Scrapy
Spider的用法
中間件的應用:下載中間件 / 蜘蛛中間件
Scrapy對接Selenium抓取動態內容
Scrapy部署到Docker
分布式爬蟲的原理
Scrapy分布式實現
使用Scrapyd實現分布式部署
Day75 - 爬蟲項目實戰
爬取招聘網站數據
爬取房地產行業數據
爬取二手車交易平臺數據
Day76~90 - 數據處理和機器學習
Day76 - 機器學習基礎
Day81 - 決策樹
Day82 - 貝葉斯分類
Day84 - K-均值聚類
Day85 - 回歸分析
Day86 - 大數據分析入門
Day87 - 大數據分析進階
Day90 - 推薦系統
Day91~100 - 團隊項目開發
軟件過程模型
經典過程模型(瀑布模型)
可行性分析(研究做還是不做),輸出《可行性分析報告》。
需求分析(研究做什么),輸出《需求規格說明書》和產品界面原型圖。
概要設計和詳細設計,輸出概念模型圖、物理模型圖、類圖、時序圖等。
編碼 / 測試。
上線 / 維護。
敏捷開發(Scrum)- 產品所有者、Scrum Master、研發人員 - Sprint
產品的Backlog(用戶故事、產品原型)。
計劃會議(評估和預算)。
日常開發(站立會議、番茄工作法、結對編程、測試先行、代碼重構……)。
修復bug(問題描述、重現步驟、測試人員、被指派人)。
評審會議(Showcase)。
回顧會議(當前周期做得好和不好的地方)。
補充:敏捷軟件開發宣言
個體和互動 高于 流程和工具
工作的軟件 高于 詳盡的文檔
客戶合作 高于 合同談判
響應變化 高于 遵循計劃
角色:產品所有者(決定做什么,能對需求拍板的人)、團隊負責人(解決各種問題,專注如何更好的工作,屏蔽外部對開發團隊的影響)、開發團隊(項目執行人員,具體指開發人員和測試人員)。
準備工作:商業案例和資金、合同、憧憬、初始產品需求、初始發布計劃、入股、組建團隊。
敏捷團隊通常人數為8-10人。
工作量估算:將開發任務量化,包括原型、Logo設計、UI設計、前端開發等,盡量把每個工作分解到最小任務量,最小任務量標準為工作時間不能超過兩天,然后估算總體項目時間。把每個任務都貼在白板上面,白板上分三部分:to do(待完成)、in progress(進行中)和done(已完成)。
項目團隊組建
團隊的構成和角色
說明:謝謝付祥英女士繪制了下面這張精美的公司組織架構圖。
編程規范和代碼審查(flake8、pylint)
影響代碼可讀性的原因:
代碼注釋太少或者沒有注釋
代碼破壞了語言的最佳實踐
反模式編程(意大利面代碼、復制-黏貼編程、自負編程、……)
團隊開發工具介紹
版本控制:Git、Mercury
敏捷閉環工具:禪道、JIRA
項目選題和理解業務
選題范圍設定
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
OOAD和數據庫設計
UML(統一建模語言)的類圖
通過模型創建表(正向工程)
python manage.py makemigrations app
python manage.py migrate
使用PowerDesigner繪制物理模型圖。
通過數據表創建模型(反向工程)
python manage.py inspectdb > app/models.py
第95天:[使用Django開發商業項目](./Day91-100/95.使用Django開發商業項目.md)
項目開發中的公共問題
數據庫的配置(多數據庫、主從復制、數據庫路由)
緩存的配置(分區緩存、鍵設置、超時設置、主從復制、故障恢復(哨兵))
日志的配置
分析和調試(Django-Debug-ToolBar)
好用的Python模塊(日期計算、圖像處理、數據加密、三方API)
REST API設計
項目中的重點難點剖析
使用緩存緩解數據庫壓力 - Redis
使用消息隊列做解耦合和削峰 - Celery + RabbitMQ
單元測試
測試的種類
編寫單元測試(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其實表現相當。
使用虛擬化技術(Docker)部署測試環境和生產環境
性能測試
AB的使用
SQLslap的使用
sysbench的使用
自動化測試
使用Shell和Python進行自動化測試
使用Selenium實現自動化測試
Selenium IDE
Selenium WebDriver
Selenium Remote Control
測試工具Robot Framework介紹
MySQL數據庫調優
Web服務器性能優化
Nginx負載均衡配置
Keepalived實現高可用
代碼性能調優
多線程
異步化
靜態資源訪問優化
云存儲
CDN
第100天:英語面試
致謝:感謝的我的同事古曄、張旭、肖世榮、王海飛、榮佳偉、路豐坤等在技術上給予的指導和幫助。