├── Day81-90 ├── 84.贝叶斯分类.md ├── 85.支持向量机.md ├── 87.回归分析.md ├── 86.K-均值聚类.md ├── 83.推荐系统实战-1.md ├── 82.k最近邻分类.md └── 81.人工智能和机器学习概述.md ├── 公开课 ├── 文档 │ ├── 第06次公开课-算法入门系列2-在水一方 │ │ └── 算法入门系列2 │ ├── 年薪50W+的Python程序员如何写代码 │ │ └── code │ │ │ └── Python │ │ │ ├── USvideos.csv │ │ │ └── opencourse │ │ │ └── requirements.txt │ └── 第05次公开课-算法入门系列1-周而复始 │ │ └── 算法入门系列1-周而复始.md └── 视频 │ └── 视频链接.txt ├── Day66-80 ├── 80.数据分析方法论.md ├── 66.数据分析概述.md ├── 78.方差分析和参数估计.md └── 79.相关和回归.md ├── Day01-15 ├── code │ └── Day11 │ │ ├── teacher.csv │ │ ├── example.csv │ │ └── 致橡树.txt ├── 03.分支结构.md └── 05.构造程序逻辑.md ├── Day41-55 ├── 55.项目上线.md ├── 54.单元测试.md ├── 53.异步任务和定时任务.md └── code │ └── hellodjango │ └── templates │ └── index.html ├── Day91-100 ├── 100.Python面试题实录.md ├── 99.面试中的公共问题.md └── 96.软件测试和自动化测试.md ├── 番外篇 ├── Python数据分析师面试题.md ├── Python之禅的最佳翻译.md ├── 一个小例子助你彻底理解协程.md ├── PEP8风格指南.md ├── Python参考书籍.md ├── 常见反爬策略及应对方案.md ├── 用函数还是用复杂的表达式.md ├── 我为什么选择了Python.md ├── Python编程惯例.md ├── 英语面试.md ├── 玩转PyCharm.md └── 知乎问题回答.md ├── .gitignore ├── Day36-40 └── code │ └── message │ └── 内部短消息系统.txt ├── Day21-30 └── code │ ├── new │ ├── web1901 │ │ ├── example_of_js_7.html │ │ ├── example_of_js_1.html │ │ ├── example_of_css_1.html │ │ ├── js_practice_1.html │ │ ├── example_of_css_5.html │ │ ├── js_practice_2.html │ │ ├── example_of_iframe.html │ │ ├── example_of_css_2.html │ │ ├── example_of_js_2.html │ │ ├── example_of_bom_1.html │ │ ├── example_of_jquery_3.html │ │ ├── js_practice_4.html │ │ ├── js_practice_7.html │ │ ├── example_of_jquery_4.html │ │ ├── example_of_js_3.html │ │ ├── example_of_js_4.html │ │ ├── example_of_layout.html │ │ ├── example_of_js_5.html │ │ ├── problem_of_float.html │ │ ├── css_practice_1.result.html │ │ ├── css_practice_3.html │ │ ├── css_practice_1.html │ │ ├── example_of_jquery_5.html │ │ ├── example_of_jquery_2.html │ │ ├── js_practice_3.html │ │ ├── js_practice_5.html │ │ ├── example_of_table.html │ │ ├── index.html │ │ ├── example_of_jquery_1.html │ │ ├── example_of_form.html │ │ ├── example_of_css_3.html │ │ ├── css_practice_2.html │ │ ├── example_of_js_6.html │ │ ├── example_of_vue_element.html │ │ ├── js_practice_6.html │ │ └── example_of_bootstrap.html │ └── vue │ │ └── vue.demo.html │ ├── old │ ├── html+css │ │ ├── qq_link.html │ │ ├── example.html │ │ ├── classical_layout.html │ │ └── form_and_table.html │ └── javascript │ │ ├── example03.html │ │ ├── homework02.html │ │ ├── example08.html │ │ ├── example04.html │ │ ├── example05.html │ │ ├── homework07.html │ │ ├── example11.html │ │ ├── homework06.html │ │ ├── example06.html │ │ ├── index.html │ │ ├── homework03.html │ │ ├── homework01.html │ │ ├── homework08.html │ │ ├── example02.html │ │ ├── example10.html │ │ ├── example01.html │ │ ├── example09.html │ │ ├── example07.html │ │ └── homework04.html │ ├── list_by_vue.html │ ├── list_by_javascript.html │ ├── list_by_jquery.html │ └── 垃圾分类查询 │ ├── index-2.html │ └── index.html ├── Day56-60 └── 56-60.用FastAPI开发数据接口.md └── 更新日志.md /Day81-90/84.贝叶斯分类.md: -------------------------------------------------------------------------------- 1 | ## 貝葉斯分類 2 | 3 | -------------------------------------------------------------------------------- /Day81-90/85.支持向量机.md: -------------------------------------------------------------------------------- 1 | ## 支援向量機 2 | 3 | -------------------------------------------------------------------------------- /Day81-90/87.回归分析.md: -------------------------------------------------------------------------------- 1 | ## 迴歸分析 2 | 3 | -------------------------------------------------------------------------------- /公开课/文档/第06次公开课-算法入门系列2-在水一方/算法入门系列2: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Day66-80/80.数据分析方法论.md: -------------------------------------------------------------------------------- 1 | ## 資料分析方法論 2 | 3 | -------------------------------------------------------------------------------- /Day81-90/86.K-均值聚类.md: -------------------------------------------------------------------------------- 1 | ## K-均值聚類 2 | 3 | -------------------------------------------------------------------------------- /Day81-90/83.推荐系统实战-1.md: -------------------------------------------------------------------------------- 1 | ## 推薦系統實戰(1) 2 | 3 | -------------------------------------------------------------------------------- /Day01-15/code/Day11/teacher.csv: -------------------------------------------------------------------------------- 1 | 骆昊,38,叫兽 2 | 狄仁杰,25,砖家 3 | -------------------------------------------------------------------------------- /公开课/视频/视频链接.txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/1W53OztYWPyQ8BwPV3nbY_Q 密码:67ws -------------------------------------------------------------------------------- /Day41-55/55.项目上线.md: -------------------------------------------------------------------------------- 1 | ## 專案上線 2 | 3 | 請各位讀者移步到[《專案部署上線和效能調優》](../Day91-100/98.專案部署上線和效能調優.md)一文。 4 | 5 | -------------------------------------------------------------------------------- /Day41-55/54.单元测试.md: -------------------------------------------------------------------------------- 1 | ## 單元測試 2 | 3 | 請各位讀者移步到[《使用Django開發商業專案》](../Day91-100/95.使用Django開發商業專案.md)一文。 4 | 5 | -------------------------------------------------------------------------------- /Day91-100/100.Python面试题实录.md: -------------------------------------------------------------------------------- 1 | ## Python面試題實錄 2 | 3 | > **溫馨提示**:請訪問我的另一個專案[“Python面試寶典”](https://github.com/jackfrued/Python-Interview-Bible)。 4 | 5 | -------------------------------------------------------------------------------- /公开课/文档/年薪50W+的Python程序员如何写代码/code/Python/USvideos.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ateliershen/Python-100-Days-zh_TW/HEAD/公开课/文档/年薪50W+的Python程序员如何写代码/code/Python/USvideos.csv -------------------------------------------------------------------------------- /Day01-15/code/Day11/example.csv: -------------------------------------------------------------------------------- 1 | 4/5/2014 13:34,Apples,73 2 | 4/5/2014 3:41,Cherries,85 3 | 4/6/2014 12:46,Pears,14 4 | 4/8/2014 8:59,Oranges,52 5 | 4/10/2014 2:07,Apples,152 6 | 4/10/2014 18:10,Bananas,23 7 | 4/10/2014 2:40,Strawberries,98 8 | -------------------------------------------------------------------------------- /番外篇/Python数据分析师面试题.md: -------------------------------------------------------------------------------- 1 | ## Python資料分析師面試題 2 | 3 | ### 基礎知識部分 4 | 5 | 6 | 7 | ### 程式設計能力部分 8 | 9 | 10 | 11 | ### 商業專案部分 12 | 13 | 1. 近期公司的X指標出現了明顯的下滑,說說你會如果系統化的分析指標下滑的原因。 14 | 2. 公司對App進行了版本迭代,對X功能做出了調整,請說明你會如何評估改版的效果。 15 | 3. 公司對App做了一次營銷拉新活動,請說明你會如何評估本次拉新活動的效果。 16 | 4. 請說說你在設計資料報表時一般會考慮哪些問題。 17 | 5. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | venv 2 | .idea 3 | *.pyc 4 | __pycache__ 5 | 6 | ### VisualStudioCode ### 7 | .vscode/* 8 | .vscode/** 9 | !.vscode/settings.json 10 | !.vscode/tasks.json 11 | !.vscode/launch.json 12 | !.vscode/extensions.json 13 | 14 | ### VisualStudioCode Patch ### 15 | # Ignore all local history of files 16 | .history 17 | -------------------------------------------------------------------------------- /Day36-40/code/message/内部短消息系统.txt: -------------------------------------------------------------------------------- 1 | 内部短消息系统(私信系统) 2 | 3 | 1 登录 4 | 1.1 发送短消息 5 | 1.2 查看未读消息 6 | 1.2.1 读取消息 7 | 1.2.2 标记已读 8 | 1.2.3 返回上级 9 | 1.3 查看所有消息 10 | 1.3.1 读取消息 11 | 1.3.2 删除消息 12 | 1.3.3 返回上级 13 | 1.4 清除所有消息 14 | 1.5 注销 15 | 2 注册 16 | 2.1 填写信息注册 17 | 2.2 返回上级 18 | 3 退出 19 | 20 | 用户 (用户名, 口令, 最后登录时间) 21 | 短消息 (编号, 发送者, 接收者, 标题, 内容, 发送时间, 是否读取, 已删除) 22 | 23 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_7.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Day01-15/code/Day11/致橡树.txt: -------------------------------------------------------------------------------- 1 | 我如果爱你 2 | 绝不学攀援的凌霄花 3 | 借你的高枝炫耀自己 4 | 5 | 我如果爱你 6 | 绝不学痴情的鸟儿 7 | 为绿荫重复单调的歌曲 8 | 9 | 也不止像泉源 10 | 常年送来清凉的慰藉 11 | 也不止像险峰 12 | 增加你的高度 衬托你的威仪 13 | 甚至日光 甚至春雨 14 | 不 这些都还不够 15 | 我必须是你近旁的一株木棉 16 | 作为树的形象和你站在一起 17 | 根 紧握在地下 18 | 叶 相触在云里 19 | 每一阵风过 20 | 我们都互相致意 21 | 但没有人 听懂我们的言语 22 | 你有你的铜枝铁干 23 | 像刀 像剑 也像戟; 24 | 我有我红硕的花朵 25 | 像沉重的叹息 又像英勇的火炬 26 | 我们分担寒潮、风雷、霹雳 27 | 我们共享雾霭、流岚、虹霓 28 | 仿佛永远分离 却又终身相依 29 | 这才是伟大的爱情 30 | 坚贞就在这里 31 | 爱 不仅爱你伟岸的身躯 32 | 也爱你坚持的位置 足下的土地 -------------------------------------------------------------------------------- /Day41-55/53.异步任务和定时任务.md: -------------------------------------------------------------------------------- 1 | ## 非同步任務和定時任務 2 | 3 | 在Web應用中,如果一個請求執行了耗時間的操作或者該請求的執行時間無法確定,而且對於使用者來說只需要知道伺服器接收了他的請求,並不需要馬上得到請求的執行結果,這樣的操作我們就應該對其進行非同步化處理。如果說**使用快取是最佳化網站效能的第一要義**,那麼將耗時間或執行時間不確定的任務**非同步化則是網站效能最佳化的第二要義**,簡單的說就是**能推遲做的事情都不要馬上做**。 4 | 5 | 上一章節中講到的發簡訊和上傳檔案到雲端儲存為例,這兩個操作前者屬於時間不確定的操作(因為作為呼叫者,我們不能確定三方平臺響應的時間),後者屬於耗時間的操作(如果檔案較大或者三方平臺不穩定,都可能導致上傳的時間較長),很顯然,這兩個操作都可以做非同步化處理。 6 | 7 | 在Python專案中實現非同步化處理可以使用多執行緒或藉助三方庫Celery來完成。 8 | 9 | ### 使用Celery實現非同步化 10 | 11 | 12 | 13 | ### 使用多執行緒實現非同步化 14 | 15 | -------------------------------------------------------------------------------- /Day41-55/code/hellodjango/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 首页 6 | 11 | 12 | 13 |

今天推荐的水果是:

14 |
15 | 20 | 21 | -------------------------------------------------------------------------------- /Day21-30/code/old/html+css/qq_link.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 聊我吧 10 | 14 | 19 | 20 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 猜数字 6 | 7 | 8 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_css_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CSS - 内部和外部样式表 6 | 7 | 8 | 9 | 14 | 15 | 16 | 17 | 18 |

19 |

20 |

21 |

22 |

23 |

24 |

25 |

静夜思 - 李白

26 | 床前明月光 27 | 28 | 29 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example03.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 延迟跳转 6 | 7 | 8 |

5秒钟以后自动跳转到百度

9 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 乘法口诀表 6 | 18 | 19 | 20 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Day21-30/code/new/vue/vue.demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |

库存信息

5 |
6 | 18 |

库存总量:{{ totalQuantity }}台

19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_iframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 内部窗口 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |

1

19 |

2

20 |

3

21 |
1
22 |
2
23 |
3
24 | 1 25 | 2 26 | 3 27 | 28 | 29 | 百度  京东 30 | 31 | 32 | -------------------------------------------------------------------------------- /Day81-90/82.k最近邻分类.md: -------------------------------------------------------------------------------- 1 | ## k最近鄰分類 2 | 3 | $k$最近鄰(簡稱kNN,k-Nearest Neighbor)是Cover和Hart在1968年提出的一種簡單的監督學習演算法,可用於字元識別、文字分類、影象識別等領域。kNN的工作機制非常簡單:給定測試樣本,基於某種距離度量(如:歐式距離、曼哈頓距離等)找出訓練集中與其最接近的$k$個訓練樣本,然後基於這$k$個“最近鄰居”的資訊來進行預測。對於分類任務,可以在$k$個最近鄰居中選擇出現次數最多的類別標籤作為預測的結果;對於迴歸任務,可以使用$k$個最近鄰居實際輸出(目標值)的平均值作為預測的結果,當然也可以根據距離的遠近進行加權平均,距離越近的樣本權重值就越大。 4 | 5 | ### 案例:電影分類預測 6 | 7 | 8 | 9 | ### k值的選擇和交叉檢驗 10 | 11 | k值的選擇對於kNN演算法的結果有非常顯著的影響。下面用李航博士的《統計學習方法》一書中的敘述,來對k值的選擇加以說明。 12 | 13 | 如果選擇較小的$k$值,就相當於用較小的鄰域中的訓練例項進行預測,“學習”的近似誤差會減小,只有與輸入例項較近(相似的)訓練例項才會對預測結果起作用;但缺點是“學習”的估計誤差會增大,預測結果會對近鄰的例項點非常敏感,如果近鄰的例項點剛好是噪聲,預測就會出錯。換句話說,$k$值的減小就意味著整體模型變得複雜,容易發生**過擬合**。 14 | 15 | 如果選擇較大的$k$值,就相當於用較大的鄰域中的訓練例項進行預測,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。這時候,與輸入例項較遠(不相似的)訓練例項也會對預測起作用,使預測發生錯誤。對於$k=N$的極端情況(其中$N$代表所有的訓練例項的數量),那麼無論輸入例項是什麼,都會預測它屬於訓練例項中最多的類,很顯然,這樣的模型完全忽略了訓練例項中大量的有用資訊,是不可取的。 16 | 17 | 實際應用中,$k$的取值通常都比較小,可以透過交叉檢驗的方式來選擇較好的$k$值。 18 | 19 | 20 | 21 | ### 演算法優缺點 22 | 23 | 優點: 24 | 25 | 1. 簡單有效 26 | 2. 重新訓練代價低 27 | 3. 適合類域交叉樣本 28 | 4. 適合大樣本分類 29 | 30 | 缺點: 31 | 32 | 1. 惰性學習 33 | 2. 輸出的可解釋性不強 34 | 3. 不擅長處理不均衡樣本 35 | 4. 計算量比較大 -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_css_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CSS - 优先级 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 28 | 29 | 30 | 31 |

Hello, world!

32 | 33 |

Goodbye world!

34 | 35 | 36 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 判断闰年 6 | 7 | 8 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_bom_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BOM - 延迟跳转 6 | 7 | 8 |

5秒钟以后自动跳转到百度

9 | 10 | 11 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework02.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 21 | 22 | 23 |
24 | 狗屎 25 | 30 |
31 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_jquery_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ajax请求 6 | 7 | 8 | 9 |
10 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Day56-60/56-60.用FastAPI开发数据接口.md: -------------------------------------------------------------------------------- 1 | ## 用FastAPI開發網路資料介面 2 | 3 | FastAPI 是一個用於構建API(網路資料介面)的現代、高效能的Web框架,基於Python 3.6+,使用了Python中的型別提示進行型別檢查,非常符合工程化開發的需求,在業界有非常好的口碑。下面,我們先用程式碼告訴大家FastAPI到底能做什麼,然後再來講解它的方方面面。 4 | 5 | ### FastAPI五分鐘上手 6 | 7 | 1. 安裝依賴庫和ASGI伺服器(支援非同步I/O的Python伺服器)。 8 | 9 | ```Bash 10 | pip install fastapi 11 | pip install uvicorn 12 | ``` 13 | 14 | 2. 編寫程式碼`main.py`。 15 | 16 | ```Python 17 | from fastapi import FastAPI 18 | 19 | app = FastAPI() 20 | 21 | 22 | @app.get('/') 23 | def say_hello(): 24 | return {'code': 200, 'message': 'hello, world!'} 25 | ``` 26 | 27 | 3. 執行服務。 28 | 29 | ```Bash 30 | uvicorn main:app --reload 31 | ``` 32 | 33 | > **說明**:上面執行uvicorn時使用的`--reload`引數會在程式碼發生變更時自動重新載入新的內容,這個引數在開發階段非常的有用。 34 | 35 | 4. 訪問服務。 36 | 37 | ![](res/run-first-demo.png) 38 | 39 | 5. 檢視文件。 40 | 41 | ![](res/first-demo-docs.png) 42 | 43 | > **注意**:FastAPI會基於[Swagger UI](https://swagger.io/tools/swagger-ui/)自動為資料介面生成對應的文件。 44 | 45 | ### 請求和響應 46 | 47 | 48 | 49 | ### 接入關係型資料庫 50 | 51 | 我們可以使用SQLAlchemy三方庫來實現對關係型資料庫的接入。SQLAlchemy是一個ORM(物件關係對映)框架,ORM框架可以解決Python程式的面向物件模型和關係型資料庫的關係模型並不匹配的問題,使得我們可以用面向物件的方式實現資料的CRUD操作。 52 | 53 | ### 依賴注入 54 | 55 | 56 | 57 | ### 中介軟體 58 | 59 | 60 | 61 | ### 非同步化 62 | 63 | 64 | 65 | ### 虛擬化部署(Docker) 66 | 67 | 68 | 69 | ### 專案實戰:車輛違章查詢 70 | 71 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 轮播广告 6 | 12 | 13 | 14 |
15 | 16 |
17 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /番外篇/Python之禅的最佳翻译.md: -------------------------------------------------------------------------------- 1 | ## Zen of Python(Python之禪) 2 | 3 | 1. Beautiful is better than ugly. (優美比醜陋好)
4 | 2. Explicit is better than implicit.(清晰比晦澀好)
5 | 3. Simple is better than complex.(簡單比複雜好)
6 | 4. Complex is better than complicated.(複雜比錯綜複雜好)
7 | 5. Flat is better than nested.(扁平比巢狀好)
8 | 6. Sparse is better than dense.(稀疏比密集好)
9 | 7. Readability counts.(可讀性很重要)
10 | 8. Special cases aren't special enough to break the rules.(特殊情況也不應該違反這些規則)
11 | 9. Although practicality beats purity.(但現實往往並不那麼完美)
12 | 10. Errors should never pass silently.(異常不應該被靜默處理)
13 | 11. Unless explicitly silenced.(除非你希望如此)
14 | 12. In the face of ambiguity, refuse the temptation to guess.(遇到模稜兩可的地方,不要胡亂猜測)
15 | 13. There should be one-- and preferably only one --obvious way to do it.(肯定有一種通常也是唯一一種最佳的解決方案)
16 | 14. Although that way may not be obvious at first unless you're Dutch.(雖然這種方案並不是顯而易見的,因為你不是那個荷蘭人[^1])
17 | 15. Now is better than never.(現在開始做比不做好)
18 | 16. Although never is often better than \*right\* now.(不做比盲目去做好[^2])
19 | 17. If the implementation is hard to explain, it's a bad idea.(如果一個實現方案難於理解,它通常不是一個好的方案)
20 | 18. If the implementation is easy to explain, it may be a good idea.(如果一個實現方案易於理解,它很有可能是一個好的方案)
21 | 19. Namespaces are one honking great idea -- let's do more of those!(名稱空間非常有用,我們應當多加利用)
22 | 23 | [^1]:這裡指的是 Python 之父 Guido van Rossumm。 24 | [^2]:極限程式設計中的YAGNI原則 25 | 26 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example08.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 24 | 25 | 26 |
27 | 此广告位招租 28 | 29 |
30 | 54 | 55 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example04.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 |
15 | 16 |
17 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_7.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 35 | 36 | 37 |
38 |
39 | 40 | 41 |
42 | 43 | 44 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_jquery_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ajax请求 6 | 7 | 8 | 9 |
10 | 11 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 双色球随机选号 6 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 显示时间日期 6 | 19 | 20 | 21 |
22 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 经典布局 6 | 51 | 52 | 53 |
54 | 55 |
56 | 57 | 58 |
59 | 60 |
61 |
62 |
文章1
63 |
文章2
64 |
文章3
65 |
66 | 67 |
68 | 69 | 70 |
71 | 72 | 73 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example05.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 29 | 30 | 31 |
32 |
33 |
34 |
35 |
36 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Day21-30/code/old/html+css/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 34 | 35 | 36 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 类和对象 6 | 7 | 8 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework07.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 37 | 38 | 39 |
40 | 41 | 42 |
43 |
44 |

45 | 46 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example11.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/problem_of_float.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Parent Float - Problem 5 | 23 | 24 | 25 |

The Evolution of the Bicycle

26 |
27 |

28 | In 1817 Baron von Drais invented a walking machine that would help him get around the royal gardens faster. 29 |

30 |

31 | The device know as the Draisienne (or "hobby horse") was made of wood, and propelled by pushing your feed on the 32 | ground in a gliding movement. 33 |

34 |

35 | It was not seen a suitable for any place other than a well maintained pathway. 36 |

37 |

38 | In 1865, the velocipede (meaning "fast foot") attached pedals to the front wheel, but its wooden 39 | structure made it extremely uncomfortable. 40 |

41 |

42 | In 1870 the first all-metal machine appeared. The pedals were attached directly to the front wheel. 43 |

44 |

45 | Solid rubber tires and the long spokes of the large front wheel provided a much smoother ride than its 46 | predecessor. 47 |

48 |

49 | In 1817 Baron von Drais invented a walking machine that would help him get around the royal gardens faster. 50 |

51 |

52 | The device know as the Draisienne (or "hobby horse") was made of wood, and propelled by pushing your feed on the 53 | ground in a gliding movement. 54 |

55 | 56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework06.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 28 | 29 | 30 |
31 |
32 |
33 | 34 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /番外篇/一个小例子助你彻底理解协程.md: -------------------------------------------------------------------------------- 1 | ## 一個小例子助你徹底理解協程 2 | 3 | 協程,可能是Python中最讓初學者困惑的知識點之一,它也是Python中實現併發程式設計的一種重要方式。Python中可以使用多執行緒和多程序來實現併發,這兩種方式相對來說是大家比較熟悉的。事實上,還有一種實現併發的方式叫做非同步程式設計,而協程就是實現非同步程式設計的必要方式。 4 | 5 | 所謂協程,可以簡單的理解為多個相互協作的子程式。在同一個執行緒中,當一個子程式阻塞時,我們可以讓程式馬上從一個子程式切換到另一個子程式,從而避免CPU因程式阻塞而閒置,這樣就可以提升CPU的利用率,相當於用一種協作的方式加速了程式的執行。所以,我們可以言簡意賅的說:**協程實現了協作式併發**。 6 | 7 | 接下來用一個小例子幫助大家理解什麼是協作式併發,先看看下面的程式碼。 8 | 9 | ```Python 10 | import time 11 | 12 | 13 | def display(num): 14 | time.sleep(1) 15 | print(num) 16 | 17 | 18 | for num in range(10): 19 | display(num) 20 | ``` 21 | 22 | 上面這段程式碼相信大家很容看懂,程式會輸出0到9的數字,每隔1秒中輸出一個數字,因此整個程式的執行需要大約10秒時間。值得注意的是,因為沒有使用多執行緒或多程序,程式中只有一個執行單元,而`time.sleep(1)`的休眠操作會讓整個執行緒停滯1秒鐘,對於上面的程式碼來說,在這段時間裡面CPU是完全閒置的沒有做什麼事情。 23 | 24 | 我們再來看看使用協程會發生什麼事情。從Python 3.5開始,使用協程實現協作式編髮有了更為便捷的語法,我們可以使用`async`來定義非同步函式,可以使用`await`讓一個阻塞的子程式將CPU讓給與它協作的子程式。在Python 3.7中,`asyanc`和`await`成為了正式的關鍵字,讓開發者有一種喜大普奔的感覺。我們先看看如何定義一個非同步函式。 25 | 26 | ```Python 27 | import asyncio 28 | 29 | 30 | async def display(num): 31 | await asyncio.sleep(1) 32 | print(num) 33 | ``` 34 | 35 | 接下來敲黑板說重點。非同步函式不同於普通函式,呼叫普通函式會得到返回值,而呼叫非同步函式會得到一個協程物件。我們需要將協程物件放到一個事件迴圈中才能達到與其他協程物件協作的效果,因為事件迴圈會負責處理子程式切換的操作,簡單的說就是讓阻塞的子程式讓出CPU給可以執行的子程式。 36 | 37 | 我們先透過下面的列表生成式來程式碼10個協程物件,跟剛才在迴圈中呼叫display函式的道理一致。 38 | 39 | ```Python 40 | coroutines = [display(num) for num in range(10)] 41 | ``` 42 | 43 | 透過下面的程式碼可以獲取事件迴圈並將協程物件放入事件迴圈中。 44 | 45 | ```Python 46 | loop = asyncio.get_event_loop() 47 | loop.run_until_complete(asyncio.wait(coroutines)) 48 | loop.close() 49 | ``` 50 | 51 | 執行上面的程式碼會發現,10個分別會阻塞1秒鐘的協程總共只阻塞了約1秒種的時間,這就說明**協程物件一旦阻塞會將CPU讓出而不是讓CPU處於閒置狀態**,這樣就大大的**提升了CPU的利用率**。而且我們還會注意到,0到9的數字並不是按照我們建立協程物件的順序打印出來的,這正是我們想要的結果啊;另外,多次執行該程式會發現每次輸出的結果都不太一樣,這正是併發程式本身執行順序不確定性造成的結果。 52 | 53 | 上面的例子來自於著名的“花書”(《Python高階併發程式設計》),為了讓大家對協程的體會更加深刻,對原書的程式碼做了小的改動,這個例子雖然簡單,但是它已經讓你體會到了協作式併發的魅力。在商業專案中,如果需要使用協作式併發,還可以將系統預設的事件迴圈替換為`uvloop`提供的事件迴圈,這樣會獲得更好的效能,因為`uvloop`是基於著名的跨平臺非同步I/O庫libuv實現的。另外,如果要做基於HTTP的網路程式設計,三方庫**aiohttp**是不錯的選擇,它基於asyncio實現了非同步的HTTP伺服器和客戶端。 -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/css_practice_1.result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Boxes 5 | 53 | 54 | 55 |
56 | 59 | 66 |

67 | Fender Rhodes, Hohner Clavinet, and Wurlitzer EP200 68 |

69 |

70 | We specialize in the sale and repair of classic keyboards, in particular the Fender Rhodes, Wurlitzer EP200, and Hohner Clavinet. 71 |

72 |
73 | 74 | -------------------------------------------------------------------------------- /番外篇/PEP8风格指南.md: -------------------------------------------------------------------------------- 1 | ## PEP 8風格指南 2 | 3 | PEP是Python Enhancement Proposal的縮寫,通常翻譯為“Python增強提案”。每個PEP都是一份為Python社群提供的指導Python往更好的方向發展的技術文件,其中的第8號增強提案(PEP 8)是針對Python語言編訂的程式碼風格指南。儘管我們可以在保證語法沒有問題的前提下隨意書寫Python程式碼,但是在實際開發中,採用一致的風格書寫出可讀性強的程式碼是每個專業的程式設計師應該做到的事情,也是每個公司的程式設計規範中會提出的要求,這些在多人協作開發一個專案(團隊開發)的時候顯得尤為重要。我們可以從Python官方網站的[PEP 8連結](https://www.python.org/dev/peps/pep-0008/)中找到該文件,下面我們對該文件的關鍵部分做一個簡單的總結。 4 | 5 | ### 空格的使用 6 | 7 | 1. 使用空格來表示縮排而不要用製表符(Tab)。這一點對習慣了其他程式語言的人來說簡直覺得不可理喻,因為絕大多數的程式設計師都會用Tab來表示縮排,但是要知道Python並沒有像C/C++或Java那樣的用花括號來構造一個程式碼塊的語法,在Python中分支和迴圈結構都使用縮排來表示哪些程式碼屬於同一個級別,鑑於此Python程式碼對縮排以及縮排寬度的依賴比其他很多語言都強得多。在不同的編輯器中,Tab的寬度可能是2、4或8個字元,甚至是其他更離譜的值,用Tab來表示縮排對Python程式碼來說可能是一場災難。 8 | 2. 和語法相關的每一層縮排都用4個空格來表示。 9 | 3. 每行的字元數不要超過79個字元,如果表示式因太長而佔據了多行,除了首行之外的其餘各行都應該在正常的縮排寬度上再加上4個空格。 10 | 4. 函式和類的定義,程式碼前後都要用兩個空行進行分隔。 11 | 5. 在同一個類中,各個方法之間應該用一個空行進行分隔。 12 | 6. 二元運算子的左右兩側應該保留一個空格,而且只要一個空格就好。 13 | 14 | ### 識別符號命名 15 | 16 | PEP 8倡導用不同的命名風格來命名Python中不同的識別符號,以便在閱讀程式碼時能夠透過識別符號的名稱來確定該識別符號在Python中扮演了怎樣的角色(在這一點上,Python自己的內建模組以及某些第三方模組都做得並不是很好)。 17 | 18 | 1. 變數、函式和屬性應該使用小寫字母來拼寫,如果有多個單詞就使用下劃線進行連線。 19 | 2. 類中受保護的例項屬性,應該以一個下劃線開頭。 20 | 3. 類中私有的例項屬性,應該以兩個下劃線開頭。 21 | 4. 類和異常的命名,應該每個單詞首字母大寫。 22 | 5. 模組級別的常量,應該採用全大寫字母,如果有多個單詞就用下劃線進行連線。 23 | 6. 類的例項方法,應該把第一個引數命名為`self`以表示物件自身。 24 | 7. 類的類方法,應該把第一個引數命名為`cls`以表示該類自身。 25 | 26 | ### 表示式和語句 27 | 28 | 在Python之禪(可以使用`import this`檢視)中有這麼一句名言:“There should be one-- and preferably only one --obvious way to do it.”,翻譯成中文是“做一件事應該有而且最好只有一種確切的做法”,這句話傳達的思想在PEP 8中也是無處不在的。 29 | 30 | 1. 採用內聯形式的否定詞,而不要把否定詞放在整個表示式的前面。例如`if a is not b`就比`if not a is b`更容易讓人理解。 31 | 2. 不要用檢查長度的方式來判斷字串、列表等是否為`None`或者沒有元素,應該用`if not x`這樣的寫法來檢查它。 32 | 3. 就算`if`分支、`for`迴圈、`except`異常捕獲等中只有一行程式碼,也不要將程式碼和`if`、`for`、`except`等寫在一起,分開寫才會讓程式碼更清晰。 33 | 4. `import`語句總是放在檔案開頭的地方。 34 | 5. 引入模組的時候,`from math import sqrt`比`import math`更好。 35 | 6. 如果有多個`import`語句,應該將其分為三部分,從上到下分別是Python**標準模組**、**第三方模組**和**自定義模組**,每個部分內部應該按照模組名稱的**字母表順序**來排列。 36 | 37 | -------------------------------------------------------------------------------- /番外篇/Python参考书籍.md: -------------------------------------------------------------------------------- 1 | ## Python參考書籍 2 | 3 | ### 入門讀物 4 | 5 | 1. 《Python基礎教程》(*Beginning Python From Novice to Professional*) 6 | 2. 《Python學習手冊》(*Learning Python*) 7 | 3. 《Python程式設計》(*Programming Python*) 8 | 4. 《Python Cookbook》 9 | 5. 《Python程式設計》(*Python Programming: An Introduction to Computer Science*) 10 | 6. 《Modern Python Cookbook》 11 | 12 | ### 進階讀物 13 | 14 | 1. 《Python核心程式設計》(*Core Python Applications Programming*) 15 | 2. 《流暢的Python》(*Fluent Python*) 16 | 3. 《Effective Python:編寫高質量Python程式碼的59個有效方法》(*Effective Python 59 Specific Ways to Write Better Python*) 17 | 4. 《Python設計模式》(*Learning Python Design Patterns*) 18 | 5. 《Python高階程式設計》(*Expert Python Programming*) 19 | 6. 《Python效能分析與最佳化》(*Mastering Python High Performance*) 20 | 21 | ### Web框架 22 | 23 | 1. 《Django基礎教程》(*Tango with Django*) 24 | 2. 《輕量級Django》(*Lightweight Django*) 25 | 3. 《Python Web開發:測試驅動方法》(*Test-Driven Development with Python*) 26 | 4. 《Web Development with Django Cookbook》 27 | 5. 《Test-Driven Development with Django》 28 | 6. 《Django Project Blueprints 》 29 | 7. 《Flask Web開發:基於Python的Web應用開發實戰》(*Flask Web Development: Developing Web Applications with Python*) 30 | 8. 《深入理解Flask》(*Mastering Flask*) 31 | 32 | ### 爬蟲開發 33 | 34 | 1. 《用Python寫網路爬蟲》(*Web Scraping with Python*) 35 | 2. 《精通Python爬蟲框架Scrapy》(*Learning Scrapy*) 36 | 3. 《Python網路資料採集》(*Web Scraping with Python*) 37 | 4. 《Python爬蟲開發與專案實戰》 38 | 5. 《Python 3網路爬蟲開發實戰》 39 | 40 | ### 資料分析 41 | 42 | 1. 《利用Python進行資料分析》(*Python for Data Analysis*) 43 | 2. 《Python資料科學手冊》(*Python Data Science Handbook*) 44 | 3. 《Python金融大資料分析》(*Python for Finance*) 45 | 4. 《Python資料視覺化程式設計實戰》(*Python Data Visualization Cookbook*) 46 | 5. 《Python資料處理》(*Data Wrangling with Python*) 47 | 48 | ### 機器學習 49 | 50 | 1. 《Python機器學習基礎教程》(*Introduction to Machine Learning with Python*) 51 | 2. 《Python機器學習實踐指南》(*Python Machine Learning Blueprints*) 52 | 3. 《Python Machine Learning Case Studies》 53 | 4. 《Python機器學習實踐:測試驅動的開發方法》(*Thoughtful Machine Learning with Python A Test Driven Approach*) 54 | 5. 《Python機器學習經典例項》(*Python Machine Learning Cookbook*) 55 | 6. 《TensorFlow:實戰Google深度學習框架》 -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/css_practice_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HTML5 Layout 5 | 6 | 7 |
8 |
9 |

Yoko's Kitchen

10 | 19 |
20 |
21 |
22 |
23 | Bok Choi 24 |
Bok Choi
25 |
26 |
27 |

Japanese Vegetarian

28 |

Five week course in London

29 |
30 |

31 | A five week introduction to traditional Japanese vegetarian meals, teaching you a selection of rice and noodle 32 | dishes. 33 |

34 |
35 |
36 |
37 | Teriyaki sauce 38 |
Teriyaki Sauce
39 |
40 |
41 |

Sauces Masterclass

42 |

One day workshop

43 |
44 |

45 | An intensive one-day course looking at how to create the most delicious sauces for use in a range of Japanese 46 | cookery. 47 |

48 |
49 |
50 | 68 | 71 |
72 | 73 | 74 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/css_practice_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Boxes 5 | 60 | 61 | 62 |
63 | 66 | 73 |

74 | Fender Rhodes, Hohner Clavinet, and Wurlitzer EP200 75 |

76 |

77 | We specialize in the sale and repair of classic keyboards, in particular the Fender Rhodes, Wurlitzer EP200, and Hohner Clavinet. 78 |

79 |
80 | 81 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example06.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 |

JavaScript课堂案例

15 |
16 |

Make English as your working language!!!

17 |

浏览器中的JavaScript:

18 | 23 |
24 |

课堂案例

25 |
    26 |
  1. 例子1:BOM和DOM的感性认识
  2. 27 |
  3. 例子2:成都机动车限行查询
  4. 28 |
  5. 例子3:延迟跳转到百度
  6. 29 |
  7. 30 | 例子4:轮播广告 31 | 完整效果请参考作业1 32 |
  8. 33 |
  9. 例子5:事件冒泡和事件捕获
  10. 34 |
  11. 例子6:获取事件源和访问相关元素
  12. 35 |
  13. 例子7:动态添加和删除元素
  14. 36 |
  15. 例子8:流氓浮动广告
  16. 37 |
  17. 例子9:jQuery实现表格效果
  18. 38 |
  19. 例子10:jQuery实现动态列表
  20. 39 |
  21. 例子11:Ajax加载美女图片(原生JavaScript)
  22. 40 |
  23. 例子12:Ajax加载美女图片(jQuery)
  24. 41 |
42 |

课后练习

43 |
    44 |
  1. 45 | 46 | 练习1:轮播广告 47 |
  2. 48 |
  3. 练习2:缩略图效果
  4. 49 |
  5. 练习3:闪烁的方块
  6. 50 |
  7. 练习4:表格效果
  8. 51 |
  9. 练习5:购物车效果(仿京东)
  10. 52 |
  11. 练习6:可拖拽的元素
  12. 53 |
  13. 练习7:周公解梦(Ajax)
  14. 54 |
  15. 练习7:表单验证(正则表达式)
  16. 55 |
56 | 57 | 58 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework03.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 35 | 36 | 37 |
38 |
39 | 40 | 41 |
42 | 43 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework01.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 34 | 35 | 36 |
37 | 38 | 44 |
45 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_jquery_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ajax请求 6 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
编号姓名职位工资补贴所在部门
40 |
41 |    42 | 43 |
44 | 45 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_jquery_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 45 | 46 | 47 |
48 | 54 | 55 | 56 |
57 | 58 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework08.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 46 | 47 | 48 |
49 |
50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 |
59 |
60 | 61 | 62 | 63 |
64 |
65 | 66 | 67 | 68 |
69 |
70 | 71 | 72 | 73 |
74 |
75 | 76 |
77 |
78 | 79 | 80 | 我同意《XYZ服务协议》 81 |
82 |
83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 成都机动车限行查询 6 | 40 | 41 | 42 | 47 |
48 |

49 | 87 | 88 | -------------------------------------------------------------------------------- /Day21-30/code/old/html+css/classical_layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 75 | 76 | 77 | 89 |
90 |
91 | 92 |
93 |
94 |
95 |
96 |
97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example02.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 成都机动车限行查询 6 | 40 | 41 | 42 | 47 |
48 |

49 | 89 | 90 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 给多个元素绑定事件 6 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example10.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 52 | 53 | 54 |
55 | 61 | 62 | 63 |
64 | 65 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /番外篇/常见反爬策略及应对方案.md: -------------------------------------------------------------------------------- 1 | ## 常見反爬策略及應對方案 2 | 3 | 1. 構造合理的HTTP請求頭。 4 | - Accept 5 | 6 | - User-Agent 7 | 8 | - Referer 9 | 10 | - Accept-Encoding 11 | 12 | - Accept-Language 13 | 2. 檢查網站生成的Cookie。 14 | - 有用的外掛:[EditThisCookie](http://www.editthiscookie.com/) 15 | - 如何處理指令碼動態生成的Cookie 16 | 3. 抓取動態內容。 17 | - Selenium + WebDriver 18 | - Chrome / Firefox - Driver 19 | 4. 限制爬取的速度。 20 | 5. 處理表單中的隱藏域。 21 | - 在讀取到隱藏域之前不要提交表單 22 | - 用RoboBrowser這樣的工具輔助提交表單 23 | 6. 處理表單中的驗證碼。 24 | - OCR(Tesseract) - 商業專案一般不考慮 25 | 26 | - 專業識別平臺 - 超級鷹 / 雲打碼 27 | 28 | ```Python 29 | from hashlib import md5 30 | 31 | class ChaoClient(object): 32 | 33 | def __init__(self, username, password, soft_id): 34 | self.username = username 35 | password = password.encode('utf-8') 36 | self.password = md5(password).hexdigest() 37 | self.soft_id = soft_id 38 | self.base_params = { 39 | 'user': self.username, 40 | 'pass2': self.password, 41 | 'softid': self.soft_id, 42 | } 43 | self.headers = { 44 | 'Connection': 'Keep-Alive', 45 | 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', 46 | } 47 | 48 | def post_pic(self, im, codetype): 49 | params = { 50 | 'codetype': codetype, 51 | } 52 | params.update(self.base_params) 53 | files = {'userfile': ('captcha.jpg', im)} 54 | r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) 55 | return r.json() 56 | 57 | 58 | if __name__ == '__main__': 59 | client = ChaoClient('使用者名稱', '密碼', '軟體ID') 60 | with open('captcha.jpg', 'rb') as file: 61 | print(client.post_pic(file, 1902)) 62 | ``` 63 | 64 | 7. 繞開“陷阱”。 65 | - 網頁上有誘使爬蟲爬取的爬取的隱藏連結(陷阱或蜜罐) 66 | - 透過Selenium+WebDriver+Chrome判斷連結是否可見或在可視區域 67 | 8. 隱藏身份。 68 | - 代理服務 - 快代理 / 訊代理 / 芝麻代理 / 蘑菇代理 / 雲代理 69 | 70 | [《爬蟲代理哪家強?十大付費代理詳細對比評測出爐!》](https://cuiqingcai.com/5094.html) 71 | 72 | - 洋蔥路由 - 國內需要翻牆才能使用 73 | 74 | ```Shell 75 | yum -y install tor 76 | useradd admin -d /home/admin 77 | passwd admin 78 | chown -R admin:admin /home/admin 79 | chown -R admin:admin /var/run/tor 80 | tor 81 | ``` 82 | -------------------------------------------------------------------------------- /Day21-30/code/list_by_vue.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 动态列表 6 | 61 | 62 | 63 |
64 | 70 |
71 | 72 | 73 |
74 |
75 | 76 | 99 | 100 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example01.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 21 | 22 | 23 |
24 |

Hello, world!

25 | 26 | 27 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_table.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表格 6 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 |
学生考试成绩表
姓名语文数学英语体育
王大锤908060
王大锤907060
王大锤90807060
102 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example09.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 |
数据统计表
姓名年龄性别身高体重
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
76 |
77 | 78 | 79 | 80 | 81 |
82 | 83 | 84 | 85 | 86 | 87 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /番外篇/用函数还是用复杂的表达式.md: -------------------------------------------------------------------------------- 1 | ## 用函式還是用複雜的表示式 2 | 3 | Perl語言的原作者*Larry Wall*曾經說過,偉大的程式設計師都有三個優點:懶惰、暴躁和自負。乍一看這三個詞語沒有一個是褒義詞,但在程式設計師的世界裡,這三個詞有不同的意義。首先,懶惰會促使程式設計師去寫一些省事兒的程式來輔助自己或別人更好的完成工作,這樣我們就無需做那些重複和繁瑣的勞動;同理能夠用3行程式碼解決的事情,我們也絕不會寫出10行程式碼來。其次,暴躁會讓程式設計師主動的去完成一些你還沒有提出的工作,去最佳化自己的程式碼讓它更有效率,能夠3秒鐘完成的任務,我們絕不能容忍1分鐘的等待。最後,自負會促使程式設計師寫出可靠無誤的程式碼,我們寫程式碼不是為了接受批評和指責,而是為了讓其他人來膜拜。 4 | 5 | 那麼接下來就有一個很有意思的問題值得探討一下,我們需要一個程式從輸入的三個數中找出最大的那個數。這個程式對任何會程式設計的人來說都是小菜一碟,甚至不會程式設計的人經過10分鐘的學習也能搞定。下面是用來解決這個問題的Python程式碼。 6 | 7 | ```Python 8 | a = int(input('a = ')) 9 | b = int(input('b = ')) 10 | c = int(input('c = ')) 11 | if a > b: 12 | the_max = a 13 | else: 14 | the_max = b 15 | if c > the_max: 16 | the_max = c 17 | print('The max is:', the_max) 18 | ``` 19 | 20 | 但是我們剛才說了,程式設計師都是懶惰的,很多程式設計師都會使用三元條件運算子來改寫上面的程式碼。 21 | 22 | ```Python 23 | a = int(input('a = ')) 24 | b = int(input('b = ')) 25 | c = int(input('c = ')) 26 | the_max = a if a > b else b 27 | the_max = c if c > the_max else the_max 28 | print('The max is:', the_max) 29 | ``` 30 | 31 | 需要說明的是,Python在2.5版本以前是沒有上面程式碼第4行和第5行中使用的三元條件運算子的,究其原因是Guido van Rossum(Python之父)認為三元條件運算子並不能幫助 Python變得更加簡潔,於是那些習慣了在C/C++或Java中使用三元條件運算子(在這些語言中,三元條件運算子也稱為“Elvis運算子”,因為`?:`放在一起很像著名搖滾歌手貓王Elvis的大背頭)的程式設計師試著用`and`和`or`運算子的短路特性來模擬出三元運算子,於是在那個年代,上面的程式碼是這樣寫的。 32 | 33 | ```Python 34 | a = int(input('a = ')) 35 | b = int(input('b = ')) 36 | c = int(input('c = ')) 37 | the_max = a > b and a or b 38 | the_max = c > the_max and c or the_max 39 | print('The max is:', the_max) 40 | ``` 41 | 42 | 但是這種做法在某些場景下是不能成立的,且看下面的程式碼。 43 | 44 | ```Python 45 | a = 0 46 | b = -100 47 | # 下面的程式碼本來預期輸出a的值,結果卻得到了b的值 48 | # 因為a的值0在進行邏輯運算時會被視為False來處理 49 | print(True and a or b) 50 | # print(a if True else b) 51 | ``` 52 | 53 | 所以在Python 2.5以後引入了三元條件運算子來避免上面的風險(上面程式碼被註釋掉的最後一句話)。那麼,問題又來了,上面的程式碼還可以寫得更簡短嗎?答案是肯定的。 54 | 55 | ```Python 56 | a = int(input('a = ')) 57 | b = int(input('b = ')) 58 | c = int(input('c = ')) 59 | print('The max is:', (a if a > b else b) if (a if a > b else b) > c else c) 60 | ``` 61 | 62 | 但是,這樣做真的好嗎?如此複雜的表示式是不是讓程式碼變得晦澀了很多呢?我們發現,在實際開發中很多開發者都喜歡過度的使用某種語言的特性或語法糖,於是簡單的多行程式碼變成了複雜的單行表示式,這樣做真的好嗎?這個問題我也不止一次的問過自己,現在我能給出的答案是下面的程式碼,使用輔助函式。 63 | 64 | ```Python 65 | def the_max(x, y): 66 | return x if x > y else y 67 | 68 | 69 | a = int(input('a = ')) 70 | b = int(input('b = ')) 71 | c = int(input('c = ')) 72 | print('The max is:', the_max(the_max(a, b), c)) 73 | ``` 74 | 75 | 上面的程式碼中,我定義了一個輔助函式`the_max`用來找出引數傳入的兩個值中較大的那一個,於是下面的輸出語句可以透過兩次呼叫`the_max`函式來找出三個數中的最大值,現在程式碼的可讀性是不是好了很多。用輔助函式來替代複雜的表示式真的是一個不錯的選擇,關鍵是比較大小的邏輯轉移到這個輔助函式後不僅可以反覆呼叫它,而且還可以進行級聯操作。 76 | 77 | 當然,很多語言中比較大小的函式根本沒有必要自己來實現(通常都是內建函式),Python也是如此。Python內建的max函式利用了Python對可變引數的支援,允許一次性傳入多個值或者一個迭代器並找出那個最大值,所以上面討論的問題在Python中也就是一句話的事,但是從複雜表示式到使用輔助函式簡化複雜表示式這個思想是非常值得玩味的,所以分享出來跟大家做一個交流。 78 | 79 | ```Python 80 | a = int(input('a = ')) 81 | b = int(input('b = ')) 82 | c = int(input('c = ')) 83 | print('The max is:', max(a, b, c)) 84 | ``` 85 | 86 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 骆昊的技术专栏 10 | 11 | 38 | 39 | 40 | 41 | 点击这里给我发消息 42 | 43 | 革命理想 44 | 坚持马克思 45 |

<jackfrued>的博客 - H2O

46 |
47 |

骆昊喜欢的网站

48 | 64 |
65 |
66 |

图片加载失败Python

67 |
68 |
69 |
70 |
面向对象的编程语言
71 |
基本概念:类、对象
72 |
三大支柱:封装、继承、多态
73 |
74 |
75 |
动态弱类型语言,需要Python解释器才能执行
76 |
77 |

床     前明月光1

78 |

疑似地上霜©

79 |

举头™望明月2

80 |

低头故乡

81 | 82 | 83 |
84 | 回顶部 85 | 联系站长 86 |
87 | 101 | 102 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_jquery_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
数据统计表
姓名年龄性别身高体重
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
78 |
79 | 80 | 81 | 82 | 83 |
84 | 85 | 86 | 87 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /番外篇/我为什么选择了Python.md: -------------------------------------------------------------------------------- 1 | ## 我為什麼選擇了Python 2 | 3 | 目前,Python語言的發展勢頭在國內國外都是不可阻擋的,Python憑藉其簡單優雅的語法,強大的生態圈從眾多語言中脫穎而出,如今已經是穩坐程式語言排行榜前三的位置。國內很多Python開發者都是從Java開發者跨界過來的,我自己也不例外。我簡單的跟大家交代一下,我為什麼選擇了Python。 4 | 5 | ### Python vs. Java 6 | 7 | 我們通過幾個例子來比較一下,做同樣的事情Java和Python的程式碼都是怎麼寫的。 8 | 9 | 例子1:在終端中輸出“hello, world”。 10 | 11 | Java程式碼: 12 | 13 | ```Java 14 | class Test { 15 | 16 | public static void main(String[] args) { 17 | System.out.println("hello, world"); 18 | } 19 | } 20 | ``` 21 | 22 | Python程式碼: 23 | 24 | ```Python 25 | print('hello, world') 26 | ``` 27 | 28 | 例子2:從1到100求和。 29 | 30 | Java程式碼: 31 | 32 | ```Java 33 | class Test { 34 | 35 | public static void main(String[] args) { 36 | int total = 0; 37 | for (int i = 1; i <= 100; i += 1) { 38 | total += i; 39 | } 40 | System.out.println(total); 41 | } 42 | } 43 | ``` 44 | 45 | Python程式碼: 46 | 47 | ```Python 48 | print(sum(range(1, 101))) 49 | ``` 50 | 51 | 例子3:雙色球隨機選號。 52 | 53 | Java程式碼: 54 | 55 | ```Java 56 | import java.util.List; 57 | import java.util.ArrayList; 58 | import java.util.Collections; 59 | 60 | class Test { 61 | 62 | /** 63 | * 產生[min, max)範圍的隨機整數 64 | */ 65 | public static int randomInt(int min, int max) { 66 | return (int) (Math.random() * (max - min) + min); 67 | } 68 | 69 | public static void main(String[] args) { 70 | // 初始化備選紅色球 71 | List redBalls = new ArrayList<>(); 72 | for (int i = 1; i <= 33; ++i) { 73 | redBalls.add(i); 74 | } 75 | List selectedBalls = new ArrayList<>(); 76 | // 選出六個紅色球 77 | for (int i = 0; i < 6; ++i) { 78 | selectedBalls.add(redBalls.remove(randomInt(0, redBalls.size()))); 79 | } 80 | // 對紅色球進行排序 81 | Collections.sort(selectedBalls); 82 | // 新增一個藍色球 83 | selectedBalls.add(randomInt(1, 17)); 84 | // 輸出選中的隨機號碼 85 | for (int i = 0; i < selectedBalls.size(); ++i) { 86 | System.out.printf("%02d ", selectedBalls.get(i)); 87 | if (i == selectedBalls.size() - 2) { 88 | System.out.print("| "); 89 | } 90 | } 91 | System.out.println(); 92 | } 93 | } 94 | ``` 95 | 96 | Python程式碼: 97 | 98 | ```Python 99 | from random import randint, sample 100 | 101 | # 初始化備選紅色球 102 | red_balls = [x for x in range(1, 34)] 103 | # 選出六個紅色球 104 | selected_balls = sample(red_balls, 6) 105 | # 對紅色球進行排序 106 | selected_balls.sort() 107 | # 新增一個藍色球 108 | selected_balls.append(randint(1, 16)) 109 | # 輸出選中的隨機號碼 110 | for index, ball in enumerate(selected_balls): 111 | print('%02d' % ball, end=' ') 112 | if index == len(selected_balls) - 2: 113 | print('|', end=' ') 114 | print() 115 | ``` 116 | 117 | 相信,看完這些例子後,你一定感受到了我選擇了Python是有道理的。 -------------------------------------------------------------------------------- /Day21-30/code/list_by_javascript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 动态列表 6 | 61 | 62 | 63 |
64 |
    65 |
  • 苹果×
  • 66 |
  • 香蕉×
  • 67 |
  • 榴莲×
  • 68 |
  • 火龙果×
  • 69 |
70 |
71 | 72 | 73 |
74 |
75 | 118 | 119 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表单的例子 - 注册 6 | 34 | 35 | 36 |
37 | 38 |
图1. 这是一个图片
39 |
40 |
41 |
42 | 用户基本信息 43 |

44 | 用户名: 45 | 46 |

47 |

48 | 密码: 49 | 50 |

51 |

52 | 确认密码: 53 | 54 |

55 |

56 | 性别: 57 | 男 58 | 女 59 |

60 |

61 | 爱好: 62 | 阅读 63 | 旅游 64 | 美食 65 | 运动 66 |

67 |

68 | 省份: 69 | 76 |

77 |

78 | 生日: 79 | 80 |

81 |
82 |
83 | 用户附加信息 84 |

85 | 邮箱: 86 | 87 |

88 |

89 | 头像: 90 | 91 |

92 |

93 | 自我介绍: 94 | 95 |

96 |

97 | 98 | 99 |

100 |
101 |
102 |

103 | 104 |

105 | 106 | 107 | -------------------------------------------------------------------------------- /更新日志.md: -------------------------------------------------------------------------------- 1 | ## 更新日誌 2 | 3 | ### 2022年1月11日 4 | 5 | 1. 將近期收到的打賞透過水滴籌和眾緣普濟公益慈善促進會捐贈給有需要的人。 6 | 7 | ![](res/ABF827024EA535099DC0E6A66A336C51.png) 8 | 9 | ### 2021年11月22日 10 | 11 | 1. 更新了資料庫部分的文件和程式碼。 12 | 2. 修正了網友們指出的文件和程式碼中的bug。 13 | 3. 更新了README檔案中的群資訊。 14 | 15 | ### 2021年10月7日 16 | 17 | 1. 調整了專案目錄結構。 18 | 2. 更新了資料分析部分的內容。 19 | 20 | ### 2021年3月28日 21 | 22 | 1. 最近把資料探勘的東西梳理了一遍,準備開始寫文件啦。 23 | 24 | 2. 近期收到的打賞透過美團公益捐贈給有需要的人。 25 | 26 | ![](res/donation6.png) 27 | 28 | ![](res/donation7.png) 29 | 30 | ![](res/donation8.png) 31 | 32 | ###2020年10月3日 33 | 34 | 1. 調整專案目錄結構。 35 | 2. 開始補全前面缺失內容和更新最後部分的工作。 36 | 3. 將近期收到的打賞透過水滴籌等平臺捐助給需要幫助的人。 37 | 38 | ### 2020年7月12日 39 | 40 | 1. 修正了部分文件中的bug。 41 | 42 | 2. 更新了Django部分的文件。 43 | 44 | 3. 將近期收到的打賞捐贈給陝西迴歸兒童救助中心。 45 | 46 | ![](res/donation5.png) 47 | 48 | ### 2020年4月8日 49 | 50 | 1. 將基礎部分(第1天到第15天)內容重新建立了一個名為“Python-Core-50-Courses”的倉庫,更新了部分內容。 51 | 52 | 2. 更新了README.md檔案。 53 | 54 | 3. 將近期收到的打賞透過騰訊公益捐出,助力“兒童健康課堂”。 55 | 56 | ![](res/donation4.png) 57 | 58 | ### 2020年3月8日 59 | 60 | 1. 更新了最後10天的部分文件。 61 | 62 | 2. 透過美團公益將近期打賞捐助給受疫情影響兒童。 63 | 64 | ![](res/donation3.png) 65 | 66 | ### 2020年3月1日 67 | 68 | 1. 優化了專案中的部分圖片資源。 69 | 2. 更新了部分文件。 70 | 71 | ### 2019年9月23日 72 | 73 | 1. 計劃在國慶長假結束前,完成第91天到第100天內容的更新,包括最新的Python面試題集。 74 | 2. 修改了第7天《字串和常用資料結構》一文的內容。 75 | 76 | ### 2019年9月15日 77 | 78 | 1. 將微信打賞所得收入透過騰訊公益捐贈給國家級貧困大學生。 79 | 80 | ![](./res/donation2.png) 81 | 82 | 2. 開始更新和調整第1天到第15天的內容。 83 | 84 | 3. 開始整理大家期待已久的《Python面試題大全及參考答案》。 85 | 86 | ### 2019年8月12日 87 | 88 | 1. 釋出了《使用Hexo搭建自己的部落格》一文。 89 | 90 | ### 2019年8月8日 91 | 92 | 1. 最近公司給安排了很多工,所以好久都沒有更新這個專案,今天終於把一直計劃更新的《關係型資料庫MySQL》更新完了。 93 | 2. 昨天微信收款提示我已經連續有48天收到了打賞,非常感謝大家持續的支援。 94 | 3. 最近一直在計劃為這個項目錄制一個配套的影片,當然這個工作量的巨大是可想而知的,但是我還是決定要在年底之前開始做這件事情,這樣才能不辜負那麼多希望透過這個專案學習和了解Python的人。 95 | 96 | ### 2019年7月11日 97 | 98 | 1. 今天終於結束了出差的日子,回來先把最近收到的打賞透過騰訊公益平臺全部捐贈給了綠之葉,總共捐出了111筆打賞。 99 | 100 | ![](./res/donation1.png) 101 | 102 | ### 2019年7月9日 103 | 104 | 1. 最近出差,專案一直處於停更狀態。交流群的很多初學者反饋從第8天開始內容就有一定難度,最近本來也打算把語言基礎部分和爬蟲的部門重新整理一次,這次爭取將文字和案例做得更加通俗易懂,而且更具實用性,這個事情從今天已然開始了,最終的目標是要將這部分的內容整理成一本書,希望大家到時候能夠一如既往的支援。 105 | 2. 最近1周多的時間一共收到60筆以上的打賞,最多的一天收到了14筆打賞,還是要再次謝謝大家為知識付費的行為,當然加交流群是不用付費的,您支付的費用會用於支援山區兒童教育。 106 | 3. 今天重新翻譯了*Zen of Python*,這次的版本我自己都比較喜歡,所以也分享給大家。 107 | 108 | ### 2019年6月30日 109 | 110 | 1. 最近2天一共收到11筆打賞。 111 | 2. 終於將第48天《前後端分離開發》一文更新完,但是自己都感覺有點湊數的嫌疑,文字描述沒怎麼花心思去寫,大家可以參考專案的程式碼來了解前後端分離開發。專案中使用了Vue.js,但是沒有使用腳手架工具,也沒有配置前端路由,僅僅使用了Vue.js來渲染頁面,畢竟我自己也不是專業的前端。 112 | 113 | ### 2019年6月27日 114 | 115 | 1. 最近3天一共收到35筆打賞,感謝大家持續關注。 116 | 2. 近期事情較多,更新速度可能會放緩,請大家諒解。 117 | 3. 今晚公開課相關的資料已經更新到公開課目錄中。 118 | 119 | ### 2019年6月23日 120 | 121 | 1. 最近幾天一共收到25筆打賞,感謝大家的支援。 122 | 2. 更新了QQ交流群,重新建立了一個2000人群。 123 | 124 | ### 2019年6月18日 125 | 126 | 1. 在朋友的建議下,給首頁加了一個打賞的二維碼,看看有多少願意為知識付費。今天一共收到了7位小夥伴的打賞,在此表示感謝,打賞獲得的收入將透過騰訊公益平臺全部捐出。 127 | 2. Django部分(第41天到第55天)更新到第47天,最新上線的部分包括報表、日誌、ORM查詢最佳化以及中介軟體相關的內容,並將投票應用的完成程式碼同步到github。 128 | 129 | -------------------------------------------------------------------------------- /Day91-100/99.面试中的公共问题.md: -------------------------------------------------------------------------------- 1 | ## 面試中的公共問題 2 | 3 | ### 計算機基礎 4 | 5 | 1. TCP/IP模型相關問題。 6 | 7 | > 建議閱讀阮一峰的[《網際網路協議入門(一)》](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)和[《網際網路協議入門(二)》](http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html)。 8 | 9 | 2. HTTP和HTTPS相關問題。 10 | 11 | > 建議閱讀阮一峰的[《HTTP 協議入門》](http://www.ruanyifeng.com/blog/2016/08/http.html)和[《SSL/TLS協議執行機制的概述》](http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html)。 12 | 13 | 3. Linux常用命令和服務。 14 | 15 | 4. 程序和執行緒之間的關係。什麼時候用多執行緒?什麼時候用多程序?。 16 | 17 | 5. 關係型資料庫相關問題(ACID、事務隔離級別、鎖、SQL最佳化)。 18 | 19 | 6. 非關係型資料庫相關問題(CAP/BASE、應用場景)。 20 | 21 | ### Python基礎 22 | 23 | 1. 開發中用過哪些標準庫和三方庫。 24 | 25 | > 標準庫:sys / os / re / math / random / logging / json / pickle / shelve / socket / datetime / hashlib / configparser / urllib / itertools / collections / functools / threading / multiprocess / timeit / atexit / abc / asyncio / base64 / concurrent.futures / copy / csv / operator / enum / heapq / http / profile / pstats / ssl / unittest / uuid 26 | > 27 | > 三方庫:openpyxl / xlrd / xlwt / PyPDF2 / ReportLab / PyYAML / jieba / pillow / requests / urllib3 / responses / aiohttp / BeautifulSoup4 / lxml / pyquery / PyMySQL / psycopg2 / redis / PyMongo / Peewee / SQLAlchemy / alipay / PyJWT / itsdangerous / celery / flower / elasticsearch-dsl-py / PyCrypto / Paramiko / logbook / nose / pytest / coverage / Selenium / lineprofiler / memoryprofiler / matplotlib / pygal / OpenCV 28 | 29 | 2. 裝飾器的作用、原理和實現。 30 | 31 | 3. 使用過哪些魔法方法。 32 | 33 | > 建議閱讀[《Python魔術方法指南》](https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/a-guide-to-pythons-magic-methods.html)。 34 | 35 | 4. 生成式、生成器、迭代器的編寫。 36 | 37 | 5. 列表、集合、字典的底層實現。 38 | 39 | 6. 垃圾回收相關問題。 40 | 41 | 7. 併發程式設計的相關問題。 42 | 43 | 8. 協程和非同步I/O相關知識。 44 | 45 | ### Django和Flask 46 | 47 | 1. MVC架構(MTV)解決了什麼問題。 48 | 49 | 2. 中介軟體的執行流程以及如何自定義中介軟體。 50 | 51 | 3. REST資料介面如何設計(URL、域名、版本、過濾、狀態碼、安全性)。 52 | 53 | > 建議閱讀阮一峰的[《RESTful API設計指南》](http://www.ruanyifeng.com/blog/2014/05/restful_api.html)。 54 | 55 | 4. 使用ORM框架實現CRUD操作的相關問題。 56 | 57 | - 如何實現多條件組合查詢 / 如何執行原生的SQL / 如何避免N+1查詢問題 58 | 59 | 5. 如何執行非同步任務和定時任務。 60 | 61 | 6. 如何實現頁面快取和查詢快取?快取如何預熱? 62 | 63 | ### 爬蟲相關 64 | 65 | 1. Scrapy框架的元件和資料處理流程。 66 | 2. 爬取的目的(專案中哪些地方需要用到爬蟲的資料)。 67 | 3. 使用的工具(抓包、下載、清理、儲存、分析、視覺化)。 68 | 4. 資料的來源(能夠輕鬆的列舉出10個網站)。 69 | 5. 資料的構成(抓取的某個欄位在專案中有什麼用)。 70 | 6. 反反爬措施(限速、請求頭、Cookie池、代理池、Selenium WebDriver、RoboBrowser、TOR、OCR)。 71 | 7. 資料的體量(最後抓取了多少資料,多少W條資料或多少個G的資料)。 72 | 8. 後期資料處理(持久化、資料補全、歸一化、格式化、轉存、分類)。 73 | 74 | ### 資料分析 75 | 76 | 1. 科學運算函式庫(SciPy和NumPy常用運算)。 77 | 2. 資料分析庫(Pandas中封裝的常用演算法)。 78 | 3. 常用的模型及對應的場景(分類、迴歸、聚類)。 79 | 4. 提取了哪些具體的指標。 80 | 5. 如何評價模型的優劣。 81 | 6. 每種模型實際操作的步驟,對結果如何評價。 82 | 83 | ### 專案相關 84 | 85 | 1. 專案團隊構成以及自己在團隊中扮演的角色(在專案中的職責)。 86 | 2. 專案的業務架構(哪些模組及子模組)和技術架構(移動端、PC端、後端技術棧)。 87 | 3. 軟體控制管理相關工具(版本控制、問題管理、持續整合)。 88 | 4. 核心業務實體及其屬性,實體與實體之間的關係。 89 | 5. 用到哪些依賴庫,依賴庫主要解決哪方面的問題。 90 | 6. 專案如何部署上線以及專案的物理架構(Nginx、Gunicorn/uWSGI、Redis、MongoDB、MySQL、Supervisor等)。 91 | 7. 如何對專案進行測試,有沒有做過效能調優。 92 | 8. 專案中遇到的困難有哪些,如何解決的。 -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_css_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CSS - 盒子模型 6 | 94 | 95 | 96 |
97 |
98 | 99 |

Hello, world!

100 |

静夜思

101 |
102 |
103 |

床前明月光

104 |

疑似地上霜

105 |

举头望明月

106 |

低头思故乡

107 |
108 | 109 | 110 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/example07.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 52 | 53 | 54 | 55 |
56 |
    57 | 58 |
  • 苹果×
  • 59 |
  • 香蕉×
  • 60 |
  • 火龙果×
  • 61 |
  • 西瓜×
  • 62 |
63 | 64 | 65 |
66 | 67 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /Day21-30/code/list_by_jquery.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 动态列表 6 | 61 | 62 | 63 |
64 |
    65 |
  • 苹果×
  • 66 |
  • 香蕉×
  • 67 |
  • 榴莲×
  • 68 |
  • 火龙果×
  • 69 |
70 |
71 | 72 | 73 |
74 |
75 | 76 | 113 | 114 | -------------------------------------------------------------------------------- /Day21-30/code/old/javascript/homework04.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 |
数据统计表
姓名年龄性别身高体重
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
76 |
77 | 78 | 79 | 80 | 81 |
82 | 83 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/css_practice_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Lists, Tables and Forms 5 | 33 | 34 | 35 |

Poetry Workshops

36 |

We will be conducting a number of poetry workshops and symposiums throughout the year.

37 |

Please note that the following events are free to members:

38 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |
New YorkChicagoSan Francisco
A Poetic PerspectiveSat, 4 Feb 2012
11am - 2pm
Sat, 3 Mar 2012
11am - 2pm
Sat, 17 Mar 2012
11am - 2pm
Walt Whitman at WarSat, 7 Apr 2012
11am - 1pm
Sat, 5 May 2012
11am - 1pm
Sat, 19 May 2012
11am - 1pm
Found Poems & Outsider PoetrySat, 9 Jun 2012
11am - 2pm
Sat, 7 Jul 2012
11am - 2pm
Sat, 21 Jul 2012
11am - 2pm
Natural Death: An ExplorationSat, 4 Aug 2012
11am - 4pm
Sat, 8 Sep 2012
11am - 4pm
Sat, 15 Sep 2012
11am - 4pm
75 |
76 |
77 | Register your interest 78 |

79 | 80 |
81 | 82 | 83 |

84 |

85 | 86 | 91 |

92 | 93 | Yes 94 | No 95 |
96 |
97 | 98 |
99 |
100 | 101 | 102 | -------------------------------------------------------------------------------- /Day21-30/code/垃圾分类查询/index-2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 垃圾分类查询助手 6 | 48 | 49 | 50 |
51 | 55 |
56 |

没有对应的查询结果

57 |
58 |

59 | 60 |    61 | {{ result.name }} 62 |    63 | (预测结果) 64 |

65 |

说明:{{ result.explain }}

66 |
67 |
68 |
69 | 70 | 96 | 97 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_js_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 45 | 46 | 47 |
48 |
    49 |
  • 苹果×
  • 50 |
  • 香蕉×
  • 51 |
  • 火龙果×
  • 52 |
  • 西瓜×
  • 53 |
54 | 55 | 56 |
57 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Day66-80/66.数据分析概述.md: -------------------------------------------------------------------------------- 1 | ## 資料分析概述 2 | 3 | 當今世界對資訊科技的依賴程度在不斷加深,每天都會有大量的資料產生,我們經常會感到資料越來越多,但是要從中發現有價值的資訊卻越來越難。這裡所說的資訊,可以理解為對資料集處理之後的結果,是從資料集中提煉出的可用於其他場合的結論性的東西,而**從原始資料中抽取出有價值的資訊**的這個過程我們就稱之為**資料分析**,它是資料科學工作的一部分。 4 | 5 | > 定義:**資料分析是有針對性的收集、加工、整理資料並採用統計、挖掘等技術對資料進行分析和解釋的科學和藝術**。 6 | 7 | ### 資料分析師的職責和技能棧 8 | 9 | HR在釋出招聘需求時,通常將資料工程、資料分析、資料探勘等崗位都統稱為資料分析崗位,但是根據工作性質的不同,又可以分為偏工程的**資料治理方向**、偏業務的**資料分析方向**、偏演算法的**資料探勘方向**、偏開發的**資料開發方向**、偏產品的**資料產品經理**。我們通常所說的資料分析師主要是指**業務資料分析師**,很多資料分析師的職業生涯都是從這個崗位開始的,而且這個崗位也是招聘數量最多的崗位。業務資料分析師在公司通常不屬於研發部門而屬於運營部門,所以這個崗位也稱為**資料運營**或**商業分析**,這類人員通常也被稱為“BI工程師”。通常招聘資訊對這個崗位的描述(JD)是: 10 | 11 | 1. 負責相關報表的輸出。 12 | 2. 建立和最佳化指標體系。 13 | 3. 監控資料波動和異常,找出問題。 14 | 4. 最佳化和驅動業務,推動數字化運營。 15 | 5. 找出潛在的市場和產品的上升空間。 16 | 17 | 根據上面的描述,作為業務資料分析師,我們的工作不是給領導一個簡單淺顯的結論,而是結合公司的業務,完成**監控資料**、**揪出異常**、**找到原因**、**探索趨勢**等工作。作為資料分析師,不管是用 Python 語言、Excel、SPSS或其他的商業智慧工具,工具只是達成目標的手段,**資料思維是核心技能**,從實際業務問題出發到最終**發現數據中的商業價值**是終極目標。資料分析師在很多公司只是一個基礎崗位,精於業務的資料分析師可以向**資料分析經理**或**資料運營總監**等管理崗位發展;對於熟悉機器學習演算法的資料分析師來說,可以向**資料探勘工程師**或**演算法專家**方向發展,而這些崗位除了需要相應的數學和統計學知識,在程式設計能力方面也比資料分析師有更高的要求,可能還需要有大資料儲存和處理的相關經驗。資料治理崗位主要是幫助公司建設資料倉庫或資料湖,實現資料從業務系統、埋點系統、日誌系統到分析庫的轉移,為後續的資料分析和挖掘提供基礎設施。資料治理崗位對 SQL 和 HiveSQL 有著較高的要求,要求能夠熟練的使用 ETL 工具,此外可能還需要對 Hadoop 生態圈有一個很好的認知。作為資料產品經理,除了傳統產品經理的技能棧之外,也需要較強的技術能力,例如要了解常用的推薦演算法、機器學習模型,能夠為演算法的改進提供依據,能夠制定相關埋點的規範和口徑,雖然不需要精通各種演算法,但是要站在產品的角度去考慮資料模型、指標、演算法等的落地 18 | 19 | 以下是我總結的資料分析師的技能棧,僅供參考。 20 | 21 | 1. 計算機科學(資料分析工具、程式語言、資料庫) 22 | 2. 數學和統計學(資料思維、統計思維) 23 | 3. 人工智慧(機器學習中的資料探勘演算法) 24 | 4. 業務理解能力(溝通、表達、經驗) 25 | 5. 總結和表述能力(商業PPT、文字總結) 26 | 27 | ### 資料分析的流程 28 | 29 | 我們提到數分析這個詞很多時候可能指的都是**狹義的資料分析**,這類資料分析主要目標就是生成視覺化報表並透過這些報表來洞察業務中的問題。**廣義的資料分析**還包含了資料探勘的部分,不僅要透過資料實現對業務的監控和分析,還要利用機器學習演算法,找出隱藏在資料背後的知識,並利用這些知識為將來的決策提供支撐。簡單的說,**一個完整的資料分析應該包括基本的資料分析和深入的資料探勘兩個部分**。 30 | 31 | 基本的資料分析工作一般包含以下幾個方面的內容,當然因為行業和工作內容的不同會略有差異。 32 | 33 | 1. 確定目標(輸入):理解業務,確定指標口徑 34 | 2. 獲取資料:資料倉庫、電子表格、三方介面、網路爬蟲、開放資料集等 35 | 3. 清洗資料:缺失值/重複值/異常值處理、資料變換(格式化、規範化)、離散化等 36 | 4. 資料透視:運算、統計、分組、聚合、視覺化 37 | 5. 資料報告(輸出):資料釋出,工作成果總結匯報 38 | 6. 分析洞察(後續):解釋資料的變化,提出對應的方案 39 | 40 | 深入的資料探勘工作通常包含以下幾個方面的內容,當然因為行業和工作內容的不同會略有差異。 41 | 42 | 1. 確定目標(輸入):理解業務,明確挖掘目標 43 | 2. 資料準備:資料採集、資料描述、資料探索、質量判定等 44 | 3. 資料加工:提取資料、清洗資料、資料變換、特殊編碼、降維、特徵選擇等 45 | 4. 資料建模:模型比較、模型選擇、演算法應用 46 | 5. 模型評估:交叉檢驗、引數調優、結果評價 47 | 6. 模型部署(輸出):模型落地、業務改進、運營監控、報告撰寫 48 | 49 | ### 資料分析相關庫 50 | 51 | 使用 Python 從事資料科學相關的工作是一個非常棒的選擇,因為 Python 整個生態圈中,有大量的成熟的用於資料科學的軟體包(工具庫)。而且不同於其他的用於資料科學的程式語言(如:Julia、R),Python 除了可以用於資料科學,能做的事情還很多,可以說 Python 語言幾乎是無所不能的。 52 | 53 | #### 三大神器 54 | 55 | 1. [NumPy](https://numpy.org/):支援常見的陣列和矩陣操作,透過`ndarray`類實現了對多維陣列的封裝,提供了操作這些陣列的方法和函式集。由於 NumPy 內建了並行運算功能,當使用多核 CPU 時,Numpy會自動做平行計算。 56 | 2. [Pandas](https://pandas.pydata.org/):pandas 的核心是其特有的資料結構`DataFrame`和`Series`,這使得 pandas 可以處理包含不同型別的資料的負責表格和時間序列,這一點是NumPy的`ndarray`做不到的。使用 pandas,可以輕鬆順利的載入各種形式的資料,然後對資料進行切片、切塊、處理缺失值、聚合、重塑和視覺化等操作。 57 | 3. [Matplotlib](https://matplotlib.org/):matplotlib 是一個包含各種繪圖模組的庫,能夠根據我們提供的資料建立高質量的圖形。此外,matplotlib 還提供了 pylab 模組,這個模組包含了很多像 [MATLAB](https://www.mathworks.com/products/matlab.html) 一樣的繪圖元件。 58 | 59 | #### 其他相關庫 60 | 61 | 1. [SciPy](https://scipy.org/):完善了 NumPy 的功能,封裝了大量科學計算的演算法,包括線性代數、稀疏矩陣、訊號和影象處理、最最佳化問題、快速傅立葉變換等。 62 | 2. [Seaborn](https://seaborn.pydata.org/):seaborn 是基於 matplotlib 的圖形視覺化工具,直接使用 matplotlib 雖然可以定製出漂亮的統計圖表,但是總體來說還不夠簡單方便,seaborn 相當於是對 matplotlib 做了封裝,讓使用者能夠以更簡潔有效的方式做出各種有吸引力的統計圖表。 63 | 3. [Scikit-learn](https://scikit-learn.org/):scikit-learn 最初是 SciPy 的一部分,它是 Python 資料科學運算的核心,提供了大量機器學習可能用到的工具,包括:資料預處理、監督學習(分類、迴歸)、無監督學習(聚類)、模式選擇、交叉檢驗等。 64 | 4. [Statsmodels](https://www.statsmodels.org/stable/index.html):包含了經典統計學和經濟計量學演算法的庫。 65 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_vue_element.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vue入门 6 | 34 | 35 | 36 | 37 |
38 |

员工信息表

39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 72 |
73 | 上一页 74 | 下一页 75 |
76 |
77 | 78 | 79 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /Day81-90/81.人工智能和机器学习概述.md: -------------------------------------------------------------------------------- 1 | ## 人工智慧和機器學習概述 2 | 3 | 所謂“人工智慧”通常是泛指讓機器具有像人一樣的智慧的技術,其目的是讓機器像人一樣能夠感知、思考和解決問題;而“機器學習”通常是指讓計算機透過學習現有的資料,實現認知的更新和進步。顯然,機器學習是實現人工智慧的一種途徑,這也是我們的課程要討論的內容。現如今,“機器學習”和“大資料”可以說是最時髦的兩個詞彙,而在弱人工智慧階段,無論是“機器學習”還是“大資料”最終要解決的問題本質上是一樣的,就是讓計算機將紛繁複雜的資料處理成有用的資訊,這樣就可以發掘出資料帶來的意義以及隱藏在資料背後的規律,簡單的說就是用現有的資料對將來的狀況做出預測和判斷。 4 | 5 | 在討論機器學習相關內容之前,我們先按照問題的“輸入”和“輸出”對用計算機求解的問題進行一個分類,如下所示: 6 | 7 | 1. 輸入的資訊是精確的,要求輸出最優解。 8 | 2. 輸入的資訊是精確的,無法找到最優解,只能獲得滿意解。 9 | 3. 輸入的資訊是模糊的,要求輸出最優解。 10 | 4. 輸入的資訊是模糊的,無法找到最優解,只能獲得滿意解。 11 | 12 | 在上面的四大類問題中,第1類問題是計算機最擅長解決的,這類問題其實就是“數值計算”和“邏輯推理”方面的問題,而傳統意義上的人工智慧也就是利用邏輯推理來解決問題(如早期的“人機對弈”)。一直以來,我們都習慣於將計算機稱為“電腦”,而基於“馮諾依曼”體系結構的“電腦”實際上只是實現了“人腦”理性思維這部分的功能,而且在這一點上“電腦”的表現通常是優於“人腦”的;但是“人腦”在處理模糊輸入資訊時表現出來的強大處理能力,在很多場景下“電腦”是難以企及的。所以我們研究機器學習的演算法,就是要解決在輸入模糊資訊時讓計算機給出滿意解甚至是最優解的問題。 13 | 14 | 人類透過記憶和歸納這兩種方式進行學習,透過記憶可以積累單個事實,使用歸納可以從舊的事實推匯出新的事實。所以機器學習其實是一種訓練,讓計算機透過這種訓練能夠學會根據資料隱含模式進行合理推斷的能力,其基本流程如下所示: 15 | 16 | 1. 觀察一組例項,通常稱為訓練資料,它們可以表示某種統計現象的不完整資訊; 17 | 2. 對觀測到的例項進行擴充套件,並使用推斷技術對擴充套件過程建模; 18 | 3. 使用這個模型對未知例項進行預測。 19 | 20 | ### 基本概念 21 | 22 | #### 監督學習和非監督學習 23 | 24 | 監督學習是從給定的訓練資料集中學習得到一個函式,當新的資料到來時,可以根據這個函式預測結果,監督學習的訓練集包括輸入和輸出,也可以說是特徵和目標。監督學習的目標是由人來標註的,而非監督學習的資料沒有類別資訊,訓練集也沒有人為標註結果,透過無監督學習可以減少資料特徵的維度,以便我們可以使用二維或三維圖形更加直觀地展示資料中的資訊 。 25 | 26 | #### 特徵向量和特徵工程 27 | 28 | 29 | 30 | #### 距離度量 31 | 32 | 33 | 34 | 1. 歐氏距離 35 | 36 | $$ 37 | d = \sqrt{\sum_{k=1}^n(x_{1k}-x_{2k})^2} 38 | $$ 39 | 40 | 2. 曼哈頓距離 41 | 42 | $$ 43 | d = \sum_{k=1}^n \mid {x_{1k}-x_{2k}} \mid 44 | $$ 45 | 46 | 3. 切比雪夫距離 47 | 48 | $$ 49 | d = max(\mid x_{1k}-x_{2k} \mid) 50 | $$ 51 | 52 | 4. 閔可夫斯基距離 53 | - 當$p=1$時,就是曼哈頓距離 54 | - 當$p=2$時,就是歐式距離 55 | - 當$p \to \infty$時,就是切比雪夫距離 56 | 57 | $$ 58 | d = \sqrt[p]{\sum_{k=1}^n \mid x_{1k}-x_{2k} \mid ^p} 59 | $$ 60 | 61 | 5. 餘弦距離 62 | $$ 63 | cos(\theta) = \frac{\sum_{k=1}^n x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^n x_{1k}^2} \sqrt{\sum_{k=1}^n x_{2k}^2}} 64 | $$ 65 | 66 | ### 機器學習的定義和應用領域 67 | 68 | 根據上面的論述,我們可以給“機器學習”下一個正式的定義:**機器學習是一門專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身效能的學科**。即使對於機器學習這個概念不那麼熟悉,但是機器學習的成果已經廣泛滲透到了生產生活的各個領域,下面的這些場景對於你來說一定不陌生。 69 | 70 | 場景1:搜尋引擎會根據搜尋和使用習慣,最佳化下一次搜尋的結果。 71 | 72 | 場景2:電商網站會根據你的訪問歷史自動推薦你可能感興趣的商品。 73 | 74 | 場景3:金融類產品會透過你最近的金融活動資訊綜合評定你的貸款申請。 75 | 76 | 場景4:影片和直播平臺會自動識別圖片和影片中有沒有不和諧的內容。 77 | 78 | 場景5:智慧家電和智慧汽車會根據你的語音指令做出相應的動作。 79 | 80 | 簡單的總結一下,機器學習可以應用到但不限於以下領域: 81 | 82 | 1. 計算機視覺。計算機視覺是指機器感知環境的能力,目前在[**物體檢測**](https://pjreddie.com/darknet/yolo/)和**人臉識別**這兩個領域已經非常成熟且產生了大量的應用。 83 | 84 | - 刷臉支付 85 | 86 | ![](res/face_paying.png) 87 | 88 | - [塗鴉識別](https://quickdraw.withgoogle.com/) 89 | 90 | ![](res/quickdraw.png) 91 | 92 | 2. 自然語言處理(NLP)。自然語言處理是目前機器學習中一個非常熱門的分支,具體的又可以分為三類應用場景。其中文字挖掘主要是對文字進行分類,包括句法分析、情緒分析和垃圾資訊檢測等;而機器翻譯和語音識別相信不用太多的解釋大家也都清楚。 93 | 94 | - 文字挖掘 95 | - 機器翻譯 96 | 97 | - 語音識別 98 | 99 | ![](res/xiaomi_ai_voice_box.png) 100 | 101 | 3. 機器人。機器人可以分為固定機器人和移動機器人兩大類。固定機器人通常被用於工業生產,例如用於裝配流水線。常見的移動機器人應用有貨運機器人、空中機器人和自動載具。機器人需要軟硬體的協作才能實現最優的作業,其中硬體包含感測器、反應器和控制器等,而軟體主要是實現感知能力,包括定位、測繪、目標檢測和識別等。 102 | 103 | - 機甲大師 104 | 105 | ![](res/dajiang_robomaster.png) 106 | 107 | - 掃地機器人 108 | 109 | ![](res/sweep_robot.jpg) 110 | 111 | ### 機器學習實施步驟 112 | 113 | 實現機器學習的一般步驟: 114 | 115 | 1. 資料收集 116 | 2. 資料準備 117 | 3. 資料分析 118 | 4. 訓練演算法 119 | 5. 測試演算法 120 | 6. 應用演算法 121 | 122 | ### Scikit-learn介紹 123 | 124 | ![](res/scikit-learn-logo.png) 125 | 126 | Scikit-learn源於Google Summer of Code專案,由David Cournapeau在2007年發起,它提供了機器學習可能用到的工具,包括資料預處理、監督學習(分類、迴歸)、非監督學習(聚類)、模型選擇、降維等。 127 | 128 | 官網地址: 129 | 130 | 安裝方法:`pip install scikit-learn` -------------------------------------------------------------------------------- /Day21-30/code/old/html+css/form_and_table.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 用户登录 7 | 95 | 96 | 97 | 98 |
99 |
100 | 用户登录 101 | 用户名: 102 | 103 | 密码: 104 | 105 | 邮箱: 106 | 107 | 108 |
109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 |
成都北京杭州
Python从入门到住院全国巡演2018年2月28日 上午9:302018年3月28日 上午9:302018年4月28日 上午9:30
MySQL从删库到跑路公开课2018年2月27日 上午9:302018年3月5日 上午9:302018年4月2日 上午9:30
Django从学习到上吊交流会2018年2月28日 上午9:302018年5月21日 上午9:30
爬虫从精通到坐牢无遮大会2018年3月3日 上午9:302018年4月17日 上午9:302018年1月15日 上午9:30
142 | 143 | 144 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/js_practice_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 |
数据统计表
姓名年龄性别身高体重
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
Item1Item2Item3Item4Item5
86 |
87 | 88 | 89 | 90 | 91 |
92 |
93 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /Day01-15/03.分支结构.md: -------------------------------------------------------------------------------- 1 | ## 分支結構 2 | 3 | ### 應用場景 4 | 5 | 迄今為止,我們寫的Python程式碼都是一條一條語句順序執行,這種程式碼結構通常稱之為順序結構。然而僅有順序結構並不能解決所有的問題,比如我們設計一個遊戲,遊戲第一關的通關條件是玩家獲得1000分,那麼在完成本局遊戲後,我們要根據玩家得到分數來決定究竟是進入第二關,還是告訴玩家“Game Over”,這裡就會產生兩個分支,而且這兩個分支只有一個會被執行。類似的場景還有很多,我們將這種結構稱之為“分支結構”或“選擇結構”。給大家一分鐘的時間,你應該可以想到至少5個以上這樣的例子,趕緊試一試。 6 | 7 | ### if語句的使用 8 | 9 | 在Python中,要構造分支結構可以使用`if`、`elif`和`else`關鍵字。所謂**關鍵字**就是有特殊含義的單詞,像`if`和`else`就是專門用於構造分支結構的關鍵字,很顯然你不能夠使用它作為變數名(事實上,用作其他的識別符號也是不可以)。下面的例子中演示瞭如何構造一個分支結構。 10 | 11 | ```Python 12 | """ 13 | 使用者身份驗證 14 | 15 | Version: 0.1 16 | Author: 駱昊 17 | """ 18 | username = input('請輸入使用者名稱: ') 19 | password = input('請輸入口令: ') 20 | # 使用者名稱是admin且密碼是123456則身份驗證成功否則身份驗證失敗 21 | if username == 'admin' and password == '123456': 22 | print('身份驗證成功!') 23 | else: 24 | print('身份驗證失敗!') 25 | ``` 26 | 27 | 需要說明的是和C/C++、Java等語言不同,Python中沒有用花括號來構造程式碼塊而是**使用了縮排的方式來表示程式碼的層次結構**,如果`if`條件成立的情況下需要執行多條語句,只要保持多條語句具有相同的縮排就可以了。換句話說**連續的程式碼如果又保持了相同的縮排那麼它們屬於同一個程式碼塊**,相當於是一個執行的整體。**縮排**可以使用任意數量的空格,但**通常使用4個空格**,建議大家**不要使用製表鍵**或者**設定你的程式碼編輯工具自動將製表鍵變成4個空格**。 28 | 29 | 當然如果要構造出更多的分支,可以使用`if...elif...else...`結構或者巢狀的`if...else...`結構,下面的程式碼演示瞭如何利用多分支結構實現分段函式求值。 30 | 31 | ![$$f(x)=\begin{cases} 3x-5&\text{(x>1)}\\x+2&\text{(-1}\leq\text{x}\leq\text{1)}\\5x+3&\text {(x<-1)}\end{cases}$$](./res/formula_1.png) 32 | 33 | ```Python 34 | """ 35 | 分段函式求值 36 | 37 | 3x - 5 (x > 1) 38 | f(x) = x + 2 (-1 <= x <= 1) 39 | 5x + 3 (x < -1) 40 | 41 | Version: 0.1 42 | Author: 駱昊 43 | """ 44 | 45 | x = float(input('x = ')) 46 | if x > 1: 47 | y = 3 * x - 5 48 | elif x >= -1: 49 | y = x + 2 50 | else: 51 | y = 5 * x + 3 52 | print('f(%.2f) = %.2f' % (x, y)) 53 | ``` 54 | 55 | 當然根據實際開發的需要,分支結構是可以巢狀的,例如判斷是否通關以後還要根據你獲得的寶物或者道具的數量對你的表現給出等級(比如點亮兩顆或三顆星星),那麼我們就需要在`if`的內部構造出一個新的分支結構,同理`elif`和`else`中也可以再構造新的分支,我們稱之為巢狀的分支結構,也就是說上面的程式碼也可以寫成下面的樣子。 56 | 57 | ```Python 58 | """ 59 | 分段函式求值 60 | 3x - 5 (x > 1) 61 | f(x) = x + 2 (-1 <= x <= 1) 62 | 5x + 3 (x < -1) 63 | 64 | Version: 0.1 65 | Author: 駱昊 66 | """ 67 | 68 | x = float(input('x = ')) 69 | if x > 1: 70 | y = 3 * x - 5 71 | else: 72 | if x >= -1: 73 | y = x + 2 74 | else: 75 | y = 5 * x + 3 76 | print('f(%.2f) = %.2f' % (x, y)) 77 | ``` 78 | 79 | > **說明:** 大家可以自己感受一下這兩種寫法到底是哪一種更好。在之前我們提到的Python之禪中有這麼一句話“Flat is better than nested.”,之所以提倡程式碼“扁平化”是因為巢狀結構的巢狀層次多了之後會嚴重的影響程式碼的可讀性,所以能使用扁平化的結構時就不要使用巢狀。 80 | 81 | ### 練習 82 | 83 | #### 練習1:英制單位英寸與公制單位釐米互換。 84 | 85 | 參考答案: 86 | 87 | ```Python 88 | """ 89 | 英制單位英寸和公制單位釐米互換 90 | 91 | Version: 0.1 92 | Author: 駱昊 93 | """ 94 | value = float(input('請輸入長度: ')) 95 | unit = input('請輸入單位: ') 96 | if unit == 'in' or unit == '英寸': 97 | print('%f英寸 = %f釐米' % (value, value * 2.54)) 98 | elif unit == 'cm' or unit == '釐米': 99 | print('%f釐米 = %f英寸' % (value, value / 2.54)) 100 | else: 101 | print('請輸入有效的單位') 102 | ``` 103 | 104 | #### 練習2:百分制成績轉換為等級製成績。 105 | 106 | > **要求**:如果輸入的成績在90分以上(含90分)輸出A;80分-90分(不含90分)輸出B;70分-80分(不含80分)輸出C;60分-70分(不含70分)輸出D;60分以下輸出E。 107 | 108 | 參考答案: 109 | 110 | ```Python 111 | """ 112 | 百分制成績轉換為等級製成績 113 | 114 | Version: 0.1 115 | Author: 駱昊 116 | """ 117 | score = float(input('請輸入成績: ')) 118 | if score >= 90: 119 | grade = 'A' 120 | elif score >= 80: 121 | grade = 'B' 122 | elif score >= 70: 123 | grade = 'C' 124 | elif score >= 60: 125 | grade = 'D' 126 | else: 127 | grade = 'E' 128 | print('對應的等級是:', grade) 129 | ``` 130 | #### 練習3:輸入三條邊長,如果能構成三角形就計算周長和麵積。 131 | 132 | 參考答案: 133 | 134 | ```Python 135 | """ 136 | 判斷輸入的邊長能否構成三角形,如果能則計算出三角形的周長和麵積 137 | 138 | Version: 0.1 139 | Author: 駱昊 140 | """ 141 | a = float(input('a = ')) 142 | b = float(input('b = ')) 143 | c = float(input('c = ')) 144 | if a + b > c and a + c > b and b + c > a: 145 | print('周長: %f' % (a + b + c)) 146 | p = (a + b + c) / 2 147 | area = (p * (p - a) * (p - b) * (p - c)) ** 0.5 148 | print('面積: %f' % (area)) 149 | else: 150 | print('不能構成三角形') 151 | ``` 152 | > **說明:** 上面使用的透過邊長計算三角形面積的公式叫做[海倫公式](https://zh.wikipedia.org/zh-hans/海倫公式)。 153 | 154 | -------------------------------------------------------------------------------- /番外篇/Python编程惯例.md: -------------------------------------------------------------------------------- 1 | ## Python程式設計慣例 2 | 3 | “慣例”這個詞指的是“習慣的做法,常規的辦法,一貫的做法”,與這個詞對應的英文單詞叫“idiom”。由於Python跟其他很多程式語言在語法和使用上還是有比較顯著的差別,因此作為一個Python開發者如果不能掌握這些慣例,就無法寫出“Pythonic”的程式碼。下面我們總結了一些在Python開發中的慣用的程式碼。 4 | 5 | 1. 讓程式碼既可以被匯入又可以被執行。 6 | 7 | ```Python 8 | if __name__ == '__main__': 9 | ``` 10 | 11 | 12 | 2. 用下面的方式判斷邏輯“真”或“假”。 13 | 14 | ```Python 15 | if x: 16 | if not x: 17 | ``` 18 | 19 | **好**的程式碼: 20 | 21 | ```Python 22 | name = 'jackfrued' 23 | fruits = ['apple', 'orange', 'grape'] 24 | owners = {'1001': '駱昊', '1002': '王大錘'} 25 | if name and fruits and owners: 26 | print('I love fruits!') 27 | ``` 28 | 29 | **不好**的程式碼: 30 | 31 | ```Python 32 | name = 'jackfrued' 33 | fruits = ['apple', 'orange', 'grape'] 34 | owners = {'1001': '駱昊', '1002': '王大錘'} 35 | if name != '' and len(fruits) > 0 and owners != {}: 36 | print('I love fruits!') 37 | ``` 38 | 39 | 3. 善於使用in運算子。 40 | 41 | ```Python 42 | if x in items: # 包含 43 | for x in items: # 迭代 44 | ``` 45 | 46 | **好**的程式碼: 47 | 48 | ```Python 49 | name = 'Hao LUO' 50 | if 'L' in name: 51 | print('The name has an L in it.') 52 | ``` 53 | 54 | **不好**的程式碼: 55 | 56 | ```Python 57 | name = 'Hao LUO' 58 | if name.find('L') != -1: 59 | print('This name has an L in it!') 60 | ``` 61 | 62 | 4. 不使用臨時變數交換兩個值。 63 | 64 | ```Python 65 | a, b = b, a 66 | ``` 67 | 68 | 5. 用序列構建字串。 69 | 70 | **好**的程式碼: 71 | 72 | ```Python 73 | chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd'] 74 | name = ''.join(chars) 75 | print(name) # jackfrued 76 | ``` 77 | 78 | **不好**的程式碼: 79 | 80 | ```Python 81 | chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd'] 82 | name = '' 83 | for char in chars: 84 | name += char 85 | print(name) # jackfrued 86 | ``` 87 | 88 | 6. EAFP優於LBYL。 89 | 90 | EAFP - **E**asier to **A**sk **F**orgiveness than **P**ermission. 91 | 92 | LBYL - **L**ook **B**efore **Y**ou **L**eap. 93 | 94 | **好**的程式碼: 95 | 96 | ```Python 97 | d = {'x': '5'} 98 | try: 99 | value = int(d['x']) 100 | print(value) 101 | except (KeyError, TypeError, ValueError): 102 | value = None 103 | ``` 104 | 105 | **不好**的程式碼: 106 | 107 | ```Python 108 | d = {'x': '5'} 109 | if 'x' in d and isinstance(d['x'], str) \ 110 | and d['x'].isdigit(): 111 | value = int(d['x']) 112 | print(value) 113 | else: 114 | value = None 115 | ``` 116 | 117 | 7. 使用enumerate進行迭代。 118 | 119 | **好**的程式碼: 120 | 121 | ```Python 122 | fruits = ['orange', 'grape', 'pitaya', 'blueberry'] 123 | for index, fruit in enumerate(fruits): 124 | print(index, ':', fruit) 125 | ``` 126 | 127 | **不好**的程式碼: 128 | 129 | ```Python 130 | fruits = ['orange', 'grape', 'pitaya', 'blueberry'] 131 | index = 0 132 | for fruit in fruits: 133 | print(index, ':', fruit) 134 | index += 1 135 | ``` 136 | 137 | 8. 用生成式生成列表。 138 | 139 | **好**的程式碼: 140 | 141 | ```Python 142 | data = [7, 20, 3, 15, 11] 143 | result = [num * 3 for num in data if num > 10] 144 | print(result) # [60, 45, 33] 145 | ``` 146 | 147 | **不好**的程式碼: 148 | 149 | ```Python 150 | data = [7, 20, 3, 15, 11] 151 | result = [] 152 | for i in data: 153 | if i > 10: 154 | result.append(i * 3) 155 | print(result) # [60, 45, 33] 156 | ``` 157 | 158 | 9. 用zip組合鍵和值來建立字典。 159 | 160 | **好**的程式碼: 161 | 162 | ```Python 163 | keys = ['1001', '1002', '1003'] 164 | values = ['駱昊', '王大錘', '白元芳'] 165 | d = dict(zip(keys, values)) 166 | print(d) 167 | ``` 168 | 169 | **不好**的程式碼: 170 | 171 | ```Python 172 | keys = ['1001', '1002', '1003'] 173 | values = ['駱昊', '王大錘', '白元芳'] 174 | d = {} 175 | for i, key in enumerate(keys): 176 | d[key] = values[i] 177 | print(d) 178 | ``` 179 | 180 | > **說明**:這篇文章的內容來自於網路,有興趣的讀者可以閱讀[原文](http://safehammad.com/downloads/python-idioms-2014-01-16.pdf)。 181 | 182 | -------------------------------------------------------------------------------- /Day21-30/code/new/web1901/example_of_bootstrap.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |
11 |
12 | 140x140 13 |
14 |
15 |

16 | h3. 这是一套可视化布局系统. 17 |

18 |
19 |
20 |
21 |
22 | 52 |
53 |
54 |
55 |
56 | 105 |
106 |
107 |
108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Day01-15/05.构造程序逻辑.md: -------------------------------------------------------------------------------- 1 | ## 構造程式邏輯 2 | 3 | 學完前面的幾個章節後,我覺得有必要在這裡帶大家做一些練習來鞏固之前所學的知識,雖然迄今為止我們學習的內容只是Python的冰山一角,但是這些內容已經足夠我們來構建程式中的邏輯。對於程式語言的初學者來說,在學習了Python的核心語言元素(變數、型別、運算子、表示式、分支結構、迴圈結構等)之後,必須做的一件事情就是嘗試用所學知識去解決現實中的問題,換句話說就是鍛鍊自己把用人類自然語言描述的演算法(解決問題的方法和步驟)翻譯成Python程式碼的能力,而這件事情必須透過大量的練習才能達成。 4 | 5 | 我們在本章為大家整理了一些經典的案例和習題,希望透過這些例子,一方面幫助大家鞏固之前所學的Python知識,另一方面幫助大家瞭解如何建立程式中的邏輯以及如何運用一些簡單的演算法解決現實中的問題。 6 | 7 | ### 經典的例子 8 | 9 | 1. 尋找**水仙花數**。 10 | 11 | > **說明**:水仙花數也被稱為超完全數字不變數、自戀數、自冪數、阿姆斯特朗數,它是一個3位數,該數字每個位上數字的立方之和正好等於它本身,例如:$1^3 + 5^3+ 3^3=153$。 12 | 13 | ```Python 14 | """ 15 | 找出所有水仙花數 16 | 17 | Version: 0.1 18 | Author: 駱昊 19 | """ 20 | 21 | for num in range(100, 1000): 22 | low = num % 10 23 | mid = num // 10 % 10 24 | high = num // 100 25 | if num == low ** 3 + mid ** 3 + high ** 3: 26 | print(num) 27 | ``` 28 | 29 | 在上面的程式碼中,我們透過整除和求模運算分別找出了一個三位數的個位、十位和百位,這種小技巧在實際開發中還是常用的。用類似的方法,我們還可以實現將一個正整數反轉,例如:將12345變成54321,程式碼如下所示。 30 | 31 | ```Python 32 | """ 33 | 正整數的反轉 34 | 35 | Version: 0.1 36 | Author: 駱昊 37 | """ 38 | 39 | num = int(input('num = ')) 40 | reversed_num = 0 41 | while num > 0: 42 | reversed_num = reversed_num * 10 + num % 10 43 | num //= 10 44 | print(reversed_num) 45 | ``` 46 | 47 | 2. **百錢百雞**問題。 48 | 49 | > **說明**:百錢百雞是我國古代數學家[張丘建](https://baike.baidu.com/item/%E5%BC%A0%E4%B8%98%E5%BB%BA/10246238)在《算經》一書中提出的數學問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?翻譯成現代文是:公雞5元一隻,母雞3元一隻,小雞1元三隻,用100塊錢買一百隻雞,問公雞、母雞、小雞各有多少隻? 50 | 51 | ```Python 52 | """ 53 | 《百錢百雞》問題 54 | 55 | Version: 0.1 56 | Author: 駱昊 57 | """ 58 | 59 | for x in range(0, 20): 60 | for y in range(0, 33): 61 | z = 100 - x - y 62 | if 5 * x + 3 * y + z / 3 == 100: 63 | print('公雞: %d只, 母雞: %d只, 小雞: %d只' % (x, y, z)) 64 | ``` 65 | 66 | 上面使用的方法叫做**窮舉法**,也稱為**暴力搜尋法**,這種方法透過一項一項的列舉備選解決方案中所有可能的候選項並檢查每個候選項是否符合問題的描述,最終得到問題的解。這種方法看起來比較笨拙,但對於運算能力非常強大的計算機來說,通常都是一個可行的甚至是不錯的選擇,而且問題的解如果存在,這種方法一定能夠找到它。 67 | 68 | 3. **CRAPS賭博遊戲**。 69 | 70 | > **說明**:CRAPS又稱花旗骰,是美國拉斯維加斯非常受歡迎的一種的桌上賭博遊戲。該遊戲使用兩粒骰子,玩家透過搖兩粒骰子獲得點數進行遊戲。簡單的規則是:玩家第一次搖骰子如果搖出了7點或11點,玩家勝;玩家第一次如果搖出2點、3點或12點,莊家勝;其他點數玩家繼續搖骰子,如果玩家搖出了7點,莊家勝;如果玩家搖出了第一次搖的點數,玩家勝;其他點數,玩家繼續要骰子,直到分出勝負。 71 | 72 | ```Python 73 | """ 74 | Craps賭博遊戲 75 | 我們設定玩家開始遊戲時有1000元的賭注 76 | 遊戲結束的條件是玩家輸光所有的賭注 77 | 78 | Version: 0.1 79 | Author: 駱昊 80 | """ 81 | from random import randint 82 | 83 | money = 1000 84 | while money > 0: 85 | print('你的總資產為:', money) 86 | needs_go_on = False 87 | while True: 88 | debt = int(input('請下注: ')) 89 | if 0 < debt <= money: 90 | break 91 | first = randint(1, 6) + randint(1, 6) 92 | print('玩家搖出了%d點' % first) 93 | if first == 7 or first == 11: 94 | print('玩家勝!') 95 | money += debt 96 | elif first == 2 or first == 3 or first == 12: 97 | print('莊家勝!') 98 | money -= debt 99 | else: 100 | needs_go_on = True 101 | while needs_go_on: 102 | needs_go_on = False 103 | current = randint(1, 6) + randint(1, 6) 104 | print('玩家搖出了%d點' % current) 105 | if current == 7: 106 | print('莊家勝') 107 | money -= debt 108 | elif current == first: 109 | print('玩家勝') 110 | money += debt 111 | else: 112 | needs_go_on = True 113 | print('你破產了, 遊戲結束!') 114 | ``` 115 | 116 | ###有用的練習 117 | 118 | 1. 生成**斐波那契數列**的前20個數。 119 | 120 | > **說明**:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,是義大利數學家萊昂納多·斐波那契(Leonardoda Fibonacci)在《計算之書》中提出一個在理想假設條件下兔子成長率的問題而引入的數列,所以這個數列也被戲稱為"兔子數列"。斐波那契數列的特點是數列的前兩個數都是1,從第三個數開始,每個數都是它前面兩個數的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。斐波那契數列在現代物理、準晶體結構、化學等領域都有直接的應用。 121 | 122 | 2. 找出10000以內的**完美數**。 123 | 124 | > **說明**:完美數又稱為完全數或完備數,它的所有的真因子(即除了自身以外的因子)的和(即因子函式)恰好等於它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美數。完美數有很多神奇的特性,有興趣的可以自行了解。 125 | 126 | 3. 輸出**100以內所有的素數**。 127 | 128 | > **說明**:素數指的是隻能被1和自身整除的正整數(不包括1)。 129 | 130 | 上面練習的參考答案在本章對應的程式碼目錄中,如果需要幫助請讀者自行檢視參考答案。 -------------------------------------------------------------------------------- /Day66-80/78.方差分析和参数估计.md: -------------------------------------------------------------------------------- 1 | ## 方差分析和引數估計 2 | 3 | ### 方差分析 4 | 5 | #### 基本概念 6 | 7 | 在產品運營中,我們會遇到各種需要評估運營效果的場景,包括促活的活動是否起到作用、A/B 測試的策略有無成效等等。具體例如,產品升級前的平均 DAU 是 155 萬,產品升級後的平均 DAU 是 157 萬,那麼如何判斷 DAU 提升的 2 萬是正常的波動,還是升級帶來的效果呢?對比同一組資料在實施某些策略前後的資料變化,判斷資料波動是不是某一因素導致的,這種方法我們稱之為方差分析。方差分析通常縮寫為 ANOVA(Analysis of Variance),也叫“F 檢驗”,用於兩個及兩個以上分組樣本的差異性檢驗。簡單的說,**分析差異的顯著性是否明顯的方法就是方差分析**。 8 | 9 | 舉一個例子,如果我們需要分析優惠券的金額對使用者的購買轉化率是否能起到有效作用,我們可以將資料分成以下三個組: 10 | 11 | 12 | 13 | 使用者購買行為是隨機的,購買率很高的不會很多,購買率極低的也不會很多,絕大部分使用者的購買率都集中在某個值附近,這個值我們叫作整體購買率的平均值。如果每個客群分組自身的購買率均值與這個整體購買率平均值不一致,就會出現以下兩種情況。 14 | 15 | 1. 第一種情況 16 | 17 | 藍色分組的購買率平均值(藍色線)比整體平均值(黑色線)要高,有可能是最右邊那個很高的購買率把分組的均值抬升的,同時藍色分組的資料分佈很散(方差大),此時不能有十足把握說明該組使用者的購買轉化率很高。 18 | 19 | 20 | 21 | 2. 第二種情況 22 | 23 | 綠色分組的購買率平均值(綠色線)比整體平均值(黑色線)要高,但是綠色分組的資料非常集中,都集中在分組的平均值(綠色線)附近,此時我們可以認為該組的轉化率平均值與整體有明顯區別。 24 | 25 | 26 | 27 | 為了更好表述上面的問題,我們可以引入“組內方差”的概念,即描述每個分組內部資料分佈的離散情況。如下圖所示,對於上面藍色和綠色分組的“組內方差”,顯然藍色的組內方差更大,綠色的組內方差更小。 28 | 29 | 30 | 31 | 綜上所述,如果上面三個分組的使用者購買率平均值不在中線(整體購買率)左右,而是有明顯的偏高或偏低,並且該組內的每個轉化率都緊緊圍繞在該組購買率平均值的附近(即組內方差很小)。那麼我們就可以斷定:該組的購買率與整體不一致,是該組對應優惠金額的影響造成的。 32 | 33 | #### 定量分析 34 | 35 | 如果要進行定量分析,可以使用 F 檢驗值和 F crit 臨界值這兩個指標。F 檢驗值用來精確表達這幾組差異大小的,F crit臨界值是一個判斷基線: 36 | 37 | - 當 F > F crit,這幾組之間的差異超過判斷基準了,認為不同優惠金額的分組間的購買率是不一樣的,優惠金額這個因素會對購買率產生影響,也就是說透過運營優惠金額這個抓手,是可以提升使用者購買轉化率的; 38 | - 當 F < F crit,則認為不同優惠金額的分組間的購買率是一樣的,優惠金額這個因素不會對購買率產生影響,也就是說需要繼續尋找其他與購買轉化率有關的抓手。 39 | 40 | 41 | 42 | > **說明**:圖中 SS 代表方差、df 代表指標自由度、MS 是均方差、P-value 是差異的顯著性水平。 43 | 44 | 上圖是用 Excel 得出的 A、B、C 三組的方差分析結果,如圖所示 F < F crit,所以從定量分析角度,可以判定優惠金額不會對購買率產生影響。 45 | 46 | #### 實施方法 47 | 48 | 實施方差分析可以分為以下三步走: 49 | 50 | 1. 判斷樣本是否滿足“方差分析”的前提條件 51 | 52 | - 每個分組中的每個值都必須來自同一個總體樣本; 53 | - 方差分析只能分析滿足正態分佈的指標,事實上,在產品運營中大部分指標都是正態分佈,例如: 54 | - 幾乎所有的轉化率都滿足正態分佈:購買率、點選率、轉化率、活躍率、留存率、復購率等。 55 | - 幾乎所有的業務量都滿足正態分佈:客單價、每日新增使用者數、渠道引流的流量等。 56 | - 幾乎所有的使用者畫像指標都滿足正態分佈:年齡、城市、登入次數、使用時長等。 57 | - 分析的樣本必須是隨機抽樣 58 | 59 | 2. 計算 F 檢驗值和 F crit 臨界值 60 | 61 | 3. 如果有差異,需要評估差異大小 62 | 63 | 我們用一個新的指標來表示:$ R^2=SSA / SST $,其中 $ R^2 $ 表示差異大小,$ SSA $ 是組間誤差平方和,$ SST $ 是總誤差平方和。 64 | 65 | - 當 $ R^2 \gt 0.5 $,認為各個分組間的差異非常顯著; 66 | - 當 $ R^2 $ 在 $ [0.1, 0.5] $ 之間時,認為各個分組間的差異一般顯著; 67 | - 當 $ R^2 \lt 0.1 $ 時,認為各個分組間的差異微弱顯著。 68 | 69 | > **練習**:開啟“方差分析練習.xlsx”檔案,完成練習1。 70 | 71 | #### 多因素方差分析 72 | 73 | 上面的案例是針對一種策略來分析效果。我們把這種形式的方差分析叫作單因素方差分析,實際工作中,我們可能需要研究多種策略(例如運營中的渠道、活動、客群等)對結果的影響,我們稱之為多因素方差分析。例如我們會在多個運營渠道上安排多種運營活動,評價各個渠道的轉化率。此時,影響轉化率的因素有渠道和活動兩個因素,我們可以使用“無重複雙因素方差分析”來檢查資料。 74 | 75 | 76 | 77 | 78 | 79 | #### 應用場景 80 | 81 | 工作中遇到以下兩類場景就可以使用方差分析: 82 | 83 | 1. 同一個客群在實施某個策略前後的指標對比。 84 | 2. 兩個或多個客群對比同一指標,評估同一指標在不同客群上的差異。 85 | 86 | 87 | 88 | ### 引數估計 89 | 90 | 在產品運營的工作中,資料分析常會遭遇諸多非常讓人困擾的情況,例如:產品運營面對的資料量動輒百萬級、千萬級,帶來的就是分析速度急劇下降,跑個數等一兩天時間已經是很理想情況;另外,在很多場景下,我們都只能拿到部分資料(樣本),而無法獲取全量資料(總體)。在這種情況下我們就必須透過分析非常小量樣本的特徵,再用這些特徵去評估海量總體資料的特徵,可以稱之為**樣本檢驗**。 91 | 92 | **推斷型統計的核心就是用樣本推測總體**。在實際生產環境中,可能無法獲得所有的資料,或者即便獲取了所有的資料,但是沒有足夠的資源來分析所有的資料,在這種情況下,我們都需要用非常小量的樣本特徵去評估總體資料的特徵,這其中的一項工作就是引數估計。 93 | 94 | 引數估計應用的場景非常的多,例如: 95 | 96 | 1. 在產品側,我們可以用引數估計的方式評估A/B測試的效果。 97 | 2. 在運營側,我們可以用引數估計的方式最佳化活動配置和推薦策略。 98 | 3. 在市場側,我們可以用引數估計的方式制定廣告投放策略。 99 | 100 | #### 實施步驟 101 | 102 | 1. 確定分析的置信水平 103 | 104 | 2. 確定估計的引數型別 105 | 106 | 3. 計算引數估計的區間 107 | 108 | - 數值型指標:$ A = z \times 樣本標準差 / \sqrt{樣本數量} $,其中 $ z $ 的值可以透過查表得到,如果置信水平選擇95%,那麼 $ z $ 的值就是1.96。大部分運營指標都是數值型指標,例如DAU、ARPU、轉化率等。 109 | - 佔比型指標:$ A = z \times \sqrt{佔比 \times (1 - 佔比) / 樣本數量} $,$ z $ 值同上。佔比型指標如性別佔比、渠道佔比、品類佔比等。 110 | 111 | 最終得到的估計區間就是:$ [樣本均值 - A, 樣本均值 + A] $。 112 | 113 | -------------------------------------------------------------------------------- /Day21-30/code/垃圾分类查询/index.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 垃圾分类查询助手 12 | 18 | 19 | 61 | 62 | 63 | 64 |
65 | 72 |
73 | 74 |

没有对应的查询结果

75 |
76 |

77 | 78 | 79 |    80 | 81 | {{ result.name }} 82 |    83 | (预测结果) 84 |

85 |

说明:{{ result.explain }}

86 |
87 |
88 |
89 | 90 | 91 | 119 | 120 | -------------------------------------------------------------------------------- /Day91-100/96.软件测试和自动化测试.md: -------------------------------------------------------------------------------- 1 | ## 軟體測試和自動化測試 2 | 3 | ### 軟體測試概述 4 | 5 | 軟體測試是一種用來促進鑑定軟體的正確性、完整性、安全性和品質的過程,也就是在規定的條件下對程式進行操作以發現程式中的錯誤,衡量軟體的品質並對其是否能滿足設計要求進行評估的過程。 6 | 7 | #### 測試的方法 8 | 9 | 黑盒測試:測試應用程式的功能,而不是其內部結構或運作。測試者不需具備應用程式的程式碼、內部結構和程式語言的專門知識。測試者只需知道什麼是系統應該做的事,即當鍵入一個特定的輸入,可得到一定的輸出。測試案例是依應用系統應該做的功能,照規範、規格或要求等設計。測試者選擇有效輸入和無效輸入來驗證是否正確的輸出。此測試方法可適合大部分的軟體測試,例如整合測試和系統測試。 10 | 11 | 白盒測試:測試應用程式的內部結構或運作,而不是測試應用程式的功能(即黑箱測試)。在白箱測試時,以程式語言的角度來設計測試案例。測試者輸入資料驗證資料流在程式中的流動路徑,並確定適當的輸出,類似測試電路中的節點。 12 | 13 | 由於時間和成本的約束,軟體測試中一個最為關鍵的問題就是:“**在所有可能的測試用例中,哪個子集能發現最多的錯誤?**”。所以在設計測試用例時,白盒測試看重程式邏輯覆蓋的程度(語句覆蓋、條件覆蓋、分支覆蓋),黑盒測試可以使用等價類劃分、邊界值分析、因果圖分析、錯誤猜測等方法來設計測試用例。 14 | 15 | #### 測試的種類(階段) 16 | 17 | 單元測試:對軟體組成單元進行測試,其目的是檢驗軟體基本組成單位的正確性,測試的物件是軟體設計的最小單位 - 函式。 18 | 19 | 整合測試:將程式模組採用適當的整合策略組裝起來,對系統的介面及整合後的功能進行正確性檢測的測試工作。其主要目的是檢查軟體單位之間的介面是否正確,整合測試的物件是已經經過單元測試的模組。 20 | 21 | 系統測試:系統測試主要包括功能測試、介面測試、可靠性測試、易用性測試、效能測試。  22 | 23 | 迴歸測試:為了檢測程式碼修改而引入的錯誤所進行的測試活動。迴歸測試是軟體維護階段的重要工作,有研究表明,迴歸測試帶來的耗費佔軟體生命週期的1/3總費用以上。 24 | 25 | #### 測試驅動開發(敏捷測試) 26 | 27 | 測試驅動開發包括以下三個步驟: 28 | 29 | 1. 為未實現的新功能或者改進編寫自動化測試。 30 | 2. 提供透過所有定義的測試的最小程式碼量。 31 | 3. 重構程式碼以滿足所需的質量標準。 32 | 33 | 測試驅動開發的好處在於可以有效的防止軟體迴歸以及提供更有質量的程式碼。還有就是驗收測試應該由客戶來進行,客戶透過對使用場景來設計驗收測試,對應用程式是否滿足他們的要求進行客觀、公正的確認。能夠透過單元測試、甚至是系統測試的功能未必能夠透過客戶的驗收測試。 34 | 35 | #### 網際網路應用和移動應用的測試 36 | 37 | 網際網路應用的測試策略: 38 | 39 | 1. 表示層測試(內容測試、站點結構測試、使用者環境(瀏覽器、作業系統等)) 40 | 2. 業務層測試(效能、資料驗證、事務、外部服務) 41 | 3. 持久層測試(響應時間、資料完整性、容錯性) 42 | 43 | 移動應用的測試策略: 44 | 45 | 1. 真機測試 46 | 2. 基於模擬器的測試 47 | 48 | ### 單元(模組)測試 49 | 50 | Python的標準庫裡有為編寫單元測試而準備的unittest模組,執行測試時建議使用[pytest](https://docs.pytest.org/en/latest/)或nose2。pytest是一款能夠自動搜尋並執行測試的測試執行工具,並且會輸出詳細的錯誤報告。關於單元測試可以看看[《Python必會的單元測試框架 - unittest》](https://blog.csdn.net/huilan_same/article/details/52944782)。 51 | 52 | 53 | 54 | 可以安裝[testfixtures](https://pypi.org/project/testfixtures/)庫來輔助單元測試,它整合了多種典型配置器,提供了生成目錄、更改系統日期、生成mock物件的功能模組,這些模組能夠幫助我們將單元測試與單元測試所依賴的環境分離開。[mock](https://pypi.org/project/mock/) 是將測試物件所依賴的物件替換為虛擬物件的庫,在測試的時候,我們可以為虛擬物件指定其在被呼叫時的返回值以及是否發生異常等。 55 | 56 | tox能便捷地為我們準備好執行測試所需的環境。tox會在多個virtualenv環境中搭建測試 環境,然後在這些環境中執行測試並顯示結果。它能夠把測試工具的選項及環境變數等內容統 一起來,所以我們只需執行tox命令即能輕鬆完成所需的測試。 57 | 58 | ### 自動化測試 59 | 60 | #### UI自動化測試 61 | 62 | ##### 桌面端 - [PyAutoGui]() 63 | 64 | 65 | 66 | ##### 移動端 - [Appnium]() 67 | 68 | 69 | 70 | ##### Web端 - [Selenium]() 71 | 72 | Selenium是實現Web應用程式的功能測試以及整合測試自動化的瀏覽器驅動測試工具群。和使用瀏覽器的使用者相同,Selenium可以在瀏覽器進行的滑鼠操作、在表單中輸入文字、驗證表單的值等,利用這一點就可以將手動操作變成自動化操作。 73 | 74 | 1. Selenium優點 75 | 76 | - 自動化測試用例製作簡單。Selenium提供了Selenium IDE工具,該工具可以捕獲滑鼠、鍵盤的操作,然後透過重放功能來重複這些操作,這樣就可以簡單的製作測試用例。 77 | - 支援多種瀏覽器和作業系統。 78 | 79 | 2. Selenium的元件 80 | 81 | - [Selenium IDE](https://www.seleniumhq.org/projects/ide/) 82 | - [Selenium Remote Control](https://www.seleniumhq.org/projects/remote-control/) 83 | - [Selenium WebDriver](https://www.seleniumhq.org/projects/webdriver/) 84 | 85 | 3. 與持續整合工具協作 86 | 87 | 持續整合指的是頻繁的將程式碼整合到主幹。它的好處主要有兩個: 88 | 89 | - 快速發現錯誤。每完成一點更新,就整合到主幹,可以快速發現錯誤,定位錯誤也比較容易。 90 | - 防止分支大幅偏離主幹。如果不是經常整合,主幹又在不斷更新,會導致以後整合的難度變大,甚至難以整合。 91 | 92 | 持續整合的目的,就是讓產品可以快速迭代,同時還能保持高質量。它的核心措施是程式碼整合到主幹之前,必須透過自動化測試,只要有一個測試用例失敗,就不能整合。程式設計大師Martin Fowler曾經說過:“持續整合並不能消除Bug,而是讓它們非常容易發現和改正。” 93 | 94 | 可以在Jenkins中安裝“Seleniumhq Plugin”外掛,這樣就可以將Selenium IDE製作的測試用例儲存為HTML格式並提供給Jenkins來使用,基本步驟是: 95 | 96 | - 在執行測試的機器上,從版本控制系統中下載測試套件和測試用例。 97 | 98 | - 在執行測試的機器上下載Selenium Server。 99 | 100 | - 從Jenkins的“系統管理”中選擇“外掛管理”來安裝“Seleniumhq Plugin”。 101 | 102 | - 在Jenkins的“系統管理”中選擇“系統設定”並配置“Selenium Remote Control”下的“HTMLSuite Runner”。 103 | 104 | - 新建測試用的Jenkins任務並進行配置,配置的內容包括:瀏覽器、起始URL、測試套件和測試結果輸出檔案。 105 | 106 | 配置完成後,就可以執行Jenkins的“立即構建”了。 107 | 108 | 除了Selenium之外,[WebTest](https://pypi.org/project/WebTest/)、[Splinter]()和[RobotFramework]()也是Web端測試的選擇,其中WebTest可以對WSGI應用執行模擬請求並獲取結果,基本上所有WSGI應用的測試都可以用它;Splinter是對Selenium的二次封裝,使用上更加方便簡單。 109 | 110 | #### 介面測試自動化測試 111 | 112 | 1. [requests]() 113 | 2. [HttpRunner]() 114 | 3. [PyRestTest]() 115 | 116 | #### 其他方面的自動化測試 117 | 118 | 1. [Locust]() 119 | 120 | 2. [pythem]() 121 | 122 | ### 測試相關工具 123 | 124 | 1. PostMan 125 | 2. AB 126 | 3. JMeter 127 | 4. LoadRunner 128 | 5. Benchmark Factory 129 | 6. WAS 130 | 131 | 132 | -------------------------------------------------------------------------------- /番外篇/英语面试.md: -------------------------------------------------------------------------------- 1 | ## 英語面試 2 | 3 | 以下用I表示面試官(Interviewer),用C表示面試者(Candidate)。 4 | 5 | ### 開場寒暄 6 | 7 | 1. I: Thanks for waiting. (Please follow me.) 8 | 9 | C: It's no problem. 10 | 11 | 2. I: How are you doing this morning? 12 | 13 | C: I'm great. / I'm doing fine. Thank you. / How about you? 14 | 15 | 3. I: How did you get here? 16 | 17 | C: I took the subway here. / I drove here. 18 | 19 | 4. I: Glad to meet you. 20 | 21 | C: Glad to meet you. / It's great to finally meet you in person. (之前電話溝透過的) 22 | 23 | ### 正式面試 24 | 25 | #### 人力面試 26 | 27 | 1. I: Can you tell me a little bit about yourself? (介紹下自己) 28 | 29 | 原則:不要談私生活和奇怪的癖好(王者榮耀打到星耀並不值得在這裡說),因為別人更想知道的是你的專業技能(qulifications)和工作經驗(experience),所以重點在你之前的公司(company name)、職位(title)、時間(years)和主要職責(major responsibilities) 30 | 31 | C: Thank you for having me. My name is Dachui WANG. I'm 22 years old, and I'm single. I have a Bachelor's Degree of Computer Science from Tsinghua University. I was a Junior Java Programmer for ABC Technologies during my college life. Then I become an intermediate Java engineer for XYZ Corporation in last two years. Programming is my everyday life and programming is where my passion is. I think I have a good knowledge of Java enterprise application developement using light-weight frameworks like Spring, Guice, Hibernate and other open source middle-ware like Dubbo, Mycat, rocketmq and so on and so forth. I love reading, travelling and playing basketball in my spare time. That's all! Thank you! 32 | 33 | 2. I: How would you describe your personality? (你的性格) 34 | 35 | C: I'm hard working, eager to learn, and very serious about my work. I enjoy working with other people and I love challenges. 36 | 37 | 3. I: What do you know about our company? (你對我們公司有什麼瞭解) 38 | 39 | (需要做功課,瞭解公司的狀況和企業文化,該公司在這個行業中的一個狀況,有什麼核心業務,主要的競爭對手有哪些) 40 | 41 | C: The one thing that I like the most about our company is your core values. I think they're very important in this industry because …(自由發揮的部分)... I personally really believe in the cause as well. Of course, I'm very interested in your products such as …(功課部分)… and the techniques behind them. 42 | 43 | 4. I: Why are you leaving your last job? (為什麼離職) 44 | 45 | C: I want to advance my career and I think this job offers more challenges and opportunities for me do to that. 46 | 47 | 5. I: What do you see yourself in 3 or 5 years? (3-5年職業規劃) 48 | 49 | C: My long term goals involve growing with the company, where I can continue to learn, to take on additional responsibilities and to contribute as much value as I can. I intend to take advantage of all of these. 50 | 51 | 6. I: What's your salary expectation? (期望薪資) 52 | 53 | C: My salary expectation is in line with my experience and qualifications. I believe our company will pay me and every other employee fairly. (把球踢給對方先看看對方報價是多少,如果對方非要你報價再說後面的內容) I think 15 thousands RMB or above is fitting for me to leave in Chengdu. 54 | 55 | 7. I: Do you have any questions for me? (問面試官的問題) 56 | 57 | C: What's the growth potential for this position? 58 | 59 | 60 | #### 技術面試 61 | 62 | 1. I: What's difference between an interface and an abstract class? 63 | 2. I: What are pass by reference and pass by value? 64 | 3. I: What's the difference between process and threads? 65 | 4. I: Explain the available thread state in high-level. 66 | 5. I: What's deadlocks? How to avoid them? 67 | 6. I: How HashMap works in Java? 68 | 7. I: What's the difference between ArrayList and LinkedList? (類似的問題還有很多,比如比較HashSet和TreeSet、HashMap和Hashtable) 69 | 8. I: Tell me what you know about garbage collection in Java. 70 | 9. I: What're two types of exceptions in Java? 71 | 10. I: What's the advantage of PreparedStatement over Statement? 72 | 11. I: What's the use of CallableStatement? 73 | 12. I: What does connection pool mean? 74 | 13. I: Explain the life cycle of a Servlet. 75 | 14. I: What's the difference between redirect and forward? 76 | 15. I: What's EL? What're implicit objects of EL? 77 | 16. I: Tell me what you know about Spring framework and its benefits. 78 | 17. I: What're different types of dependency injection. 79 | 18. I: Are singleton beans thread safe in Spring framework? 80 | 19. I: What're the benefits of Spring framework's transaction management? 81 | 20. I: Explain what's AOP. 82 | 21. I: What's a proxy and how to implement proxy pattern? 83 | 22. I: How Spring MVC works? 84 | 23. I: What's the working scenario of Hibernate and MyBatis? 85 | 24. I: How to implement SOA? 86 | 25. I: Make a brief introduction of the projects you are involved before? 87 | 88 | 89 | 上面主要是面試Java程式設計師的問題,但是整個流程大致如此。 90 | -------------------------------------------------------------------------------- /番外篇/玩转PyCharm.md: -------------------------------------------------------------------------------- 1 | ## 玩轉PyCharm 2 | 3 | PyCharm是由JetBrains公司開發的提供給Python專業的開發者的一個整合開發環境,它最大的優點是能夠大大提升Python開發者的工作效率,為開發者集成了很多用起來非常順手的功能,包括程式碼除錯、高亮語法、程式碼跳轉、智慧提示、自動補全、單元測試、版本控制等等。此外,PyCharm還提供了對一些高階功能的支援,包括支援基於Django框架的Web開發。 4 | 5 | ### PyCharm的下載和安裝 6 | 7 | 可以在[JetBrains公司的官方網站]()找到PyCharm的[下載連結](https://www.jetbrains.com/pycharm/download/),有兩個可供下載的版本,一個是社群版(PyCharm CE),一個是專業版(PyCharm Professional)。社群版在Apache許可證下發布,可以免費使用;專業版在專用許可證下發布,需要購買授權後才能使用,但新使用者可以試用30天。很顯然,專業版提供了更為強大的功能和對企業級開發的各種支援,但是對於初學者來說,社群版已經足夠強大和好用了。安裝PyCharm只需要直接執行下載的安裝程式,然後持續的點選“Next”(下一步)按鈕就可以啦。下面是我在Windows系統下安裝PyCharm的截圖,安裝完成後點選“Finish”(結束)按鈕關閉安裝嚮導,然後可以透過雙擊桌面的快捷方式來執行PyCharm。 8 | 9 | ![](res/pycharm-installation.png) 10 | 11 | ### 首次使用的設定 12 | 13 | 第一次使用PyCharm時,會有一個匯入設定的嚮導,如果之前沒有使用PyCharm或者沒有儲存過設定的就直接選擇“Do not import settings”進入下一步即可,下面是我在macOS系統下第一次使用PyCharm時的截圖。 14 | 15 | ![](res/pycharm-import-settings.png) 16 | 17 | 專業版的PyCharm是需要啟用的,**強烈建議大家在條件允許的情況下支付費用來支援優秀的產品**,如果不用做商業用途或者不需要使用PyCharm的高階功能,我們可以暫時選擇試用30天或者使用社群版的PyCharm。如果你是一名學生,希望購買PyCharm來使用,可以看看[教育優惠官方申請指南](https://sales.jetbrains.com/hc/zh-cn/articles/207154369)。如下圖所示,我們需要點選“Evaluate”按鈕來試用專業版PyCharm。 18 | 19 | ![](res/pycharm-activation.png) 20 | 21 | 接下來是選擇UI主題,可以根據個人喜好進行選擇,深色的主題比較護眼而淺色的主題對比度更好。 22 | 23 | ![](res/pycharm-ui-themes.png) 24 | 25 | 再接下來是建立可以在“終端”或“命令列提示符”中執行PyCharm的啟動指令碼,當然也可以不做任何勾選,直接點選“Next: Featured plugins”按鈕進入下一環節。 26 | 27 | ![](res/pycharm-create-launcher.png) 28 | 29 | 然後可以選擇需要安裝哪些外掛,我們可以暫時什麼都不安裝,等需要的時候再來決定。 30 | 31 | ![](res/pycharm-install-plugins.png) 32 | 33 | 最後點選上圖右下角的“Start using PyCharm”(開始使用PyCharm)就可以開啟你的PyCharm之旅了。 34 | 35 | ### 用PyCharm建立專案 36 | 37 | 啟動PyCharm之後會來到一個歡迎頁,在歡迎頁上我們可以選擇“建立新專案”(Create New Project)、“開啟已有專案”(Open)和“從版本控制系統中檢出專案”(Get from Version Control)。 38 | 39 | ![](res/pycharm-welcome.png) 40 | 41 | 如果選擇了“Create New Project”來建立新專案就會打一個建立專案的嚮導頁。下圖所示是PyCharm專業版建立新專案的嚮導頁,可以看出專業版支援的專案型別非常的多,而社群版只能建立純Python專案(Pure Python),沒有這一系列的選項。 42 | 43 | ![](res/pycharm-project-wizard.png) 44 | 45 | 接下來,我們要為專案建立專屬的虛擬環境,每個Python專案最好都在自己專屬的虛擬環境中執行,因為每個專案對Python直譯器和三方庫的需求並不相同,虛擬環境對不同的專案進行了隔離。在上圖所示的介面在,我們可以選擇新建虛擬環境(New environment using Virtualenv),這裡的“Virtualenv”是PyCharm預設選擇的建立虛擬環境的工具,我們就保留這個預設的選項就可以了。 46 | 47 | 專案建立完成後就可以開始新建各種檔案來書寫Python程式碼了,如下圖所示。左側是專案瀏覽器,可以看到剛才建立的專案資料夾以及虛擬環境資料夾。我們可以在專案上點選滑鼠右鍵,選擇“New”,在選擇“Python File”來建立Python程式碼檔案,下圖中我們建立了兩個Python檔案,分別是`poker_game.py`和`salary_system.py`。當然,如果願意,也可以使用複製貼上的方式把其他地方的Python程式碼檔案複製到專案資料夾下。 48 | 49 | ![](res/pycharm-workspace.png) 50 | 51 | 在工作視窗點選滑鼠右鍵可以在上下文選單中找到“Run”選項,例如要執行`salary_system.py`檔案,右鍵選單會顯示“Run 'salary_system'”選項,點選這個選項我們就可以執行Python程式碼啦,執行結果在螢幕下方的視窗可以看到,如下圖所示。 52 | 53 | ![](res/pycharm-run-result.png) 54 | 55 | ### 常用操作和快捷鍵 56 | 57 | PyCharm為寫Python程式碼提供了自動補全和高亮語法功能,這也是PyCharm作為整合開發環境(IDE)的基本功能。PyCharm的“File”選單有一個“Settings”選單項(macOS上是在“PyCharm”選單的“Preferences…”選單項),這個選單項會開啟設定視窗,可以在此處對PyCharm進行設定,如下圖所示。 58 | 59 | ![](/Users/Hao/Desktop/Python-Core-50-Courses/res/pycharm-settings.png) 60 | 61 | PyCharm的選單項中有一個非常有用的“Code”選單,選單中提供了自動生成程式碼、自動補全程式碼、格式化程式碼、移動程式碼等選項,這些功能對開發者來說是非常有用的,大家可以嘗試使用這些選單項或者記住它們對應的快捷鍵,例如在macOS上,格式化程式碼這個選單項對應的快捷鍵是`alt+command+L`。除此之外,“Refactor”選單也非常有用,它提供了一些重構程式碼的選項。所謂重構是在不改變程式碼執行結果的前提下調整程式碼的結構,這也是資深程式設計師的一項重要技能。還有一個值得一提的選單是“VCS”,VCS是“Version Control System”(版本控制系統)的縮寫,這個選單提供了對程式碼版本管理的支援。版本控制的知識會在其他的課程中為大家講解。 62 | 63 | 下表列出了一些PyCharm中特別常用的快捷鍵,當然如果願意,也可以透過設定視窗中“Keymap”選單項自定義快捷鍵,PyCharm本身也針對不同的作業系統和使用習慣對快捷鍵進行了分組。 64 | 65 | | 快捷鍵 | 作用 | 66 | | --------------------------------------------- | -------------------------------------- | 67 | | `command + j` | 顯示可用的程式碼模板 | 68 | | `command + b` | 檢視函式、類、方法的定義 | 69 | | `ctrl + space` | 萬能程式碼提示快捷鍵,一下不行按兩下 | 70 | | `command + alt + l` | 格式化程式碼 | 71 | | `alt + enter` | 萬能程式碼修復快捷鍵 | 72 | | `ctrl + /` | 註釋/反註釋程式碼 | 73 | | `shift + shift` | 萬能搜尋快捷鍵 | 74 | | `command + d` / `command + y` | 複製/刪除一行程式碼 | 75 | | `command + shift + -` / `command + shift + +` | 摺疊/展開所有程式碼 | 76 | | `F2` | 快速定位到錯誤程式碼 | 77 | | `command+ alt + F7` | 檢視哪些地方用到了指定的函式、類、方法 | 78 | 79 | > **說明**:Windows系統下如果使用PyCharm的預設設定,可以將上面的`command`鍵換成`ctrl`鍵即可,唯一的例外是`ctrl + space`那個快捷鍵,因為它跟Windows系統切換輸入法的快捷鍵是衝突的,所以在Windows系統下預設沒有與之對應的快捷鍵。 -------------------------------------------------------------------------------- /公开课/文档/第05次公开课-算法入门系列1-周而复始/算法入门系列1-周而复始.md: -------------------------------------------------------------------------------- 1 | ## 演算法入門系列課程1 - 週而復始 2 | 3 | ### 演算法概述 4 | 5 | 1. 什麼是演算法? 6 | 7 | 解決問題的正確方法和具體的實施步驟。 8 | 9 | 例子1:如何在兩棟相距50m的大樓的兩個房間牽一條線(兩個房間都有窗)? 10 | 11 | - 養一隻鳥(如鴿子),將線送過去 12 | - 用很長的杆子將線遞過去 13 | - 用無人機(遙控飛行器)將線送過去 14 | 15 | 如何評價這些方法的好壞?**少花錢,不費事**! 16 | 17 | 例子2:大教室裡坐了幾百名學生一起聽課,如何快速的統計學生人數? 18 | 19 | 例子3:向列表容器中**逆向**插入100000個元素。 20 | 21 | - 方法1: 22 | 23 | ```Python 24 | nums = [] 25 | for i in range(100000): 26 | nums.append(i) 27 | nums.reverse() 28 | ``` 29 | 30 | - 方法2: 31 | 32 | ```Python 33 | nums = [] 34 | for i in range(100000): 35 | nums.insert(0, i) 36 | ``` 37 | 38 | 例子3:生成Fibonacci數列(前100個Fibonacci數)。 39 | 40 | - 方法1 - 遞推: 41 | 42 | ```Python 43 | a, b = 0, 1 44 | for num in range(1, 101): 45 | a, b = b, a + b 46 | print(f'{num}: {a}') 47 | ``` 48 | 49 | - 方法2 - 遞迴: 50 | 51 | ```Python 52 | def fib(num): 53 | if num in (1, 2): 54 | return 1 55 | return fib(num - 1) + fib(num - 2) 56 | 57 | 58 | for num in range(1, 101): 59 | print(f'{num}: {fib(num)}') 60 | ``` 61 | 62 | - 方法3 - 改進的遞迴: 63 | 64 | ```Python 65 | def fib(num, temp={}): 66 | if num in (1, 2): 67 | return 1 68 | elif num not in temp: 69 | temp[num] = fib(num - 1) + fib(num - 2) 70 | return temp[num] 71 | ``` 72 | 73 | - 方法4 - 改進的遞迴: 74 | 75 | ```Python 76 | from functools import lru_cache 77 | 78 | 79 | @lru_cache() 80 | def fib(num): 81 | if num in (1, 2): 82 | return 1 83 | return fib(num - 1) + fib(num - 2) 84 | ``` 85 | 86 | 2. 如何評價演算法的好壞? 87 | 88 | [漸近時間複雜度]()和漸近空間複雜度。 89 | 90 | 3. 大***O***符號的意義? 91 | 92 | 表示一個函式相對於輸入規模的增長速度,也可以稱之為函式的數量級。 93 | 94 | | 大*O*符號 | 說明 | 例子 | 95 | | --------------- | ------------------ | -------------------------------------------- | 96 | | $$O(c)$$ | 常量時間複雜度 | 布隆過濾器 / 雜湊儲存 | 97 | | $$O(log_2n)$$ | 對數時間複雜度 | 二分查詢(折半查詢) | 98 | | $$O(n)$$ | 線性時間複雜度 | 順序查詢 / 桶排序 | 99 | | $$O(n*log_2n)$$ | 對數線性時間複雜度 | 高階排序演算法(歸併排序、快速排序) | 100 | | $$O(n^2)$$ | 平方時間複雜度 | 簡單排序演算法(選擇排序、插入排序、氣泡排序) | 101 | | $$O(n^3)$$ | 立方時間複雜度 | Floyd演算法 / 矩陣乘法運算 | 102 | | $$O(2^n)$$ | 幾何級數時間複雜度 | 漢諾塔 | 103 | | $$O(n!)$$ | 階乘時間複雜度 | 旅行經銷商問題 | 104 | 105 | ### 窮舉法 106 | 107 | 在計算機科學中,**窮舉法**或者**暴力搜尋法**是一個非常非常直觀的解決問題的方法,這種方法透過一項一項的列舉解決方案所有可能的候選項以及檢查每個候選項是否符合問題的描述,最終得到問題的解。 108 | 109 | 雖然暴力搜尋很容易實現,並且如果解決方案存在它就一定能夠找到,但是它的代價是和候選方案的數量成比例的,由於這一點,在很多實際問題中,消耗的代價會隨著問題規模的增加而快速地增長。因此,當問題規模有限或當存在可用於將候選解決方案的集合減少到可管理大小時,就可以使用暴力搜尋。另外,當實現方法的簡單度比速度更重要的時候,也可以考慮使用這種方法。 110 | 111 | ### 經典例子 112 | 113 | 1. **百錢百雞**問題:公雞5元一隻,母雞3元一隻,小雞1元三隻,用100元買一百隻雞,問公雞、母雞、小雞各有多少隻? 114 | 115 | ```Python 116 | for x in range(21): 117 | for y in range(34): 118 | z = 100 - x - y 119 | if z % 3 == 0 and 5 * x + 3 * y + z // 3 == 100: 120 | print(x, y, z) 121 | ``` 122 | 123 | 2. **五人分魚**問題:ABCDE五人在某天夜裡合夥捕魚,最後疲憊不堪各自睡覺。第二天A第一個醒來,他將魚分為5份,扔掉多餘的1條,拿走了屬於自己的一份;B第二個醒來,也將魚分為5份,扔掉多餘的1條,拿走屬於自己的一份;然後C、D、E依次醒來,也按同樣的方式分魚,問他們至少捕了多少條魚? 124 | 125 | ```Python 126 | fish = 6 127 | while True: 128 | total = fish 129 | enough = True 130 | for _ in range(5): 131 | if (total - 1) % 5 == 0: 132 | total = (total - 1) // 5 * 4 133 | else: 134 | enough = False 135 | break 136 | if enough: 137 | print(fish) 138 | break 139 | fish += 5 140 | ``` 141 | 142 | 3. **暴力破解口令**: 143 | 144 | ```Python 145 | import re 146 | 147 | import PyPDF2 148 | 149 | with open('Python_Tricks_encrypted.pdf', 'rb') as pdf_file_stream: 150 | reader = PyPDF2.PdfFileReader(pdf_file_stream) 151 | with open('dictionary.txt', 'r') as txt_file_stream: 152 | file_iter = iter(lambda: txt_file_stream.readline(), '') 153 | for word in file_iter: 154 | word = re.sub(r'\s', '', word) 155 | if reader.decrypt(word): 156 | print(word) 157 | break 158 | ``` -------------------------------------------------------------------------------- /番外篇/知乎问题回答.md: -------------------------------------------------------------------------------- 1 | ## 知乎問題回答 2 | 3 | ### Python學習完基礎語法知識後,如何進一步提高? 4 | 5 | 如果你已經完成了Python基礎語法的學習,想要知道接下來如何提高,那麼你得先問問自己你要用Python來做什麼?目前學習Python後可能的就業方向包括以下幾個領域,我把每個領域需要的技術作為了一個簡單的關鍵詞摘要。 6 | 7 | > 說明:以下資料參考了主要的招聘入口網站以及職友集。 8 | 9 | | 職位 | 所需技能 | 招聘需求量 | 10 | | ---------------------------------------------- | ------------------------------------------------------------ | ---------- | 11 | | Python後端開發工程師 | Python基礎
Django / Flask / Tornado / Sanic
RESTful / 介面文件撰寫
MySQL / Redis / MongoDB / ElasticSearch
Linux / Git / Scrum / PyCharm | 一般 | 12 | | Python爬蟲開發工程師 | Python基礎
常用標準庫和三方庫
Scrapy / PySpider
Selenium / Appnium
Redis / MongoDB / MySQL
前端 / HTTP(S) / 抓包工具 | 較少 | 13 | | Python量化交易開發工程師 | Python基礎
資料結構 / 演算法 / 設計模式
NoSQL(KV資料庫)
金融學(兩融、期權、期貨、股票) / 數字貨幣 | 一般 | 14 | | Python資料分析工程師 /
Python機器學習工程師 | 統計學專業 / 數學專業 / 計算機專業
Python基礎 / 演算法設計
SQL / NoSQL / Hive / Hadoop / Spark
NumPy / Scikit-Learn / Pandas / Seaborn
PyTorch / Tensorflow / OpenCV | 大 | 15 | | Python自動化測試工程師 | Python基礎 / 單元測試 / 軟體測試基礎
Linux / Shell / JIRA / 禪道 / Jenkins / CI / CD
Selenium / Robot Framework / Appnium
ab / sysbench / JMeter / LoadRunner / QTP | 大 | 16 | | Python自動化運維工程師 | Python基礎 / Linux / Shell
Fabric / Ansible / Playbook
Zabbix / Saltstack / Puppet
Docker / paramiko | 大 | 17 | | Python雲平臺開發工程師 | Python基礎
OpenStack / CloudStack
Ovirt / KVM
Docker / K8S | 較少 | 18 | 19 | 如果弄清了自己將來要做的方向,就可以開始有針對性的學習了,下面給大家一個推薦書籍的清單。 20 | 21 | 1. 入門讀物 22 | - 《Python基礎教程》(*Beginning Python From Novice to Professional*) 23 | - 《Python學習手冊》(*Learning Python*) 24 | - 《Python程式設計》(*Programming Python*) 25 | - 《Python程式設計從入門到實踐》(*Python Crash Course*) 26 | - 《Python Cookbook》 27 | 2. 進階讀物 28 | - 《軟體架構 - Python語言實現》(*Software Architecture with Python*) 29 | - 《流暢的Python》(*Fluent Python*) 30 | - 《Python設計模式》(*Learning Python Design Patterns*) 31 | - 《Python高階程式設計》(*Expert Python Programming*) 32 | - 《Python效能分析與最佳化》(*Mastering Python High Performance*) 33 | 3. 資料庫相關 34 | - 《MySQL必知必會》(*MySQL Crash Course*) 35 | - 《深入淺出MySQL - 資料庫開發、最佳化與管理維護》 36 | - 《MongoDB權威指南》(*MongoDB: The Definitive Guide*) 37 | - 《Redis實戰》(*Redis in Action*) 38 | - 《Redis開發與運維》 39 | 4. Linux / Shell / Docker / 運維 40 | - 《鳥哥的Linux私房菜》 41 | - 《Linux命令列與shell指令碼程式設計大全》(*Linux Command Line and Shell Scripting Bible*) 42 | - 《Python自動化運維:技術與最佳實踐》 43 | - 《第一本Docker書》(*The Docker Book*) 44 | - 《Docker經典例項》(Docker Cookbook) 45 | 5. Django / Flask / Tornado 46 | - 《Django基礎教程》(*Tango with Django*) 47 | 48 | - 《輕量級Django》(*Lightweight Django*) 49 | 50 | - 《精通Django》(*Mastering Django: Core*) 51 | 52 | - 《Python Web開發:測試驅動方法》(*Test-Driven Development with Python*) 53 | - 《Two Scoops of Django: Best Practice of Django 1.8》 54 | 55 | - 《Flask Web開發:基於Python的Web應用開發實戰》(*Flask Web Development: Developing Web Applications with Python*) 56 | 57 | - 《深入理解Flask》(*Mastering Flask*) 58 | 59 | - 《Introduction to Tornado》 60 | 6. 爬蟲開發 61 | 62 | - 《用Python寫網路爬蟲》(*Web Scraping with Python*) 63 | 64 | - 《精通Python爬蟲框架Scrapy》(*Learning Scrapy*) 65 | 66 | - 《Python網路資料採集》(*Web Scraping with Python*) 67 | 68 | - 《Python爬蟲開發與專案實戰》 69 | 70 | - 《Python 3網路爬蟲開發實戰》 71 | 7. 資料分析 72 | 73 | - 《利用Python進行資料分析》(*Python for Data Analysis*) 74 | - 《Python資料科學手冊》(*Python Data Science Handbook*) 75 | - 《Python金融大資料分析》(*Python for Finance*) 76 | - 《Python資料視覺化程式設計實戰》(*Python Data Visualization Cookbook*) 77 | - 《Python資料處理》(*Data Wrangling with Python*) 78 | 79 | 8. 機器學習 80 | 81 | - 《Python機器學習基礎教程》(*Introduction to Machine Learning with Python*) 82 | 83 | - 《Python機器學習實踐指南》(*Python Machine Learning Blueprints*) 84 | 85 | - 《Python機器學習實踐:測試驅動的開發方法》(*Thoughtful Machine Learning with Python A Test Driven Approach*) 86 | - 《Python機器學習經典例項》(*Python Machine Learning Cookbook*) 87 | - 《TensorFlow:實戰Google深度學習框架》 88 | 89 | 9. 其他書籍 90 | 91 | - 《Pro Git》 92 | - 《Selenium自動化測試 - 基於Python語言》(*Learning Selenium Testing Tools with Python*) 93 | - 《Selenium自動化測試之道》 94 | - 《Scrum敏捷軟體開發》(*Software Development using Scrum*) 95 | - 《高效團隊開發 - 工具與方法》 96 | 97 | 當然學習程式設計,最重要的透過專案實戰來提升自己的綜合能力,Github上有大量的優質開源專案,其中不乏優質的Python專案。有一個名為[“awesome-python-applications”](https://github.com/mahmoud/awesome-python-applications)的專案對這些優質的資源進行了歸類並提供了傳送門,大家可以瞭解下。如果自學能力不是那麼強,可以透過網路上免費或者付費的影片課程來學習對應的知識;如果自律性沒有那麼強,那就只能建議花錢參加培訓班了,因為花錢在有人監督的環境下學習對很多人來說確實是一個捷徑,但是要記得:“師傅領進門,修行靠各人”。選擇自己熱愛的東西並全力以赴,不要盲目的跟風學習,這一點算是過來人的忠告吧。記得我自己剛開始進入軟體開發這個行業時,有人跟我說過這麼一句話,現在也分享出來與諸君共勉:“浮躁的人有兩種:只觀望而不學習的人,只學習而不堅持的人;浮躁的人都不是高手。” -------------------------------------------------------------------------------- /Day66-80/79.相关和回归.md: -------------------------------------------------------------------------------- 1 | ## 相關和迴歸 2 | 3 | 我們知道,可以透過對指標的維度拆來解尋找指標變化的原因。當我們找到問題的原因時,自然會進一步思考一個問題:指標變化的原因這麼多,其中的關鍵因素又是哪個呢?例如,我們在工作場景中時不時會討論這些問題: 4 | 5 | 1. 電商類產品想知道哪個品類銷售對整體銷售貢獻更大; 6 | 2. 渠道運營想知道哪個渠道的使用者對整體活躍作用更大; 7 | 3. 負責留存的想知道哪個客群對整體的留存關係更大; 8 | 4. 產品想知道到底哪些維度(城市、年齡、接入裝置等)會影響整體活躍。 9 | 10 | 還有很多類似的場景,在這種情況下我們不僅要要找到資料變化的原因,還需要明確出不同原因的重要性。因為實際工作中可用資源有限,只能集中優勢資源解決核心問題。 11 | 12 | ### 相關分析基本概念 13 | 14 | 相關性分析,指對兩個或多個指標進行分析,評估它們兩兩之間聯絡或相互影響的程度。相關性分析不僅可以分析出多個指標間是否存在相關關係,還能給出相關程度的量化值。在進行相關性分析時,我們會使用“相關係數”定量給出幾個指標間聯絡和影響的程度,通常用 $ \rho $ 來表示,計算公式為: 15 | 16 | $$ 17 | \rho = \frac {cov(X, Y)} {\sqrt{var(X) \cdot var(Y)}} 18 | $$ 19 | 需要注意的是,$ \rho $ 只能用來度量線性關係,它的取值在 $ [-1, 1] $ 之間。資料中的離群值會對 $ \rho $ 產生影響,在計算時必須先剔除,實際使用相關關係時,還需要**關注相關關係的穩定性**。 20 | 21 | 我們用 $ \rho $ 值判斷指標的相關性時遵循以下兩個步驟。 22 | 23 | 1. 判斷指標間是正相關、負相關,還是不相關。 24 | - 當 $ \rho \gt 0 $,認為指標間是正相關,也就是兩者的趨勢一致。如果指標 A 與指標 B 的 $ \rho \gt 0 $,那麼指標 A 上漲,指標 B 也會上漲;反之亦然。 25 | - 當 $ \rho \lt 0 $,認為指標間是負相關,也就是兩者的趨勢相反。如果指標 A 與指標 B 的 $ \rho \lt 0 $,那麼指標 A 上漲,指標 B 會下降;反之亦然。 26 | - 當 $ \rho = 0 $,認為指標間是不相關的,但並不代表兩個指標是統計獨立的。 27 | 2. 判斷指標間的相關程度。 28 | - 當 $ \rho $ 的值在 $ [0.5,1] $ 之間,認為指標間是強相關,指標間的業務聯絡非常緊密。 29 | - 當 $ \rho $ 的值在 $ [0.1,0.5) $ 之間,認為指標間是弱相關,指標間的業務聯絡不太緊密。 30 | - 當 $ \rho $ 的值在 $ [0,0.1) $ 之間,認為指標間是無相關,指標間的業務聯絡無任何聯絡,也就是說當我們去運營指標 A 時,指標 B 不會產生相應的變化。 31 | 32 | ### 相關分析應用場景 33 | 34 | 事實上,相關性分析的應用場景非常多,基本上當問到“這兩個東西有什麼關係”、“哪個指標的作用(貢獻或價值)更大”、“我們應該重點解決哪個問題”這類問題時,都可以用相關性分析給出比較準確的回答,非常便於產品運營找到解決問題的核心抓手。 35 | 36 | 37 | 38 | 在使用相關分析時,應注意以下幾個方面: 39 | 40 | 1. 業務意義:當我們想知道A指標的情況時,可以監控B指標。 41 | 2. 注意事項:千萬不要將相關關係判斷為因果關係,相關關係是伴隨關係而不是因果關係。 42 | 3. 強相關關係才是有業務價值的,建議尋找相關係數在 0.6 以上甚至 0.8 以上的指標。 43 | 4. 相關關係的本質是 Y 的變化有多少能被 X 解釋,跟 X 和 Y 之間的斜率大小無關。 44 | 45 | ### Excel計算相關係數 46 | 47 | 1. 方法一:使用 CORREL 函式。 48 | 2. 方法二:使用“資料分析”模組的“相關係數”功能。 49 | 50 | 51 | 52 | ### 相關分析案例 53 | 54 | #### 分析哪個客群的留存對整體留存貢獻更大 55 | 56 | 留存的運營中我們最常看的就是新客的留存和活躍客群的留存,用來評估哪個客群的留存與整體的留存聯絡更緊密,以便制定後續運營的策略。 57 | 58 | 59 | 60 | 利用Excel進行相關分析的結果如下所示。 61 | 62 | 63 | 64 | 可以看出,活躍訪客的留存率與整體留存率的相關是強相關;而新增訪客的留存率與整體留存率的相關是弱相關,所以如果要提升整體留存率,我們的產品運營資源應當更多地投放給活躍使用者,以提升整體的留存率;而新增訪客,雖然不會拿到很多運營資源,但是我們也要去深入分析為什麼新增訪客的留存的貢獻比較小,適時做一些提升這部分客群與整體留存的策略。 65 | 66 | #### 案例2:找出對購買轉化率貢獻最高的渠道 67 | 68 | 基本上電商運營會同時部署多個渠道,包括線上電商平臺以及線下的門店。由於現有某產品從各個渠道獲客的使用者在產品上的購買轉化率,需要評估哪些渠道的使用者對整體購買轉化率貢獻最大,後續將重點營銷此渠道。 69 | 70 | 71 | 72 | #### 案例3:分析哪些因素對 DAU 的影響更大 73 | 74 | 我們分析 DAU 時常會將它拆解為各種維度來分析,這裡我們分析與 DAU 聯絡最緊密的維度到底是哪些,以幫助我們制定針對性的運營策略,如下圖所示。 75 | 76 | 77 | 78 | 對於這樣的報表,我們需要找出到底是哪幾個城市、哪個作業系統,以及哪個年齡段的使用者對於 DAU 的影響最大。如果能找出來這個關係,那麼後續要提升 DAU,就有非常清晰的方向。 79 | 80 | 81 | ### 線性迴歸 82 | 83 | 如果只有一個自變數 X,而且因變數 Y 和自變數 X 之間的數量變化關係呈現近似的線性關係,就可以建立一元線性迴歸方程,透過自變數 X 的值來預測因變數 Y 的值,這就是所謂的**一元線性迴歸預測**,迴歸方程如下所示: 84 | $$ 85 | Y = aX + b 86 | $$ 87 | 我們可以通過歷史資料(已知的 $ X $ 和 $ Y $ ),確定引數 $ a $ 和 $ b $ 的值,還原出迴歸方程,從而實現預測。很顯然,$ a $和 $ b $ 的取值可以有很多種選擇,那麼什麼才是最好的 $ a $ 和 $ b$ 呢?如果把真實值記為 $ y $,把預測值記為 $ \hat{y} $,那麼讓 $ SSR $ 值最小的 $ a $ 和 $ b $ 就是最好的 $ a $ 和 $ b $ ,稱之為**最小二乘解**,其中$ SSR $ 值計算公式如下所示: 88 | $$ 89 | SSR = \sum_{i=1}^{n}(y_i - \hat{y_i})^2 90 | $$ 91 | 損失函式是凹函式,找到使函式最小的`a`和`b`的值,可以透過向凹函式的拐點進行逼近的方式來找到更好的`a`和`b`的值,具體的公式如下所示: 92 | 93 | $$ 94 | a^\prime = a + (-1) \times \frac {\partial loss(a, b)} {\partial a} \times \Delta \\ 95 | b^\prime = b + (-1) \times \frac {\partial loss(a, b)} {\partial b} \times \Delta 96 | $$ 97 | 對於上面的求 $ SSR $ 的函式來說,可以用下面的公式計算偏導數: 98 | $$ 99 | f(a, b) = \frac {1} {N} \sum_{i=1}^{N}(y_i - (ax_i + b))^2 \\ 100 | \frac {\partial {f(a, b)}} {\partial {a}} = \frac {2} {N} \sum_{i=1}^{N}(-x_iy_i + x_i^2a + x_ib) \\ 101 | \frac {\partial {f(a, b)}} {\partial {b}} = \frac {2} {N} \sum_{i=1}^{N}(-y_i + x_ia + b) 102 | $$ 103 | 上面的方法稱為**梯度下降法**。 104 | 105 | 在Excel中,可以使用“資料分析”模組的“”來實現線性迴歸。 106 | 107 | 108 | 109 | 對於迴歸分析,最為重要的是評價迴歸的結果是否理想,這關係到能否透過迴歸方程去預測將來,我們先看看決定係數(Multiple R-Squared,通常稱之為$ R^2 $)。在統計學習中,決定係數用於度量因變數的變化中可由自變數解釋部分所佔的比例,也就是你的迴歸模型的解釋力是否良好,$ R^2 $ 的值越接近`1`越好。 110 | $$ 111 | SS_{tot} = \sum_{i}(y_{i} - \bar {y})^2 \\ 112 | SS_{res} = \sum_{i}(y_{i} - \hat {y_i})^2 \\ 113 | R^2 = 1 - \frac {SS_{res}} {SS_{tot}} 114 | $$ 115 | 116 | 117 | 118 | 接下來我們還要對迴歸方程的顯著性進行檢驗,主要包括 t 檢驗(迴歸係數的檢驗)和F檢驗(迴歸方程的檢驗)。對於F檢驗(F-statistic)的結果,主要關注其 p-value ,如果 p-value 小於0.05,那麼說明擬合效果是不錯的。 119 | 120 | --------------------------------------------------------------------------------