From 20ba69a60097c5052a212a281f0b3e2d4ec8a5ff Mon Sep 17 00:00:00 2001
From: 1337428173 <1337428173@qq.com>
Date: Wed, 3 Apr 2024 08:41:04 +0000
Subject: [PATCH 1/3] GitBook: No commit message
---
SUMMARY.md | 222 ++++++++++++++++++
day01-15-1/README.md | 2 +
day01-15-10/README.md | 2 +
day01-15-11/README.md | 2 +
day01-15-12/README.md | 2 +
day01-15-13/README.md | 2 +
day01-15-14/README.md | 2 +
day01-15-2/README.md | 2 +
day01-15-3/README.md | 2 +
day01-15-4/README.md | 2 +
day01-15-5/README.md | 2 +
day01-15-6/README.md | 2 +
day01-15-7/README.md | 2 +
day01-15-8/README.md | 2 +
day01-15-9/README.md | 2 +
day01-15/README.md | 2 +
day16-20/README.md | 2 +
day21-30/README.md | 2 +
day31-35/README.md | 2 +
day36-40-1/README.md | 2 +
day36-40-2/README.md | 2 +
day36-40-3/README.md | 2 +
day36-40-4/README.md | 2 +
day36-40-5/README.md | 2 +
day36-40/README.md | 2 +
day41-55-1/README.md | 2 +
day41-55-10/README.md | 2 +
day41-55-11/README.md | 2 +
day41-55-12/README.md | 2 +
day41-55-13/README.md | 2 +
day41-55-14/README.md | 2 +
day41-55-2/README.md | 2 +
day41-55-3/README.md | 2 +
day41-55-4/README.md | 2 +
day41-55-5/README.md | 2 +
day41-55-6/README.md | 2 +
day41-55-7/README.md | 2 +
day41-55-8/README.md | 2 +
day41-55-9/README.md | 2 +
day41-55/README.md | 2 +
day56-60/README.md | 2 +
day61-65-1/README.md | 2 +
day61-65-2/README.md | 2 +
day61-65-3/README.md | 2 +
day61-65-4/README.md | 2 +
day61-65-5/README.md | 2 +
day61-65-6/README.md | 2 +
day61-65-7/README.md | 2 +
day61-65-8/README.md | 2 +
day61-65/README.md | 2 +
day66-80-1/README.md | 2 +
day66-80-10/README.md | 2 +
day66-80-11/README.md | 2 +
day66-80-12/README.md | 2 +
day66-80-13/README.md | 2 +
day66-80-14/README.md | 2 +
day66-80-2/README.md | 2 +
day66-80-3/README.md | 2 +
day66-80-4/README.md | 2 +
day66-80-5/README.md | 2 +
day66-80-6/README.md | 2 +
day66-80-7/README.md | 2 +
day66-80-8/README.md | 2 +
day66-80-9/README.md | 2 +
day66-80/README.md | 2 +
day81-90-1/README.md | 2 +
day81-90-10/README.md | 2 +
day81-90-2/README.md | 2 +
day81-90-3/README.md | 2 +
day81-90-4/README.md | 2 +
day81-90-5/README.md | 2 +
day81-90-6/README.md | 2 +
day81-90-7/README.md | 2 +
day81-90-8/README.md | 2 +
day81-90-9/README.md | 2 +
day81-90/README.md | 2 +
day91-100-1/README.md | 2 +
day91-100-2/README.md | 2 +
day91-100-3/README.md | 2 +
day91-100-4/README.md | 2 +
day91-100-5/README.md | 2 +
day91-100-6/README.md | 2 +
day91-100-7/README.md | 2 +
day91-100-8/README.md | 2 +
day91-100-9/README.md | 2 +
day91-100/README.md | 2 +
fan-wai-pian-1/README.md | 2 +
fan-wai-pian-10/README.md | 2 +
fan-wai-pian-11/README.md | 2 +
fan-wai-pian-12/README.md | 2 +
fan-wai-pian-13/README.md | 2 +
fan-wai-pian-14/README.md | 2 +
fan-wai-pian-15/README.md | 2 +
fan-wai-pian-2/README.md | 2 +
fan-wai-pian-3/README.md | 2 +
fan-wai-pian-4/README.md | 2 +
fan-wai-pian-5/README.md | 2 +
fan-wai-pian-6/README.md | 2 +
fan-wai-pian-7/README.md | 2 +
fan-wai-pian-8/README.md | 2 +
fan-wai-pian-9/README.md | 2 +
fan-wai-pian/README.md | 2 +
gong-kai-ke-1/README.md | 2 +
gong-kai-ke-1/wen-dang/README.md | 2 +
.../README.md | 2 +
gong-kai-ke-2/README.md | 2 +
gong-kai-ke-2/wen-dang/README.md | 2 +
.../README.md | 2 +
gong-kai-ke-3/README.md | 2 +
gong-kai-ke-3/wen-dang/README.md | 2 +
.../README.md | 2 +
gong-kai-ke/README.md | 2 +
gong-kai-ke/wen-dang/README.md | 2 +
.../README.md | 2 +
114 files changed, 448 insertions(+)
create mode 100644 SUMMARY.md
create mode 100644 day01-15-1/README.md
create mode 100644 day01-15-10/README.md
create mode 100644 day01-15-11/README.md
create mode 100644 day01-15-12/README.md
create mode 100644 day01-15-13/README.md
create mode 100644 day01-15-14/README.md
create mode 100644 day01-15-2/README.md
create mode 100644 day01-15-3/README.md
create mode 100644 day01-15-4/README.md
create mode 100644 day01-15-5/README.md
create mode 100644 day01-15-6/README.md
create mode 100644 day01-15-7/README.md
create mode 100644 day01-15-8/README.md
create mode 100644 day01-15-9/README.md
create mode 100644 day01-15/README.md
create mode 100644 day16-20/README.md
create mode 100644 day21-30/README.md
create mode 100644 day31-35/README.md
create mode 100644 day36-40-1/README.md
create mode 100644 day36-40-2/README.md
create mode 100644 day36-40-3/README.md
create mode 100644 day36-40-4/README.md
create mode 100644 day36-40-5/README.md
create mode 100644 day36-40/README.md
create mode 100644 day41-55-1/README.md
create mode 100644 day41-55-10/README.md
create mode 100644 day41-55-11/README.md
create mode 100644 day41-55-12/README.md
create mode 100644 day41-55-13/README.md
create mode 100644 day41-55-14/README.md
create mode 100644 day41-55-2/README.md
create mode 100644 day41-55-3/README.md
create mode 100644 day41-55-4/README.md
create mode 100644 day41-55-5/README.md
create mode 100644 day41-55-6/README.md
create mode 100644 day41-55-7/README.md
create mode 100644 day41-55-8/README.md
create mode 100644 day41-55-9/README.md
create mode 100644 day41-55/README.md
create mode 100644 day56-60/README.md
create mode 100644 day61-65-1/README.md
create mode 100644 day61-65-2/README.md
create mode 100644 day61-65-3/README.md
create mode 100644 day61-65-4/README.md
create mode 100644 day61-65-5/README.md
create mode 100644 day61-65-6/README.md
create mode 100644 day61-65-7/README.md
create mode 100644 day61-65-8/README.md
create mode 100644 day61-65/README.md
create mode 100644 day66-80-1/README.md
create mode 100644 day66-80-10/README.md
create mode 100644 day66-80-11/README.md
create mode 100644 day66-80-12/README.md
create mode 100644 day66-80-13/README.md
create mode 100644 day66-80-14/README.md
create mode 100644 day66-80-2/README.md
create mode 100644 day66-80-3/README.md
create mode 100644 day66-80-4/README.md
create mode 100644 day66-80-5/README.md
create mode 100644 day66-80-6/README.md
create mode 100644 day66-80-7/README.md
create mode 100644 day66-80-8/README.md
create mode 100644 day66-80-9/README.md
create mode 100644 day66-80/README.md
create mode 100644 day81-90-1/README.md
create mode 100644 day81-90-10/README.md
create mode 100644 day81-90-2/README.md
create mode 100644 day81-90-3/README.md
create mode 100644 day81-90-4/README.md
create mode 100644 day81-90-5/README.md
create mode 100644 day81-90-6/README.md
create mode 100644 day81-90-7/README.md
create mode 100644 day81-90-8/README.md
create mode 100644 day81-90-9/README.md
create mode 100644 day81-90/README.md
create mode 100644 day91-100-1/README.md
create mode 100644 day91-100-2/README.md
create mode 100644 day91-100-3/README.md
create mode 100644 day91-100-4/README.md
create mode 100644 day91-100-5/README.md
create mode 100644 day91-100-6/README.md
create mode 100644 day91-100-7/README.md
create mode 100644 day91-100-8/README.md
create mode 100644 day91-100-9/README.md
create mode 100644 day91-100/README.md
create mode 100644 fan-wai-pian-1/README.md
create mode 100644 fan-wai-pian-10/README.md
create mode 100644 fan-wai-pian-11/README.md
create mode 100644 fan-wai-pian-12/README.md
create mode 100644 fan-wai-pian-13/README.md
create mode 100644 fan-wai-pian-14/README.md
create mode 100644 fan-wai-pian-15/README.md
create mode 100644 fan-wai-pian-2/README.md
create mode 100644 fan-wai-pian-3/README.md
create mode 100644 fan-wai-pian-4/README.md
create mode 100644 fan-wai-pian-5/README.md
create mode 100644 fan-wai-pian-6/README.md
create mode 100644 fan-wai-pian-7/README.md
create mode 100644 fan-wai-pian-8/README.md
create mode 100644 fan-wai-pian-9/README.md
create mode 100644 fan-wai-pian/README.md
create mode 100644 gong-kai-ke-1/README.md
create mode 100644 gong-kai-ke-1/wen-dang/README.md
create mode 100644 gong-kai-ke-1/wen-dang/di-04-ci-gong-kai-ke-hao-wan-de-python/README.md
create mode 100644 gong-kai-ke-2/README.md
create mode 100644 gong-kai-ke-2/wen-dang/README.md
create mode 100644 gong-kai-ke-2/wen-dang/di-05-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-1-zhou-er-fu-shi/README.md
create mode 100644 gong-kai-ke-3/README.md
create mode 100644 gong-kai-ke-3/wen-dang/README.md
create mode 100644 gong-kai-ke-3/wen-dang/di-06-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-2-zai-shui-yi-fang/README.md
create mode 100644 gong-kai-ke/README.md
create mode 100644 gong-kai-ke/wen-dang/README.md
create mode 100644 gong-kai-ke/wen-dang/nian-xin-50w+-de-python-cheng-xu-yuan-ru-he-xie-dai-ma/README.md
diff --git a/SUMMARY.md b/SUMMARY.md
new file mode 100644
index 0000000000..5305ad7c64
--- /dev/null
+++ b/SUMMARY.md
@@ -0,0 +1,222 @@
+# Table of contents
+
+* [Python - 100天从新手到大师](README.md)
+* [更新日志](更新日志.md)
+* [Day01-15](day01-15/README.md)
+ * [初识Python](Day01-15/01.初识Python.md)
+* [Day01-15](day01-15-1/README.md)
+ * [语言元素](Day01-15/02.语言元素.md)
+* [Day01-15](day01-15-2/README.md)
+ * [分支结构](Day01-15/03.分支结构.md)
+* [Day01-15](day01-15-3/README.md)
+ * [循环结构](Day01-15/04.循环结构.md)
+* [Day01-15](day01-15-4/README.md)
+ * [构造程序逻辑](Day01-15/05.构造程序逻辑.md)
+* [Day01-15](day01-15-5/README.md)
+ * [函数和模块的使用](Day01-15/06.函数和模块的使用.md)
+* [Day01-15](day01-15-6/README.md)
+ * [字符串和常用数据结构](Day01-15/07.字符串和常用数据结构.md)
+* [Day01-15](day01-15-7/README.md)
+ * [面向对象编程基础](Day01-15/08.面向对象编程基础.md)
+* [Day01-15](day01-15-8/README.md)
+ * [面向对象进阶](Day01-15/09.面向对象进阶.md)
+* [Day01-15](day01-15-9/README.md)
+ * [图形用户界面和游戏开发](Day01-15/10.图形用户界面和游戏开发.md)
+* [Day01-15](day01-15-10/README.md)
+ * [文件和异常](Day01-15/11.文件和异常.md)
+* [Day01-15](day01-15-11/README.md)
+ * [使用正则表达式](Day01-15/12.字符串和正则表达式.md)
+* [Day01-15](day01-15-12/README.md)
+ * [进程和线程](Day01-15/13.进程和线程.md)
+* [Day01-15](day01-15-13/README.md)
+ * [网络编程入门](Day01-15/14.网络编程入门和网络应用开发.md)
+* [Day01-15](day01-15-14/README.md)
+ * [图像和办公文档处理](Day01-15/15.图像和办公文档处理.md)
+* [Day16-20](day16-20/README.md)
+ * [Python语言进阶](Day16-20/16-20.Python语言进阶.md)
+* [Day21-30](day21-30/README.md)
+ * [Web前端概述](Day21-30/21-30.Web前端概述.md)
+* [Day31-35](day31-35/README.md)
+ * [31-35.玩转Linux操作系统](Day31-35/31-35.玩转Linux操作系统.md)
+* [Day36-40](day36-40/README.md)
+ * [关系型数据库和MySQL概述](Day36-40/36.关系型数据库和MySQL概述.md)
+* [Day36-40](day36-40-1/README.md)
+ * [SQL 和 MySQL 详解](Day36-40/37.SQL详解.md)
+* [Day36-40](day36-40-2/README.md)
+ * [深入MySQL](Day36-40/38.深入MySQL.md)
+* [Day36-40](day36-40-3/README.md)
+ * [Python程序接入MySQL数据库](Day36-40/39.Python程序接入MySQL数据库.md)
+* [Day36-40](day36-40-4/README.md)
+ * [Hive简介](Day36-40/40.大数据平台和HiveSQL.md)
+* [Day36-40](day36-40-5/README.md)
+ * [NoSQL入门](Day36-40/NoSQL数据库入门.md)
+* [Day41-55](day41-55/README.md)
+ * [Django快速上手](Day41-55/41.Django快速上手.md)
+* [Day41-55](day41-55-1/README.md)
+ * [深入模型](Day41-55/42.深入模型.md)
+* [Day41-55](day41-55-2/README.md)
+ * [静态资源和Ajax请求](Day41-55/43.静态资源和Ajax请求.md)
+* [Day41-55](day41-55-3/README.md)
+ * [Cookie和Session](Day41-55/44.Cookie和Session.md)
+* [Day41-55](day41-55-4/README.md)
+ * [制作报表](Day41-55/45.制作报表.md)
+* [Day41-55](day41-55-5/README.md)
+ * [日志和调试工具栏](Day41-55/46.日志和调试工具栏.md)
+* [Day41-55](day41-55-6/README.md)
+ * [中间件的应用](Day41-55/47.中间件的应用.md)
+* [Day41-55](day41-55-7/README.md)
+ * [前后端分离开发入门](Day41-55/48.前后端分离开发入门.md)
+* [Day41-55](day41-55-8/README.md)
+ * [RESTful架构和DRF入门](Day41-55/49.RESTful架构和DRF入门.md)
+* [Day41-55](day41-55-9/README.md)
+ * [RESTful架构和DRF进阶](Day41-55/50.RESTful架构和DRF进阶.md)
+* [Day41-55](day41-55-10/README.md)
+ * [使用缓存](Day41-55/51.使用缓存.md)
+* [Day41-55](day41-55-11/README.md)
+ * [接入三方平台](Day41-55/52.接入三方平台.md)
+* [Day41-55](day41-55-12/README.md)
+ * [异步任务和定时任务](Day41-55/53.异步任务和定时任务.md)
+* [Day41-55](day41-55-13/README.md)
+ * [单元测试](Day41-55/54.单元测试.md)
+* [Day41-55](day41-55-14/README.md)
+ * [项目上线](Day41-55/55.项目上线.md)
+* [Day56-60](day56-60/README.md)
+ * [用FastAPI开发网络数据接口](Day56-60/56-60.用FastAPI开发数据接口.md)
+* [Day61-65](day61-65/README.md)
+ * [网络数据采集概述](Day61-65/61.网络数据采集概述.md)
+* [Day61-65](day61-65-1/README.md)
+ * [用Python获取网络数据](Day61-65/62.用Python获取网络资源-1.md)
+* [Day61-65](day61-65-2/README.md)
+ * [用Python解析HTML页面](Day61-65/62.用Python解析HTML页面-2.md)
+* [Day61-65](day61-65-3/README.md)
+ * [Python中的并发编程-1](Day61-65/63.Python中的并发编程-1.md)
+* [Day61-65](day61-65-4/README.md)
+ * [Python中的并发编程-2](Day61-65/63.Python中的并发编程-2.md)
+* [Day61-65](day61-65-5/README.md)
+ * [Python中的并发编程-3](Day61-65/63.Python中的并发编程-3.md)
+* [Day61-65](day61-65-6/README.md)
+ * [并发编程在爬虫中的应用](Day61-65/63.并发编程在爬虫中的应用.md)
+* [Day61-65](day61-65-7/README.md)
+ * [使用Selenium抓取网页动态内容](Day61-65/64.使用Selenium抓取网页动态内容.md)
+* [Day61-65](day61-65-8/README.md)
+ * [爬虫框架Scrapy简介](Day61-65/65.爬虫框架Scrapy简介.md)
+* [Day66-80](day66-80/README.md)
+ * [数据分析概述](Day66-80/66.数据分析概述.md)
+* [Day66-80](day66-80-1/README.md)
+ * [环境准备](Day66-80/67.环境准备.md)
+* [Day66-80](day66-80-2/README.md)
+ * [NumPy的应用-1](Day66-80/68.NumPy的应用-1.md)
+* [Day66-80](day66-80-3/README.md)
+ * [NumPy的应用-2](Day66-80/69.NumPy的应用-2.md)
+* [Day66-80](day66-80-4/README.md)
+ * [NumPy的应用-3](Day66-80/70.NumPy的应用-3.md)
+* [Day66-80](day66-80-5/README.md)
+ * [NumPy的应用-4](Day66-80/71.NumPy的应用-4.md)
+* [Day66-80](day66-80-6/README.md)
+ * [深入浅出pandas-1](Day66-80/72.深入浅出pandas-1.md)
+* [Day66-80](day66-80-7/README.md)
+ * [深入浅出pandas-2](Day66-80/73.深入浅出pandas-2.md)
+* [Day66-80](day66-80-8/README.md)
+ * [深入浅出pandas-3](Day66-80/74.深入浅出pandas-3.md)
+* [Day66-80](day66-80-9/README.md)
+ * [深入浅出pandas-4](Day66-80/75.深入浅出pandas-4.md)
+* [Day66-80](day66-80-10/README.md)
+ * [深入浅出pandas-5](Day66-80/76.深入浅出pandas-5.md)
+* [Day66-80](day66-80-11/README.md)
+ * [深入浅出pandas-6](Day66-80/77.深入浅出pandas-6.md)
+* [Day66-80](day66-80-12/README.md)
+ * [数据可视化-1](Day66-80/78.数据可视化-1.md)
+* [Day66-80](day66-80-13/README.md)
+ * [数据可视化-2](Day66-80/79.数据可视化-2.md)
+* [Day66-80](day66-80-14/README.md)
+ * [数据可视化-3](Day66-80/80.数据可视化-3.md)
+* [Day81-90](day81-90/README.md)
+ * [人工智能和机器学习概述](Day81-90/81.人工智能和机器学习概述.md)
+* [Day81-90](day81-90-1/README.md)
+ * [k最近邻分类](Day81-90/82.k最近邻分类.md)
+* [Day81-90](day81-90-2/README.md)
+ * [决策树](Day81-90/83.决策树.md)
+* [Day81-90](day81-90-3/README.md)
+ * [推荐系统实战(1)](Day81-90/83.推荐系统实战-1.md)
+* [Day81-90](day81-90-4/README.md)
+ * [贝叶斯分类](Day81-90/84.贝叶斯分类.md)
+* [Day81-90](day81-90-5/README.md)
+ * [支持向量机](Day81-90/85.支持向量机.md)
+* [Day81-90](day81-90-6/README.md)
+ * [K-均值聚类](Day81-90/86.K-均值聚类.md)
+* [Day81-90](day81-90-7/README.md)
+ * [回归分析](Day81-90/87.回归分析.md)
+* [Day81-90](day81-90-8/README.md)
+ * [Tensorflow入门](Day81-90/88.深度学习入门.md)
+* [Day81-90](day81-90-9/README.md)
+ * [PyTorch入门](Day81-90/89.PyTorch概述.md)
+* [Day81-90](day81-90-10/README.md)
+ * [PyTorch实战](Day81-90/90.PyTorch实战.md)
+* [Day91-100](day91-100/README.md)
+ * [Python面试题实录](Day91-100/100.Python面试题实录.md)
+* [Day91-100](day91-100-1/README.md)
+ * [团队项目开发的问题和解决方案](Day91-100/91.团队项目开发的问题和解决方案.md)
+* [Day91-100](day91-100-2/README.md)
+ * [Docker容器技术详解](Day91-100/92.Docker容器技术详解.md)
+* [Day91-100](day91-100-3/README.md)
+ * [MySQL性能优化](Day91-100/93.MySQL性能优化.md)
+* [Day91-100](day91-100-4/README.md)
+ * [网络API接口设计](Day91-100/94.网络API接口设计.md)
+* [Day91-100](day91-100-5/README.md)
+ * [使用Django开发商业项目](Day91-100/95.使用Django开发商业项目.md)
+* [Day91-100](day91-100-6/README.md)
+ * [软件测试和自动化测试](Day91-100/96.软件测试和自动化测试.md)
+* [Day91-100](day91-100-7/README.md)
+ * [电商网站技术要点剖析](Day91-100/97.电商网站技术要点剖析.md)
+* [Day91-100](day91-100-8/README.md)
+ * [项目部署上线指南](Day91-100/98.项目部署上线和性能调优.md)
+* [Day91-100](day91-100-9/README.md)
+ * [面试中的公共问题](Day91-100/99.面试中的公共问题.md)
+* [番外篇](fan-wai-pian/README.md)
+ * [PEP 8风格指南](番外篇/PEP8风格指南.md)
+* [番外篇](fan-wai-pian-1/README.md)
+ * [Zen of Python(Python之禅)](番外篇/Python之禅的最佳翻译.md)
+* [番外篇](fan-wai-pian-2/README.md)
+ * [Python参考书籍](番外篇/Python参考书籍.md)
+* [番外篇](fan-wai-pian-3/README.md)
+ * [Python容器类型使用小技巧](番外篇/Python容器使用小技巧.md)
+* [番外篇](fan-wai-pian-4/README.md)
+ * [Python数据分析师面试题](番外篇/Python数据分析师面试题.md)
+* [番外篇](fan-wai-pian-5/README.md)
+ * [Python编程惯例](番外篇/Python编程惯例.md)
+* [番外篇](fan-wai-pian-6/README.md)
+ * [一个小例子助你彻底理解协程](番外篇/一个小例子助你彻底理解协程.md)
+* [番外篇](fan-wai-pian-7/README.md)
+ * [使用Hexo搭建自己的博客](番外篇/使用Hexo搭建自己的博客.md)
+* [番外篇](fan-wai-pian-8/README.md)
+ * [常见反爬策略及应对方案](番外篇/常见反爬策略及应对方案.md)
+* [番外篇](fan-wai-pian-9/README.md)
+ * [我为什么选择了Python](番外篇/我为什么选择了Python.md)
+* [番外篇](fan-wai-pian-10/README.md)
+ * [接口文档参考示例](番外篇/接口文档参考示例.md)
+* [番外篇](fan-wai-pian-11/README.md)
+ * [玩转PyCharm](番外篇/玩转PyCharm.md)
+* [番外篇](fan-wai-pian-12/README.md)
+ * [用函数还是用复杂的表达式](番外篇/用函数还是用复杂的表达式.md)
+* [番外篇](fan-wai-pian-13/README.md)
+ * [知乎问题回答](番外篇/知乎问题回答.md)
+* [番外篇](fan-wai-pian-14/README.md)
+ * [英语面试](番外篇/英语面试.md)
+* [番外篇](fan-wai-pian-15/README.md)
+ * [那些年我们踩过的那些坑](番外篇/那些年我们踩过的那些坑.md)
+* [公开课](gong-kai-ke/README.md)
+ * [文档](gong-kai-ke/wen-dang/README.md)
+ * [年薪50W+的Python程序员如何写代码](gong-kai-ke/wen-dang/nian-xin-50w+-de-python-cheng-xu-yuan-ru-he-xie-dai-ma/README.md)
+ * [年薪50W+的Python程序员如何写代码](公开课/文档/年薪50W+的Python程序员如何写代码/年薪50W+的Python程序员如何写代码.md)
+* [公开课](gong-kai-ke-1/README.md)
+ * [文档](gong-kai-ke-1/wen-dang/README.md)
+ * [第04次公开课-好玩的Python](gong-kai-ke-1/wen-dang/di-04-ci-gong-kai-ke-hao-wan-de-python/README.md)
+ * [好玩的Python](公开课/文档/第04次公开课-好玩的Python/好玩的Python.md)
+* [公开课](gong-kai-ke-2/README.md)
+ * [文档](gong-kai-ke-2/wen-dang/README.md)
+ * [第05次公开课-算法入门系列1-周而复始](gong-kai-ke-2/wen-dang/di-05-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-1-zhou-er-fu-shi/README.md)
+ * [算法入门系列课程1 - 周而复始](公开课/文档/第05次公开课-算法入门系列1-周而复始/算法入门系列1-周而复始.md)
+* [公开课](gong-kai-ke-3/README.md)
+ * [文档](gong-kai-ke-3/wen-dang/README.md)
+ * [第06次公开课-算法入门系列2-在水一方](gong-kai-ke-3/wen-dang/di-06-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-2-zai-shui-yi-fang/README.md)
+ * [算法入门系列2 - 在水一方](<公开课/文档/第06次公开课-算法入门系列2-在水一方/算法入门系列2 - 在水一方.md>)
diff --git a/day01-15-1/README.md b/day01-15-1/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-1/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-10/README.md b/day01-15-10/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-10/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-11/README.md b/day01-15-11/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-11/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-12/README.md b/day01-15-12/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-12/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-13/README.md b/day01-15-13/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-13/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-14/README.md b/day01-15-14/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-14/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-2/README.md b/day01-15-2/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-2/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-3/README.md b/day01-15-3/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-3/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-4/README.md b/day01-15-4/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-4/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-5/README.md b/day01-15-5/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-5/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-6/README.md b/day01-15-6/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-6/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-7/README.md b/day01-15-7/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-7/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-8/README.md b/day01-15-8/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-8/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15-9/README.md b/day01-15-9/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15-9/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day01-15/README.md b/day01-15/README.md
new file mode 100644
index 0000000000..74af26405c
--- /dev/null
+++ b/day01-15/README.md
@@ -0,0 +1,2 @@
+# Day01-15
+
diff --git a/day16-20/README.md b/day16-20/README.md
new file mode 100644
index 0000000000..900442a379
--- /dev/null
+++ b/day16-20/README.md
@@ -0,0 +1,2 @@
+# Day16-20
+
diff --git a/day21-30/README.md b/day21-30/README.md
new file mode 100644
index 0000000000..3426d2b5ef
--- /dev/null
+++ b/day21-30/README.md
@@ -0,0 +1,2 @@
+# Day21-30
+
diff --git a/day31-35/README.md b/day31-35/README.md
new file mode 100644
index 0000000000..26ebd7b7ff
--- /dev/null
+++ b/day31-35/README.md
@@ -0,0 +1,2 @@
+# Day31-35
+
diff --git a/day36-40-1/README.md b/day36-40-1/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40-1/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day36-40-2/README.md b/day36-40-2/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40-2/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day36-40-3/README.md b/day36-40-3/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40-3/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day36-40-4/README.md b/day36-40-4/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40-4/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day36-40-5/README.md b/day36-40-5/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40-5/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day36-40/README.md b/day36-40/README.md
new file mode 100644
index 0000000000..98a0819def
--- /dev/null
+++ b/day36-40/README.md
@@ -0,0 +1,2 @@
+# Day36-40
+
diff --git a/day41-55-1/README.md b/day41-55-1/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-1/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-10/README.md b/day41-55-10/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-10/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-11/README.md b/day41-55-11/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-11/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-12/README.md b/day41-55-12/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-12/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-13/README.md b/day41-55-13/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-13/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-14/README.md b/day41-55-14/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-14/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-2/README.md b/day41-55-2/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-2/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-3/README.md b/day41-55-3/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-3/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-4/README.md b/day41-55-4/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-4/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-5/README.md b/day41-55-5/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-5/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-6/README.md b/day41-55-6/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-6/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-7/README.md b/day41-55-7/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-7/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-8/README.md b/day41-55-8/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-8/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55-9/README.md b/day41-55-9/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55-9/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day41-55/README.md b/day41-55/README.md
new file mode 100644
index 0000000000..40de9e0134
--- /dev/null
+++ b/day41-55/README.md
@@ -0,0 +1,2 @@
+# Day41-55
+
diff --git a/day56-60/README.md b/day56-60/README.md
new file mode 100644
index 0000000000..020f75fdbd
--- /dev/null
+++ b/day56-60/README.md
@@ -0,0 +1,2 @@
+# Day56-60
+
diff --git a/day61-65-1/README.md b/day61-65-1/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-1/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-2/README.md b/day61-65-2/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-2/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-3/README.md b/day61-65-3/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-3/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-4/README.md b/day61-65-4/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-4/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-5/README.md b/day61-65-5/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-5/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-6/README.md b/day61-65-6/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-6/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-7/README.md b/day61-65-7/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-7/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65-8/README.md b/day61-65-8/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65-8/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day61-65/README.md b/day61-65/README.md
new file mode 100644
index 0000000000..ef96c6b53d
--- /dev/null
+++ b/day61-65/README.md
@@ -0,0 +1,2 @@
+# Day61-65
+
diff --git a/day66-80-1/README.md b/day66-80-1/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-1/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-10/README.md b/day66-80-10/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-10/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-11/README.md b/day66-80-11/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-11/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-12/README.md b/day66-80-12/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-12/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-13/README.md b/day66-80-13/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-13/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-14/README.md b/day66-80-14/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-14/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-2/README.md b/day66-80-2/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-2/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-3/README.md b/day66-80-3/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-3/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-4/README.md b/day66-80-4/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-4/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-5/README.md b/day66-80-5/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-5/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-6/README.md b/day66-80-6/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-6/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-7/README.md b/day66-80-7/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-7/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-8/README.md b/day66-80-8/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-8/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80-9/README.md b/day66-80-9/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80-9/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day66-80/README.md b/day66-80/README.md
new file mode 100644
index 0000000000..e6a5758faa
--- /dev/null
+++ b/day66-80/README.md
@@ -0,0 +1,2 @@
+# Day66-80
+
diff --git a/day81-90-1/README.md b/day81-90-1/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-1/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-10/README.md b/day81-90-10/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-10/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-2/README.md b/day81-90-2/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-2/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-3/README.md b/day81-90-3/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-3/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-4/README.md b/day81-90-4/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-4/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-5/README.md b/day81-90-5/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-5/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-6/README.md b/day81-90-6/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-6/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-7/README.md b/day81-90-7/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-7/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-8/README.md b/day81-90-8/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-8/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90-9/README.md b/day81-90-9/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90-9/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day81-90/README.md b/day81-90/README.md
new file mode 100644
index 0000000000..9830dd998e
--- /dev/null
+++ b/day81-90/README.md
@@ -0,0 +1,2 @@
+# Day81-90
+
diff --git a/day91-100-1/README.md b/day91-100-1/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-1/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-2/README.md b/day91-100-2/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-2/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-3/README.md b/day91-100-3/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-3/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-4/README.md b/day91-100-4/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-4/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-5/README.md b/day91-100-5/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-5/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-6/README.md b/day91-100-6/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-6/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-7/README.md b/day91-100-7/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-7/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-8/README.md b/day91-100-8/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-8/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100-9/README.md b/day91-100-9/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100-9/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/day91-100/README.md b/day91-100/README.md
new file mode 100644
index 0000000000..07d5ec8322
--- /dev/null
+++ b/day91-100/README.md
@@ -0,0 +1,2 @@
+# Day91-100
+
diff --git a/fan-wai-pian-1/README.md b/fan-wai-pian-1/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-1/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-10/README.md b/fan-wai-pian-10/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-10/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-11/README.md b/fan-wai-pian-11/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-11/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-12/README.md b/fan-wai-pian-12/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-12/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-13/README.md b/fan-wai-pian-13/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-13/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-14/README.md b/fan-wai-pian-14/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-14/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-15/README.md b/fan-wai-pian-15/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-15/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-2/README.md b/fan-wai-pian-2/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-2/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-3/README.md b/fan-wai-pian-3/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-3/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-4/README.md b/fan-wai-pian-4/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-4/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-5/README.md b/fan-wai-pian-5/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-5/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-6/README.md b/fan-wai-pian-6/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-6/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-7/README.md b/fan-wai-pian-7/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-7/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-8/README.md b/fan-wai-pian-8/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-8/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian-9/README.md b/fan-wai-pian-9/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian-9/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/fan-wai-pian/README.md b/fan-wai-pian/README.md
new file mode 100644
index 0000000000..c4ca50cb2e
--- /dev/null
+++ b/fan-wai-pian/README.md
@@ -0,0 +1,2 @@
+# 番外篇
+
diff --git a/gong-kai-ke-1/README.md b/gong-kai-ke-1/README.md
new file mode 100644
index 0000000000..16d470f983
--- /dev/null
+++ b/gong-kai-ke-1/README.md
@@ -0,0 +1,2 @@
+# 公开课
+
diff --git a/gong-kai-ke-1/wen-dang/README.md b/gong-kai-ke-1/wen-dang/README.md
new file mode 100644
index 0000000000..4f03d405a9
--- /dev/null
+++ b/gong-kai-ke-1/wen-dang/README.md
@@ -0,0 +1,2 @@
+# 文档
+
diff --git a/gong-kai-ke-1/wen-dang/di-04-ci-gong-kai-ke-hao-wan-de-python/README.md b/gong-kai-ke-1/wen-dang/di-04-ci-gong-kai-ke-hao-wan-de-python/README.md
new file mode 100644
index 0000000000..c42e63375d
--- /dev/null
+++ b/gong-kai-ke-1/wen-dang/di-04-ci-gong-kai-ke-hao-wan-de-python/README.md
@@ -0,0 +1,2 @@
+# 第04次公开课-好玩的Python
+
diff --git a/gong-kai-ke-2/README.md b/gong-kai-ke-2/README.md
new file mode 100644
index 0000000000..16d470f983
--- /dev/null
+++ b/gong-kai-ke-2/README.md
@@ -0,0 +1,2 @@
+# 公开课
+
diff --git a/gong-kai-ke-2/wen-dang/README.md b/gong-kai-ke-2/wen-dang/README.md
new file mode 100644
index 0000000000..4f03d405a9
--- /dev/null
+++ b/gong-kai-ke-2/wen-dang/README.md
@@ -0,0 +1,2 @@
+# 文档
+
diff --git a/gong-kai-ke-2/wen-dang/di-05-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-1-zhou-er-fu-shi/README.md b/gong-kai-ke-2/wen-dang/di-05-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-1-zhou-er-fu-shi/README.md
new file mode 100644
index 0000000000..7fcd814bc4
--- /dev/null
+++ b/gong-kai-ke-2/wen-dang/di-05-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-1-zhou-er-fu-shi/README.md
@@ -0,0 +1,2 @@
+# 第05次公开课-算法入门系列1-周而复始
+
diff --git a/gong-kai-ke-3/README.md b/gong-kai-ke-3/README.md
new file mode 100644
index 0000000000..16d470f983
--- /dev/null
+++ b/gong-kai-ke-3/README.md
@@ -0,0 +1,2 @@
+# 公开课
+
diff --git a/gong-kai-ke-3/wen-dang/README.md b/gong-kai-ke-3/wen-dang/README.md
new file mode 100644
index 0000000000..4f03d405a9
--- /dev/null
+++ b/gong-kai-ke-3/wen-dang/README.md
@@ -0,0 +1,2 @@
+# 文档
+
diff --git a/gong-kai-ke-3/wen-dang/di-06-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-2-zai-shui-yi-fang/README.md b/gong-kai-ke-3/wen-dang/di-06-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-2-zai-shui-yi-fang/README.md
new file mode 100644
index 0000000000..64968d20f6
--- /dev/null
+++ b/gong-kai-ke-3/wen-dang/di-06-ci-gong-kai-ke-suan-fa-ru-men-xi-lie-2-zai-shui-yi-fang/README.md
@@ -0,0 +1,2 @@
+# 第06次公开课-算法入门系列2-在水一方
+
diff --git a/gong-kai-ke/README.md b/gong-kai-ke/README.md
new file mode 100644
index 0000000000..16d470f983
--- /dev/null
+++ b/gong-kai-ke/README.md
@@ -0,0 +1,2 @@
+# 公开课
+
diff --git a/gong-kai-ke/wen-dang/README.md b/gong-kai-ke/wen-dang/README.md
new file mode 100644
index 0000000000..4f03d405a9
--- /dev/null
+++ b/gong-kai-ke/wen-dang/README.md
@@ -0,0 +1,2 @@
+# 文档
+
diff --git a/gong-kai-ke/wen-dang/nian-xin-50w+-de-python-cheng-xu-yuan-ru-he-xie-dai-ma/README.md b/gong-kai-ke/wen-dang/nian-xin-50w+-de-python-cheng-xu-yuan-ru-he-xie-dai-ma/README.md
new file mode 100644
index 0000000000..0ad721ed80
--- /dev/null
+++ b/gong-kai-ke/wen-dang/nian-xin-50w+-de-python-cheng-xu-yuan-ru-he-xie-dai-ma/README.md
@@ -0,0 +1,2 @@
+# 年薪50W+的Python程序员如何写代码
+
From cd93eedfa8b96b771c2898b462811dbaee5812df Mon Sep 17 00:00:00 2001
From: 1337428173 <1337428173@qq.com>
Date: Wed, 3 Apr 2024 09:25:13 +0000
Subject: [PATCH 2/3] GITBOOK-1: No subject
---
...55\350\250\200\350\277\233\351\230\266.md" | 1376 ----------
...15\347\253\257\346\246\202\350\277\260.md" | 912 -------
...5\222\214MySQL\346\246\202\350\277\260.md" | 402 ++-
...53\351\200\237\344\270\212\346\211\213.md" | 339 ---
...61\345\205\245\346\250\241\345\236\213.md" | 681 -----
...25\345\205\203\346\265\213\350\257\225.md" | 4 -
...71\347\233\256\344\270\212\347\272\277.md" | 4 -
...47\350\203\275\344\274\230\345\214\226.md" | 312 ---
...47\350\203\275\350\260\203\344\274\230.md" | 883 -------
README.md | 815 +++---
SUMMARY.md | 246 +-
day01-15-1/README.md | 2 -
day01-15-10/README.md | 2 -
day01-15-11/README.md | 2 -
day01-15-12/README.md | 2 -
day01-15-13/README.md | 2 -
day01-15-14/README.md | 2 -
day01-15-2/README.md | 2 -
day01-15-3/README.md | 2 -
day01-15-4/README.md | 2 -
day01-15-5/README.md | 2 -
day01-15-6/README.md | 2 -
day01-15-7/README.md | 2 -
day01-15-8/README.md | 2 -
day01-15-9/README.md | 2 -
.../02.-yu-yan-yuan-su.md | 0
.../03.-fen-zhi-jie-gou.md | 19 +-
.../04.-xun-huan-jie-gou.md | 0
.../05.-gou-zao-cheng-xu-luo-ji.md | 0
.../06.-han-shu-he-mo-kuai-de-shi-yong.md | 35 +-
...i-fu-chuan-he-chang-yong-shu-ju-jie-gou.md | 54 +-
...-mian-xiang-dui-xiang-bian-cheng-ji-chu.md | 36 +-
.../09.-mian-xiang-dui-xiang-jin-jie.md | 33 +-
...-xing-yong-hu-jie-mian-he-you-xi-kai-fa.md | 0
.../11.-wen-jian-he-yi-chang.md | 40 +-
...12.-zi-fu-chuan-he-zheng-ze-biao-da-shi.md | 122 +-
.../13.-jin-cheng-he-xian-cheng.md | 28 +-
...eng-ru-men-he-wang-luo-ying-yong-kai-fa.md | 62 +-
...5.-tu-xiang-he-ban-gong-wen-dang-chu-li.md | 136 +-
day16-20/README.md | 2 -
day21-30/README.md | 2 -
day36-40-1/README.md | 2 -
day36-40-2/README.md | 2 -
day36-40-3/README.md | 2 -
day36-40-4/README.md | 2 -
day36-40-5/README.md | 2 -
.../37.sql-xiang-jie.md | 0
.../38.-shen-ru-mysql.md | 0
....python-cheng-xu-jie-ru-mysql-shu-ju-ku.md | 0
.../40.-da-shu-ju-ping-tai-he-hivesql.md | 0
.../nosql-shu-ju-ku-ru-men.md | 368 ++-
day41-55-1/2130.web-qian-duan-gai-shu.md | 875 +++++++
day41-55-10/README.md | 2 -
day41-55-11/README.md | 2 -
day41-55-12/README.md | 2 -
day41-55-13/README.md | 2 -
day41-55-14/README.md | 2 -
day41-55-2/41.django-kuai-su-shang-shou.md | 333 +++
day41-55-2/42.-shen-ru-mo-xing.md | 647 +++++
.../44.cookie-he-session.md | 79 +-
.../45.-zhi-zuo-bao-biao.md | 14 +-
.../46.-ri-zhi-he-tiao-shi-gong-ju-lan.md | 113 +-
.../47.-zhong-jian-jian-de-ying-yong.md | 29 +-
.../48.-qian-hou-duan-fen-li-kai-fa-ru-men.md | 0
.../49.restful-jia-gou-he-drf-ru-men.md | 70 +-
.../50.restful-jia-gou-he-drf-jin-jie.md | 0
.../51.-shi-yong-huan-cun.md | 26 +-
.../52.-jie-ru-san-fang-ping-tai.md | 54 +-
.../53.-yi-bu-ren-wu-he-ding-shi-ren-wu.md | 0
day41-55-2/54.-dan-yuan-ce-shi.md | 3 +
day41-55-2/55.-xiang-mu-shang-xian.md | 3 +
day41-55-3/README.md | 2 -
day41-55-4/README.md | 2 -
day41-55-5/README.md | 2 -
day41-55-6/README.md | 2 -
day41-55-7/README.md | 2 -
day41-55-8/README.md | 2 -
day41-55-9/README.md | 2 -
day41-55/1620.python-yu-yan-jin-jie.md | 1348 ++++++++++
day61-65-1/README.md | 2 -
day61-65-2/README.md | 2 -
day61-65-3/README.md | 2 -
day61-65-4/README.md | 2 -
day61-65-5/README.md | 2 -
day61-65-6/README.md | 2 -
day61-65-7/README.md | 2 -
day61-65-8/README.md | 2 -
....-yong-python-huo-qu-wang-luo-zi-yuan-1.md | 0
.../62.-yong-python-jie-xi-html-ye-mian-2.md | 0
...n-cheng-zai-pa-chong-zhong-de-ying-yong.md | 0
...63.python-zhong-de-bing-fa-bian-cheng-1.md | 0
...63.python-zhong-de-bing-fa-bian-cheng-2.md | 0
...63.python-zhong-de-bing-fa-bian-cheng-3.md | 0
...enium-zhua-qu-wang-ye-dong-tai-nei-rong.md | 0
.../65.-pa-chong-kuang-jia-scrapy-jian-jie.md | 0
day66-80-1/README.md | 2 -
day66-80-10/README.md | 2 -
day66-80-11/README.md | 2 -
day66-80-12/README.md | 2 -
day66-80-13/README.md | 2 -
day66-80-14/README.md | 2 -
day66-80-2/README.md | 2 -
day66-80-3/README.md | 2 -
day66-80-4/README.md | 2 -
day66-80-5/README.md | 2 -
day66-80-6/README.md | 2 -
day66-80-7/README.md | 2 -
day66-80-8/README.md | 2 -
day66-80-9/README.md | 2 -
.../67.-huan-jing-zhun-bei.md | 149 +-
.../68.numpy-de-ying-yong-1.md | 50 +-
.../69.numpy-de-ying-yong-2.md | 37 +-
.../70.numpy-de-ying-yong-3.md | 116 +-
.../71.numpy-de-ying-yong-4.md | 246 +-
.../72.-shen-ru-qian-chu-pandas1.md | 60 +-
.../73.-shen-ru-qian-chu-pandas2.md | 0
.../74.-shen-ru-qian-chu-pandas3.md | 0
.../75.-shen-ru-qian-chu-pandas4.md | 27 +-
.../76.-shen-ru-qian-chu-pandas5.md | 49 +-
.../77.-shen-ru-qian-chu-pandas6.md | 25 +-
.../78.-shu-ju-ke-shi-hua-1.md | 54 +-
.../79.-shu-ju-ke-shi-hua-2.md | 24 +-
.../80.-shu-ju-ke-shi-hua-3.md | 46 +-
day81-90-1/README.md | 2 -
day81-90-10/README.md | 2 -
day81-90-2/README.md | 2 -
day81-90-3/README.md | 2 -
day81-90-4/README.md | 2 -
day81-90-5/README.md | 2 -
day81-90-6/README.md | 2 -
day81-90-7/README.md | 2 -
day81-90-8/README.md | 2 -
day81-90-9/README.md | 2 -
.../82.k-zui-jin-lin-fen-lei.md | 0
.../83.-jue-ce-shu.md | 0
.../83.-tui-jian-xi-tong-shi-zhan-1.md | 0
.../84.-bei-ye-si-fen-lei.md | 0
.../85.-zhi-chi-xiang-liang-ji.md | 0
.../86.k-jun-zhi-ju-lei.md | 0
.../87.-hui-gui-fen-xi.md | 0
.../88.-shen-du-xue-xi-ru-men.md | 0
.../89.pytorch-gai-shu.md | 0
.../90.pytorch-shi-zhan.md | 0
day91-100-1/README.md | 2 -
day91-100-2/README.md | 2 -
day91-100-3/README.md | 2 -
day91-100-4/README.md | 2 -
day91-100-5/README.md | 2 -
day91-100-6/README.md | 2 -
day91-100-7/README.md | 2 -
day91-100-8/README.md | 2 -
day91-100-9/README.md | 2 -
...-mu-kai-fa-de-wen-ti-he-jie-jue-fang-an.md | 524 ++--
.../92.docker-rong-qi-ji-shu-xiang-jie.md | 543 ++--
day91-100/93.mysql-xing-neng-you-hua.md | 287 +++
.../94.-wang-luo-api-jie-kou-she-ji.md | 0
...hi-yong-django-kai-fa-shang-ye-xiang-mu.md | 2222 ++++++++---------
...-ruan-jian-ce-shi-he-zi-dong-hua-ce-shi.md | 95 +-
...-shang-wang-zhan-ji-shu-yao-dian-pou-xi.md | 987 ++++----
...bu-shu-shang-xian-he-xing-neng-tiao-you.md | 852 +++++++
.../99.-mian-shi-zhong-de-gong-gong-wen-ti.md | 0
...50\350\200\214\345\244\215\345\247\213.md" | 248 +-
...50\346\260\264\344\270\200\346\226\271.md" | 26 +-
...64\346\226\260\346\227\245\345\277\227.md" | 73 +-
...00\344\275\263\347\277\273\350\257\221.md" | 62 +-
...04\350\241\250\350\276\276\345\274\217.md" | 5 +-
166 files changed, 8385 insertions(+), 9071 deletions(-)
delete mode 100755 "Day16-20/16-20.Python\350\257\255\350\250\200\350\277\233\351\230\266.md"
delete mode 100755 "Day21-30/21-30.Web\345\211\215\347\253\257\346\246\202\350\277\260.md"
delete mode 100755 "Day41-55/41.Django\345\277\253\351\200\237\344\270\212\346\211\213.md"
delete mode 100755 "Day41-55/42.\346\267\261\345\205\245\346\250\241\345\236\213.md"
delete mode 100755 "Day41-55/54.\345\215\225\345\205\203\346\265\213\350\257\225.md"
delete mode 100755 "Day41-55/55.\351\241\271\347\233\256\344\270\212\347\272\277.md"
delete mode 100755 "Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md"
delete mode 100755 "Day91-100/98.\351\241\271\347\233\256\351\203\250\347\275\262\344\270\212\347\272\277\345\222\214\346\200\247\350\203\275\350\260\203\344\274\230.md"
delete mode 100644 day01-15-1/README.md
delete mode 100644 day01-15-10/README.md
delete mode 100644 day01-15-11/README.md
delete mode 100644 day01-15-12/README.md
delete mode 100644 day01-15-13/README.md
delete mode 100644 day01-15-14/README.md
delete mode 100644 day01-15-2/README.md
delete mode 100644 day01-15-3/README.md
delete mode 100644 day01-15-4/README.md
delete mode 100644 day01-15-5/README.md
delete mode 100644 day01-15-6/README.md
delete mode 100644 day01-15-7/README.md
delete mode 100644 day01-15-8/README.md
delete mode 100644 day01-15-9/README.md
rename "Day01-15/02.\350\257\255\350\250\200\345\205\203\347\264\240.md" => day01-15/02.-yu-yan-yuan-su.md (100%)
mode change 100755 => 100644
rename "Day01-15/03.\345\210\206\346\224\257\347\273\223\346\236\204.md" => day01-15/03.-fen-zhi-jie-gou.md (90%)
mode change 100755 => 100644
rename "Day01-15/04.\345\276\252\347\216\257\347\273\223\346\236\204.md" => day01-15/04.-xun-huan-jie-gou.md (100%)
mode change 100755 => 100644
rename "Day01-15/05.\346\236\204\351\200\240\347\250\213\345\272\217\351\200\273\350\276\221.md" => day01-15/05.-gou-zao-cheng-xu-luo-ji.md (100%)
mode change 100755 => 100644
rename "Day01-15/06.\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227\347\232\204\344\275\277\347\224\250.md" => day01-15/06.-han-shu-he-mo-kuai-de-shi-yong.md (85%)
mode change 100755 => 100644
rename "Day01-15/07.\345\255\227\347\254\246\344\270\262\345\222\214\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204.md" => day01-15/07.-zi-fu-chuan-he-chang-yong-shu-ju-jie-gou.md (91%)
mode change 100755 => 100644
rename "Day01-15/08.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\237\272\347\241\200.md" => day01-15/08.-mian-xiang-dui-xiang-bian-cheng-ji-chu.md (66%)
mode change 100755 => 100644
rename "Day01-15/09.\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" => day01-15/09.-mian-xiang-dui-xiang-jin-jie.md (96%)
mode change 100755 => 100644
rename "Day01-15/10.\345\233\276\345\275\242\347\224\250\346\210\267\347\225\214\351\235\242\345\222\214\346\270\270\346\210\217\345\274\200\345\217\221.md" => day01-15/10.-tu-xing-yong-hu-jie-mian-he-you-xi-kai-fa.md (100%)
mode change 100755 => 100644
rename "Day01-15/11.\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" => day01-15/11.-wen-jian-he-yi-chang.md (90%)
mode change 100755 => 100644
rename "Day01-15/12.\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" => day01-15/12.-zi-fu-chuan-he-zheng-ze-biao-da-shi.md (58%)
mode change 100755 => 100644
rename "Day01-15/13.\350\277\233\347\250\213\345\222\214\347\272\277\347\250\213.md" => day01-15/13.-jin-cheng-he-xian-cheng.md (96%)
mode change 100755 => 100644
rename "Day01-15/14.\347\275\221\347\273\234\347\274\226\347\250\213\345\205\245\351\227\250\345\222\214\347\275\221\347\273\234\345\272\224\347\224\250\345\274\200\345\217\221.md" => day01-15/14.-wang-luo-bian-cheng-ru-men-he-wang-luo-ying-yong-kai-fa.md (86%)
mode change 100755 => 100644
rename "Day01-15/15.\345\233\276\345\203\217\345\222\214\345\212\236\345\205\254\346\226\207\346\241\243\345\244\204\347\220\206.md" => day01-15/15.-tu-xiang-he-ban-gong-wen-dang-chu-li.md (52%)
mode change 100755 => 100644
delete mode 100644 day16-20/README.md
delete mode 100644 day21-30/README.md
delete mode 100644 day36-40-1/README.md
delete mode 100644 day36-40-2/README.md
delete mode 100644 day36-40-3/README.md
delete mode 100644 day36-40-4/README.md
delete mode 100644 day36-40-5/README.md
rename "Day36-40/37.SQL\350\257\246\350\247\243.md" => day36-40/37.sql-xiang-jie.md (100%)
mode change 100755 => 100644
rename "Day36-40/38.\346\267\261\345\205\245MySQL.md" => day36-40/38.-shen-ru-mysql.md (100%)
mode change 100755 => 100644
rename "Day36-40/39.Python\347\250\213\345\272\217\346\216\245\345\205\245MySQL\346\225\260\346\215\256\345\272\223.md" => day36-40/39.python-cheng-xu-jie-ru-mysql-shu-ju-ku.md (100%)
mode change 100755 => 100644
rename "Day36-40/40.\345\244\247\346\225\260\346\215\256\345\271\263\345\217\260\345\222\214HiveSQL.md" => day36-40/40.-da-shu-ju-ping-tai-he-hivesql.md (100%)
mode change 100755 => 100644
rename "Day36-40/NoSQL\346\225\260\346\215\256\345\272\223\345\205\245\351\227\250.md" => day36-40/nosql-shu-ju-ku-ru-men.md (62%)
mode change 100755 => 100644
create mode 100644 day41-55-1/2130.web-qian-duan-gai-shu.md
delete mode 100644 day41-55-10/README.md
delete mode 100644 day41-55-11/README.md
delete mode 100644 day41-55-12/README.md
delete mode 100644 day41-55-13/README.md
delete mode 100644 day41-55-14/README.md
create mode 100644 day41-55-2/41.django-kuai-su-shang-shou.md
create mode 100644 day41-55-2/42.-shen-ru-mo-xing.md
rename "Day41-55/44.Cookie\345\222\214Session.md" => day41-55-2/44.cookie-he-session.md (85%)
mode change 100755 => 100644
rename "Day41-55/45.\345\210\266\344\275\234\346\212\245\350\241\250.md" => day41-55-2/45.-zhi-zuo-bao-biao.md (83%)
mode change 100755 => 100644
rename "Day41-55/46.\346\227\245\345\277\227\345\222\214\350\260\203\350\257\225\345\267\245\345\205\267\346\240\217.md" => day41-55-2/46.-ri-zhi-he-tiao-shi-gong-ju-lan.md (85%)
mode change 100755 => 100644
rename "Day41-55/47.\344\270\255\351\227\264\344\273\266\347\232\204\345\272\224\347\224\250.md" => day41-55-2/47.-zhong-jian-jian-de-ying-yong.md (91%)
mode change 100755 => 100644
rename "Day41-55/48.\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\345\274\200\345\217\221\345\205\245\351\227\250.md" => day41-55-2/48.-qian-hou-duan-fen-li-kai-fa-ru-men.md (100%)
mode change 100755 => 100644
rename "Day41-55/49.RESTful\346\236\266\346\236\204\345\222\214DRF\345\205\245\351\227\250.md" => day41-55-2/49.restful-jia-gou-he-drf-ru-men.md (91%)
mode change 100755 => 100644
rename "Day41-55/50.RESTful\346\236\266\346\236\204\345\222\214DRF\350\277\233\351\230\266.md" => day41-55-2/50.restful-jia-gou-he-drf-jin-jie.md (100%)
mode change 100755 => 100644
rename "Day41-55/51.\344\275\277\347\224\250\347\274\223\345\255\230.md" => day41-55-2/51.-shi-yong-huan-cun.md (96%)
mode change 100755 => 100644
rename "Day41-55/52.\346\216\245\345\205\245\344\270\211\346\226\271\345\271\263\345\217\260.md" => day41-55-2/52.-jie-ru-san-fang-ping-tai.md (82%)
mode change 100755 => 100644
rename "Day41-55/53.\345\274\202\346\255\245\344\273\273\345\212\241\345\222\214\345\256\232\346\227\266\344\273\273\345\212\241.md" => day41-55-2/53.-yi-bu-ren-wu-he-ding-shi-ren-wu.md (100%)
mode change 100755 => 100644
create mode 100644 day41-55-2/54.-dan-yuan-ce-shi.md
create mode 100644 day41-55-2/55.-xiang-mu-shang-xian.md
delete mode 100644 day41-55-3/README.md
delete mode 100644 day41-55-4/README.md
delete mode 100644 day41-55-5/README.md
delete mode 100644 day41-55-6/README.md
delete mode 100644 day41-55-7/README.md
delete mode 100644 day41-55-8/README.md
delete mode 100644 day41-55-9/README.md
create mode 100644 day41-55/1620.python-yu-yan-jin-jie.md
delete mode 100644 day61-65-1/README.md
delete mode 100644 day61-65-2/README.md
delete mode 100644 day61-65-3/README.md
delete mode 100644 day61-65-4/README.md
delete mode 100644 day61-65-5/README.md
delete mode 100644 day61-65-6/README.md
delete mode 100644 day61-65-7/README.md
delete mode 100644 day61-65-8/README.md
rename "Day61-65/62.\347\224\250Python\350\216\267\345\217\226\347\275\221\347\273\234\350\265\204\346\272\220-1.md" => day61-65/62.-yong-python-huo-qu-wang-luo-zi-yuan-1.md (100%)
mode change 100755 => 100644
rename "Day61-65/62.\347\224\250Python\350\247\243\346\236\220HTML\351\241\265\351\235\242-2.md" => day61-65/62.-yong-python-jie-xi-html-ye-mian-2.md (100%)
mode change 100755 => 100644
rename "Day61-65/63.\345\271\266\345\217\221\347\274\226\347\250\213\345\234\250\347\210\254\350\231\253\344\270\255\347\232\204\345\272\224\347\224\250.md" => day61-65/63.-bing-fa-bian-cheng-zai-pa-chong-zhong-de-ying-yong.md (100%)
mode change 100755 => 100644
rename "Day61-65/63.Python\344\270\255\347\232\204\345\271\266\345\217\221\347\274\226\347\250\213-1.md" => day61-65/63.python-zhong-de-bing-fa-bian-cheng-1.md (100%)
mode change 100755 => 100644
rename "Day61-65/63.Python\344\270\255\347\232\204\345\271\266\345\217\221\347\274\226\347\250\213-2.md" => day61-65/63.python-zhong-de-bing-fa-bian-cheng-2.md (100%)
mode change 100755 => 100644
rename "Day61-65/63.Python\344\270\255\347\232\204\345\271\266\345\217\221\347\274\226\347\250\213-3.md" => day61-65/63.python-zhong-de-bing-fa-bian-cheng-3.md (100%)
mode change 100755 => 100644
rename "Day61-65/64.\344\275\277\347\224\250Selenium\346\212\223\345\217\226\347\275\221\351\241\265\345\212\250\346\200\201\345\206\205\345\256\271.md" => day61-65/64.-shi-yong-selenium-zhua-qu-wang-ye-dong-tai-nei-rong.md (100%)
mode change 100755 => 100644
rename "Day61-65/65.\347\210\254\350\231\253\346\241\206\346\236\266Scrapy\347\256\200\344\273\213.md" => day61-65/65.-pa-chong-kuang-jia-scrapy-jian-jie.md (100%)
mode change 100755 => 100644
delete mode 100644 day66-80-1/README.md
delete mode 100644 day66-80-10/README.md
delete mode 100644 day66-80-11/README.md
delete mode 100644 day66-80-12/README.md
delete mode 100644 day66-80-13/README.md
delete mode 100644 day66-80-14/README.md
delete mode 100644 day66-80-2/README.md
delete mode 100644 day66-80-3/README.md
delete mode 100644 day66-80-4/README.md
delete mode 100644 day66-80-5/README.md
delete mode 100644 day66-80-6/README.md
delete mode 100644 day66-80-7/README.md
delete mode 100644 day66-80-8/README.md
delete mode 100644 day66-80-9/README.md
rename "Day66-80/67.\347\216\257\345\242\203\345\207\206\345\244\207.md" => day66-80/67.-huan-jing-zhun-bei.md (64%)
mode change 100755 => 100644
rename "Day66-80/68.NumPy\347\232\204\345\272\224\347\224\250-1.md" => day66-80/68.numpy-de-ying-yong-1.md (94%)
mode change 100755 => 100644
rename "Day66-80/69.NumPy\347\232\204\345\272\224\347\224\250-2.md" => day66-80/69.numpy-de-ying-yong-2.md (87%)
mode change 100755 => 100644
rename "Day66-80/70.NumPy\347\232\204\345\272\224\347\224\250-3.md" => day66-80/70.numpy-de-ying-yong-3.md (82%)
rename "Day66-80/71.NumPy\347\232\204\345\272\224\347\224\250-4.md" => day66-80/71.numpy-de-ying-yong-4.md (77%)
rename "Day66-80/72.\346\267\261\345\205\245\346\265\205\345\207\272pandas-1.md" => day66-80/72.-shen-ru-qian-chu-pandas1.md (94%)
mode change 100755 => 100644
rename "Day66-80/73.\346\267\261\345\205\245\346\265\205\345\207\272pandas-2.md" => day66-80/73.-shen-ru-qian-chu-pandas2.md (100%)
mode change 100755 => 100644
rename "Day66-80/74.\346\267\261\345\205\245\346\265\205\345\207\272pandas-3.md" => day66-80/74.-shen-ru-qian-chu-pandas3.md (100%)
mode change 100755 => 100644
rename "Day66-80/75.\346\267\261\345\205\245\346\265\205\345\207\272pandas-4.md" => day66-80/75.-shen-ru-qian-chu-pandas4.md (96%)
mode change 100755 => 100644
rename "Day66-80/76.\346\267\261\345\205\245\346\265\205\345\207\272pandas-5.md" => day66-80/76.-shen-ru-qian-chu-pandas5.md (86%)
mode change 100755 => 100644
rename "Day66-80/77.\346\267\261\345\205\245\346\265\205\345\207\272pandas-6.md" => day66-80/77.-shen-ru-qian-chu-pandas6.md (96%)
rename "Day66-80/78.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226-1.md" => day66-80/78.-shu-ju-ke-shi-hua-1.md (86%)
mode change 100755 => 100644
rename "Day66-80/79.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226-2.md" => day66-80/79.-shu-ju-ke-shi-hua-2.md (94%)
rename "Day66-80/80.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226-3.md" => day66-80/80.-shu-ju-ke-shi-hua-3.md (86%)
mode change 100755 => 100644
delete mode 100644 day81-90-1/README.md
delete mode 100644 day81-90-10/README.md
delete mode 100644 day81-90-2/README.md
delete mode 100644 day81-90-3/README.md
delete mode 100644 day81-90-4/README.md
delete mode 100644 day81-90-5/README.md
delete mode 100644 day81-90-6/README.md
delete mode 100644 day81-90-7/README.md
delete mode 100644 day81-90-8/README.md
delete mode 100644 day81-90-9/README.md
rename "Day81-90/82.k\346\234\200\350\277\221\351\202\273\345\210\206\347\261\273.md" => day81-90/82.k-zui-jin-lin-fen-lei.md (100%)
mode change 100755 => 100644
rename "Day81-90/83.\345\206\263\347\255\226\346\240\221.md" => day81-90/83.-jue-ce-shu.md (100%)
mode change 100755 => 100644
rename "Day81-90/83.\346\216\250\350\215\220\347\263\273\347\273\237\345\256\236\346\210\230-1.md" => day81-90/83.-tui-jian-xi-tong-shi-zhan-1.md (100%)
mode change 100755 => 100644
rename "Day81-90/84.\350\264\235\345\217\266\346\226\257\345\210\206\347\261\273.md" => day81-90/84.-bei-ye-si-fen-lei.md (100%)
mode change 100755 => 100644
rename "Day81-90/85.\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272.md" => day81-90/85.-zhi-chi-xiang-liang-ji.md (100%)
mode change 100755 => 100644
rename "Day81-90/86.K-\345\235\207\345\200\274\350\201\232\347\261\273.md" => day81-90/86.k-jun-zhi-ju-lei.md (100%)
mode change 100755 => 100644
rename "Day81-90/87.\345\233\236\345\275\222\345\210\206\346\236\220.md" => day81-90/87.-hui-gui-fen-xi.md (100%)
mode change 100755 => 100644
rename "Day81-90/88.\346\267\261\345\272\246\345\255\246\344\271\240\345\205\245\351\227\250.md" => day81-90/88.-shen-du-xue-xi-ru-men.md (100%)
mode change 100755 => 100644
rename "Day81-90/89.PyTorch\346\246\202\350\277\260.md" => day81-90/89.pytorch-gai-shu.md (100%)
mode change 100755 => 100644
rename "Day81-90/90.PyTorch\345\256\236\346\210\230.md" => day81-90/90.pytorch-shi-zhan.md (100%)
mode change 100755 => 100644
delete mode 100644 day91-100-1/README.md
delete mode 100644 day91-100-2/README.md
delete mode 100644 day91-100-3/README.md
delete mode 100644 day91-100-4/README.md
delete mode 100644 day91-100-5/README.md
delete mode 100644 day91-100-6/README.md
delete mode 100644 day91-100-7/README.md
delete mode 100644 day91-100-8/README.md
delete mode 100644 day91-100-9/README.md
rename "Day91-100/91.\345\233\242\351\230\237\351\241\271\347\233\256\345\274\200\345\217\221\347\232\204\351\227\256\351\242\230\345\222\214\350\247\243\345\206\263\346\226\271\346\241\210.md" => day91-100/91.-tuan-dui-xiang-mu-kai-fa-de-wen-ti-he-jie-jue-fang-an.md (55%)
mode change 100755 => 100644
rename "Day91-100/92.Docker\345\256\271\345\231\250\346\212\200\346\234\257\350\257\246\350\247\243.md" => day91-100/92.docker-rong-qi-ji-shu-xiang-jie.md (67%)
mode change 100755 => 100644
create mode 100644 day91-100/93.mysql-xing-neng-you-hua.md
rename "Day91-100/94.\347\275\221\347\273\234API\346\216\245\345\217\243\350\256\276\350\256\241.md" => day91-100/94.-wang-luo-api-jie-kou-she-ji.md (100%)
mode change 100755 => 100644
rename "Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" => day91-100/95.-shi-yong-django-kai-fa-shang-ye-xiang-mu.md (50%)
mode change 100755 => 100644
rename "Day91-100/96.\350\275\257\344\273\266\346\265\213\350\257\225\345\222\214\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225.md" => day91-100/96.-ruan-jian-ce-shi-he-zi-dong-hua-ce-shi.md (58%)
mode change 100755 => 100644
rename "Day91-100/97.\347\224\265\345\225\206\347\275\221\347\253\231\346\212\200\346\234\257\350\246\201\347\202\271\345\211\226\346\236\220.md" => day91-100/97.-dian-shang-wang-zhan-ji-shu-yao-dian-pou-xi.md (51%)
mode change 100755 => 100644
create mode 100644 day91-100/98.-xiang-mu-bu-shu-shang-xian-he-xing-neng-tiao-you.md
rename "Day91-100/99.\351\235\242\350\257\225\344\270\255\347\232\204\345\205\254\345\205\261\351\227\256\351\242\230.md" => day91-100/99.-mian-shi-zhong-de-gong-gong-wen-ti.md (100%)
mode change 100755 => 100644
diff --git "a/Day16-20/16-20.Python\350\257\255\350\250\200\350\277\233\351\230\266.md" "b/Day16-20/16-20.Python\350\257\255\350\250\200\350\277\233\351\230\266.md"
deleted file mode 100755
index 4f1c607873..0000000000
--- "a/Day16-20/16-20.Python\350\257\255\350\250\200\350\277\233\351\230\266.md"
+++ /dev/null
@@ -1,1376 +0,0 @@
-## Python语言进阶
-
-### 重要知识点
-
-- 生成式(推导式)的用法
-
- ```Python
- prices = {
- 'AAPL': 191.88,
- 'GOOG': 1186.96,
- 'IBM': 149.24,
- 'ORCL': 48.44,
- 'ACN': 166.89,
- 'FB': 208.09,
- 'SYMC': 21.29
- }
- # 用股票价格大于100元的股票构造一个新的字典
- prices2 = {key: value for key, value in prices.items() if value > 100}
- print(prices2)
- ```
-
- > 说明:生成式(推导式)可以用来生成列表、集合和字典。
-
-- 嵌套的列表的坑
-
- ```Python
- names = ['关羽', '张飞', '赵云', '马超', '黄忠']
- courses = ['语文', '数学', '英语']
- # 录入五个学生三门课程的成绩
- # 错误 - 参考http://pythontutor.com/visualize.html#mode=edit
- # scores = [[None] * len(courses)] * len(names)
- scores = [[None] * len(courses) for _ in range(len(names))]
- for row, name in enumerate(names):
- for col, course in enumerate(courses):
- scores[row][col] = float(input(f'请输入{name}的{course}成绩: '))
- print(scores)
- ```
-
- [Python Tutor](http://pythontutor.com/) - VISUALIZE CODE AND GET LIVE HELP
-
-- `heapq`模块(堆排序)
-
- ```Python
- """
- 从列表中找出最大的或最小的N个元素
- 堆结构(大根堆/小根堆)
- """
- import heapq
-
- list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
- list2 = [
- {'name': 'IBM', 'shares': 100, 'price': 91.1},
- {'name': 'AAPL', 'shares': 50, 'price': 543.22},
- {'name': 'FB', 'shares': 200, 'price': 21.09},
- {'name': 'HPQ', 'shares': 35, 'price': 31.75},
- {'name': 'YHOO', 'shares': 45, 'price': 16.35},
- {'name': 'ACME', 'shares': 75, 'price': 115.65}
- ]
- print(heapq.nlargest(3, list1))
- print(heapq.nsmallest(3, list1))
- print(heapq.nlargest(2, list2, key=lambda x: x['price']))
- print(heapq.nlargest(2, list2, key=lambda x: x['shares']))
- ```
-
-- `itertools`模块
-
- ```Python
- """
- 迭代工具模块
- """
- import itertools
-
- # 产生ABCD的全排列
- itertools.permutations('ABCD')
- # 产生ABCDE的五选三组合
- itertools.combinations('ABCDE', 3)
- # 产生ABCD和123的笛卡尔积
- itertools.product('ABCD', '123')
- # 产生ABC的无限循环序列
- itertools.cycle(('A', 'B', 'C'))
- ```
-
-- `collections`模块
-
- 常用的工具类:
-
- - `namedtuple`:命令元组,它是一个类工厂,接受类型的名称和属性列表来创建一个类。
- - `deque`:双端队列,是列表的替代实现。Python中的列表底层是基于数组来实现的,而deque底层是双向链表,因此当你需要在头尾添加和删除元素时,deque会表现出更好的性能,渐近时间复杂度为$O(1)$。
- - `Counter`:`dict`的子类,键是元素,值是元素的计数,它的`most_common()`方法可以帮助我们获取出现频率最高的元素。`Counter`和`dict`的继承关系我认为是值得商榷的,按照CARP原则,`Counter`跟`dict`的关系应该设计为关联关系更为合理。
- - `OrderedDict`:`dict`的子类,它记录了键值对插入的顺序,看起来既有字典的行为,也有链表的行为。
- - `defaultdict`:类似于字典类型,但是可以通过默认的工厂函数来获得键对应的默认值,相比字典中的`setdefault()`方法,这种做法更加高效。
-
- ```Python
- """
- 找出序列中出现次数最多的元素
- """
- from collections import Counter
-
- words = [
- 'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
- 'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around',
- 'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes',
- 'look', 'into', 'my', 'eyes', "you're", 'under'
- ]
- counter = Counter(words)
- print(counter.most_common(3))
- ```
-
-### 数据结构和算法
-
-- 算法:解决问题的方法和步骤
-
-- 评价算法的好坏:渐近时间复杂度和渐近空间复杂度。
-
-- 渐近时间复杂度的大O标记:
- - - 常量时间复杂度 - 布隆过滤器 / 哈希存储
- -
- 对数时间复杂度 - 折半查找(二分查找)
- -
- 线性时间复杂度 - 顺序查找 / 计数排序
- -
- 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序)
- -
- 平方时间复杂度 - 简单排序算法(选择排序、插入排序、冒泡排序)
- -
- 立方时间复杂度 - Floyd算法 / 矩阵乘法运算
- -
- 几何级数时间复杂度 - 汉诺塔
- -
- 阶乘时间复杂度 - 旅行经销商问题 - NPC
-
- 
-
- 
-
-- 排序算法(选择、冒泡和归并)和查找算法(顺序和折半)
-
- ```Python
- def select_sort(items, comp=lambda x, y: x < y):
- """简单选择排序"""
- items = items[:]
- for i in range(len(items) - 1):
- min_index = i
- for j in range(i + 1, len(items)):
- if comp(items[j], items[min_index]):
- min_index = j
- items[i], items[min_index] = items[min_index], items[i]
- return items
- ```
-
- ```Python
- def bubble_sort(items, comp=lambda x, y: x > y):
- """冒泡排序"""
- items = items[:]
- for i in range(len(items) - 1):
- swapped = False
- for j in range(len(items) - 1 - i):
- if comp(items[j], items[j + 1]):
- items[j], items[j + 1] = items[j + 1], items[j]
- swapped = True
- if not swapped:
- break
- return items
- ```
-
- ```Python
- def bubble_sort(items, comp=lambda x, y: x > y):
- """搅拌排序(冒泡排序升级版)"""
- items = items[:]
- for i in range(len(items) - 1):
- swapped = False
- for j in range(len(items) - 1 - i):
- if comp(items[j], items[j + 1]):
- items[j], items[j + 1] = items[j + 1], items[j]
- swapped = True
- if swapped:
- swapped = False
- for j in range(len(items) - 2 - i, i, -1):
- if comp(items[j - 1], items[j]):
- items[j], items[j - 1] = items[j - 1], items[j]
- swapped = True
- if not swapped:
- break
- return items
- ```
-
- ```Python
- def merge(items1, items2, comp=lambda x, y: x < y):
- """合并(将两个有序的列表合并成一个有序的列表)"""
- items = []
- index1, index2 = 0, 0
- while index1 < len(items1) and index2 < len(items2):
- if comp(items1[index1], items2[index2]):
- items.append(items1[index1])
- index1 += 1
- else:
- items.append(items2[index2])
- index2 += 1
- items += items1[index1:]
- items += items2[index2:]
- return items
-
-
- def merge_sort(items, comp=lambda x, y: x < y):
- return _merge_sort(list(items), comp)
-
-
- def _merge_sort(items, comp):
- """归并排序"""
- if len(items) < 2:
- return items
- mid = len(items) // 2
- left = _merge_sort(items[:mid], comp)
- right = _merge_sort(items[mid:], comp)
- return merge(left, right, comp)
- ```
-
- ```Python
- def seq_search(items, key):
- """顺序查找"""
- for index, item in enumerate(items):
- if item == key:
- return index
- return -1
- ```
-
- ```Python
- def bin_search(items, key):
- """折半查找"""
- start, end = 0, len(items) - 1
- while start <= end:
- mid = (start + end) // 2
- if key > items[mid]:
- start = mid + 1
- elif key < items[mid]:
- end = mid - 1
- else:
- return mid
- return -1
- ```
-
-- 常用算法:
-
- - 穷举法 - 又称为暴力破解法,对所有的可能性进行验证,直到找到正确答案。
- - 贪婪法 - 在对问题求解时,总是做出在当前看来
- - 最好的选择,不追求最优解,快速找到满意解。
- - 分治法 - 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到可以直接求解的程度,最后将子问题的解进行合并得到原问题的解。
- - 回溯法 - 回溯法又称为试探法,按选优条件向前搜索,当搜索到某一步发现原先选择并不优或达不到目标时,就退回一步重新选择。
- - 动态规划 - 基本思想也是将待求解问题分解成若干个子问题,先求解并保存这些子问题的解,避免产生大量的重复运算。
-
- 穷举法例子:百钱百鸡和五人分鱼。
-
- ```Python
- # 公鸡5元一只 母鸡3元一只 小鸡1元三只
- # 用100元买100只鸡 问公鸡/母鸡/小鸡各多少只
- for x in range(20):
- for y in range(33):
- z = 100 - x - y
- if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:
- print(x, y, z)
-
- # A、B、C、D、E五人在某天夜里合伙捕鱼 最后疲惫不堪各自睡觉
- # 第二天A第一个醒来 他将鱼分为5份 扔掉多余的1条 拿走自己的一份
- # B第二个醒来 也将鱼分为5份 扔掉多余的1条 拿走自己的一份
- # 然后C、D、E依次醒来也按同样的方式分鱼 问他们至少捕了多少条鱼
- fish = 6
- while True:
- total = fish
- enough = True
- for _ in range(5):
- if (total - 1) % 5 == 0:
- total = (total - 1) // 5 * 4
- else:
- enough = False
- break
- if enough:
- print(fish)
- break
- fish += 5
- ```
-
- 贪婪法例子:假设小偷有一个背包,最多能装20公斤赃物,他闯入一户人家,发现如下表所示的物品。很显然,他不能把所有物品都装进背包,所以必须确定拿走哪些物品,留下哪些物品。
-
- | 名称 | 价格(美元) | 重量(kg) |
- | :----: | :----------: | :--------: |
- | 电脑 | 200 | 20 |
- | 收音机 | 20 | 4 |
- | 钟 | 175 | 10 |
- | 花瓶 | 50 | 2 |
- | 书 | 10 | 1 |
- | 油画 | 90 | 9 |
-
- ```Python
- """
- 贪婪法:在对问题求解时,总是做出在当前看来是最好的选择,不追求最优解,快速找到满意解。
- 输入:
- 20 6
- 电脑 200 20
- 收音机 20 4
- 钟 175 10
- 花瓶 50 2
- 书 10 1
- 油画 90 9
- """
- class Thing(object):
- """物品"""
-
- def __init__(self, name, price, weight):
- self.name = name
- self.price = price
- self.weight = weight
-
- @property
- def value(self):
- """价格重量比"""
- return self.price / self.weight
-
-
- def input_thing():
- """输入物品信息"""
- name_str, price_str, weight_str = input().split()
- return name_str, int(price_str), int(weight_str)
-
-
- def main():
- """主函数"""
- max_weight, num_of_things = map(int, input().split())
- all_things = []
- for _ in range(num_of_things):
- all_things.append(Thing(*input_thing()))
- all_things.sort(key=lambda x: x.value, reverse=True)
- total_weight = 0
- total_price = 0
- for thing in all_things:
- if total_weight + thing.weight <= max_weight:
- print(f'小偷拿走了{thing.name}')
- total_weight += thing.weight
- total_price += thing.price
- print(f'总价值: {total_price}美元')
-
-
- if __name__ == '__main__':
- main()
- ```
-
- 分治法例子:[快速排序](https://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F)。
-
- ```Python
- """
- 快速排序 - 选择枢轴对元素进行划分,左边都比枢轴小右边都比枢轴大
- """
- def quick_sort(items, comp=lambda x, y: x <= y):
- items = list(items)[:]
- _quick_sort(items, 0, len(items) - 1, comp)
- return items
-
-
- def _quick_sort(items, start, end, comp):
- if start < end:
- pos = _partition(items, start, end, comp)
- _quick_sort(items, start, pos - 1, comp)
- _quick_sort(items, pos + 1, end, comp)
-
-
- def _partition(items, start, end, comp):
- pivot = items[end]
- i = start - 1
- for j in range(start, end):
- if comp(items[j], pivot):
- i += 1
- items[i], items[j] = items[j], items[i]
- items[i + 1], items[end] = items[end], items[i + 1]
- return i + 1
- ```
-
- 回溯法例子:[骑士巡逻](https://zh.wikipedia.org/zh/%E9%AA%91%E5%A3%AB%E5%B7%A1%E9%80%BB)。
-
- ```Python
- """
- 递归回溯法:叫称为试探法,按选优条件向前搜索,当搜索到某一步,发现原先选择并不优或达不到目标时,就退回一步重新选择,比较经典的问题包括骑士巡逻、八皇后和迷宫寻路等。
- """
- import sys
- import time
-
- SIZE = 5
- total = 0
-
-
- def print_board(board):
- for row in board:
- for col in row:
- print(str(col).center(4), end='')
- print()
-
-
- def patrol(board, row, col, step=1):
- if row >= 0 and row < SIZE and \
- col >= 0 and col < SIZE and \
- board[row][col] == 0:
- board[row][col] = step
- if step == SIZE * SIZE:
- global total
- total += 1
- print(f'第{total}种走法: ')
- print_board(board)
- patrol(board, row - 2, col - 1, step + 1)
- patrol(board, row - 1, col - 2, step + 1)
- patrol(board, row + 1, col - 2, step + 1)
- patrol(board, row + 2, col - 1, step + 1)
- patrol(board, row + 2, col + 1, step + 1)
- patrol(board, row + 1, col + 2, step + 1)
- patrol(board, row - 1, col + 2, step + 1)
- patrol(board, row - 2, col + 1, step + 1)
- board[row][col] = 0
-
-
- def main():
- board = [[0] * SIZE for _ in range(SIZE)]
- patrol(board, SIZE - 1, SIZE - 1)
-
-
- if __name__ == '__main__':
- main()
- ```
-
- 动态规划例子:子列表元素之和的最大值。
-
- > 说明:子列表指的是列表中索引(下标)连续的元素构成的列表;列表中的元素是int类型,可能包含正整数、0、负整数;程序输入列表中的元素,输出子列表元素求和的最大值,例如:
- >
- > 输入:1 -2 3 5 -3 2
- >
- > 输出:8
- >
- > 输入:0 -2 3 5 -1 2
- >
- > 输出:9
- >
- > 输入:-9 -2 -3 -5 -3
- >
- > 输出:-2
-
- ```Python
- def main():
- items = list(map(int, input().split()))
- overall = partial = items[0]
- for i in range(1, len(items)):
- partial = max(items[i], partial + items[i])
- overall = max(partial, overall)
- print(overall)
-
-
- if __name__ == '__main__':
- main()
- ```
-
- > **说明**:这个题目最容易想到的解法是使用二重循环,但是代码的时间性能将会变得非常的糟糕。使用动态规划的思想,仅仅是多用了两个变量,就将原来$O(N^2)$复杂度的问题变成了$O(N)$。
-
-### 函数的使用方式
-
-- 将函数视为“一等公民”
-
- - 函数可以赋值给变量
- - 函数可以作为函数的参数
- - 函数可以作为函数的返回值
-
-- 高阶函数的用法(`filter`、`map`以及它们的替代品)
-
- ```Python
- items1 = list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10))))
- items2 = [x ** 2 for x in range(1, 10) if x % 2]
- ```
-
-- 位置参数、可变参数、关键字参数、命名关键字参数
-
-- 参数的元信息(代码可读性问题)
-
-- 匿名函数和内联函数的用法(`lambda`函数)
-
-- 闭包和作用域问题
-
- - Python搜索变量的LEGB顺序(Local >>> Embedded >>> Global >>> Built-in)
-
- - `global`和`nonlocal`关键字的作用
-
- `global`:声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)。
-
- `nonlocal`:声明使用嵌套作用域的变量(嵌套作用域必须存在该变量,否则报错)。
-
-- 装饰器函数(使用装饰器和取消装饰器)
-
- 例子:输出函数执行时间的装饰器。
-
- ```Python
- def record_time(func):
- """自定义装饰函数的装饰器"""
-
- @wraps(func)
- def wrapper(*args, **kwargs):
- start = time()
- result = func(*args, **kwargs)
- print(f'{func.__name__}: {time() - start}秒')
- return result
-
- return wrapper
- ```
-
- 如果装饰器不希望跟`print`函数耦合,可以编写可以参数化的装饰器。
-
- ```Python
- from functools import wraps
- from time import time
-
-
- def record(output):
- """可以参数化的装饰器"""
-
- def decorate(func):
-
- @wraps(func)
- def wrapper(*args, **kwargs):
- start = time()
- result = func(*args, **kwargs)
- output(func.__name__, time() - start)
- return result
-
- return wrapper
-
- return decorate
- ```
-
- ```Python
- from functools import wraps
- from time import time
-
-
- class Record():
- """通过定义类的方式定义装饰器"""
-
- def __init__(self, output):
- self.output = output
-
- def __call__(self, func):
-
- @wraps(func)
- def wrapper(*args, **kwargs):
- start = time()
- result = func(*args, **kwargs)
- self.output(func.__name__, time() - start)
- return result
-
- return wrapper
- ```
-
- > **说明**:由于对带装饰功能的函数添加了@wraps装饰器,可以通过`func.__wrapped__`方式获得被装饰之前的函数或类来取消装饰器的作用。
-
- 例子:用装饰器来实现单例模式。
-
- ```Python
- from functools import wraps
-
-
- def singleton(cls):
- """装饰类的装饰器"""
- instances = {}
-
- @wraps(cls)
- def wrapper(*args, **kwargs):
- if cls not in instances:
- instances[cls] = cls(*args, **kwargs)
- return instances[cls]
-
- return wrapper
-
-
- @singleton
- class President:
- """总统(单例类)"""
- pass
- ```
-
- > **提示**:上面的代码中用到了闭包(closure),不知道你是否已经意识到了。还没有一个小问题就是,上面的代码并没有实现线程安全的单例,如果要实现线程安全的单例应该怎么做呢?
-
- 线程安全的单例装饰器。
-
- ```Python
- from functools import wraps
- from threading import RLock
-
-
- def singleton(cls):
- """线程安全的单例装饰器"""
- instances = {}
- locker = RLock()
-
- @wraps(cls)
- def wrapper(*args, **kwargs):
- if cls not in instances:
- with locker:
- if cls not in instances:
- instances[cls] = cls(*args, **kwargs)
- return instances[cls]
-
- return wrapper
- ```
-
- > **提示**:上面的代码用到了`with`上下文语法来进行锁操作,因为锁对象本身就是上下文管理器对象(支持`__enter__`和`__exit__`魔术方法)。在`wrapper`函数中,我们先做了一次不带锁的检查,然后再做带锁的检查,这样做比直接加锁检查性能要更好,如果对象已经创建就没有必须再去加锁而是直接返回该对象就可以了。
-
-### 面向对象相关知识
-
-- 三大支柱:封装、继承、多态
-
- 例子:工资结算系统。
-
- ```Python
- """
- 月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成
- """
- from abc import ABCMeta, abstractmethod
-
-
- class Employee(metaclass=ABCMeta):
- """员工(抽象类)"""
-
- def __init__(self, name):
- self.name = name
-
- @abstractmethod
- def get_salary(self):
- """结算月薪(抽象方法)"""
- pass
-
-
- class Manager(Employee):
- """部门经理"""
-
- def get_salary(self):
- return 15000.0
-
-
- class Programmer(Employee):
- """程序员"""
-
- def __init__(self, name, working_hour=0):
- self.working_hour = working_hour
- super().__init__(name)
-
- def get_salary(self):
- return 200.0 * self.working_hour
-
-
- class Salesman(Employee):
- """销售员"""
-
- def __init__(self, name, sales=0.0):
- self.sales = sales
- super().__init__(name)
-
- def get_salary(self):
- return 1800.0 + self.sales * 0.05
-
-
- class EmployeeFactory:
- """创建员工的工厂(工厂模式 - 通过工厂实现对象使用者和对象之间的解耦合)"""
-
- @staticmethod
- def create(emp_type, *args, **kwargs):
- """创建员工"""
- all_emp_types = {'M': Manager, 'P': Programmer, 'S': Salesman}
- cls = all_emp_types[emp_type.upper()]
- return cls(*args, **kwargs) if cls else None
-
-
- def main():
- """主函数"""
- emps = [
- EmployeeFactory.create('M', '曹操'),
- EmployeeFactory.create('P', '荀彧', 120),
- EmployeeFactory.create('P', '郭嘉', 85),
- EmployeeFactory.create('S', '典韦', 123000),
- ]
- for emp in emps:
- print(f'{emp.name}: {emp.get_salary():.2f}元')
-
-
- if __name__ == '__main__':
- main()
- ```
-
-- 类与类之间的关系
-
- - is-a关系:继承
- - has-a关系:关联 / 聚合 / 合成
- - use-a关系:依赖
-
- 例子:扑克游戏。
-
- ```Python
- """
- 经验:符号常量总是优于字面常量,枚举类型是定义符号常量的最佳选择
- """
- from enum import Enum, unique
-
- import random
-
-
- @unique
- class Suite(Enum):
- """花色"""
-
- SPADE, HEART, CLUB, DIAMOND = range(4)
-
- def __lt__(self, other):
- return self.value < other.value
-
-
- class Card:
- """牌"""
-
- def __init__(self, suite, face):
- """初始化方法"""
- self.suite = suite
- self.face = face
-
- def show(self):
- """显示牌面"""
- suites = ['♠︎', '♥︎', '♣︎', '♦︎']
- faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
- return f'{suites[self.suite.value]}{faces[self.face]}'
-
- def __repr__(self):
- return self.show()
-
-
- class Poker:
- """扑克"""
-
- def __init__(self):
- self.index = 0
- self.cards = [Card(suite, face)
- for suite in Suite
- for face in range(1, 14)]
-
- def shuffle(self):
- """洗牌(随机乱序)"""
- random.shuffle(self.cards)
- self.index = 0
-
- def deal(self):
- """发牌"""
- card = self.cards[self.index]
- self.index += 1
- return card
-
- @property
- def has_more(self):
- return self.index < len(self.cards)
-
-
- class Player:
- """玩家"""
-
- def __init__(self, name):
- self.name = name
- self.cards = []
-
- def get_one(self, card):
- """摸一张牌"""
- self.cards.append(card)
-
- def sort(self, comp=lambda card: (card.suite, card.face)):
- """整理手上的牌"""
- self.cards.sort(key=comp)
-
-
- def main():
- """主函数"""
- poker = Poker()
- poker.shuffle()
- players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
- while poker.has_more:
- for player in players:
- player.get_one(poker.deal())
- for player in players:
- player.sort()
- print(player.name, end=': ')
- print(player.cards)
-
-
- if __name__ == '__main__':
- main()
- ```
-
- > **说明**:上面的代码中使用了Emoji字符来表示扑克牌的四种花色,在某些不支持Emoji字符的系统上可能无法显示。
-
-- 对象的复制(深复制/深拷贝/深度克隆和浅复制/浅拷贝/影子克隆)
-
-- 垃圾回收、循环引用和弱引用
-
- Python使用了自动化内存管理,这种管理机制以**引用计数**为基础,同时也引入了**标记-清除**和**分代收集**两种机制为辅的策略。
-
- ```C
- typedef struct _object {
- /* 引用计数 */
- int ob_refcnt;
- /* 对象指针 */
- struct _typeobject *ob_type;
- } PyObject;
- ```
-
- ```C
- /* 增加引用计数的宏定义 */
- #define Py_INCREF(op) ((op)->ob_refcnt++)
- /* 减少引用计数的宏定义 */
- #define Py_DECREF(op) \ //减少计数
- if (--(op)->ob_refcnt != 0) \
- ; \
- else \
- __Py_Dealloc((PyObject *)(op))
- ```
-
- 导致引用计数+1的情况:
-
- - 对象被创建,例如`a = 23`
- - 对象被引用,例如`b = a`
- - 对象被作为参数,传入到一个函数中,例如`f(a)`
- - 对象作为一个元素,存储在容器中,例如`list1 = [a, a]`
-
- 导致引用计数-1的情况:
-
- - 对象的别名被显式销毁,例如`del a`
- - 对象的别名被赋予新的对象,例如`a = 24`
- - 一个对象离开它的作用域,例如f函数执行完毕时,f函数中的局部变量(全局变量不会)
- - 对象所在的容器被销毁,或从容器中删除对象
-
- 引用计数可能会导致循环引用问题,而循环引用会导致内存泄露,如下面的代码所示。为了解决这个问题,Python中引入了“标记-清除”和“分代收集”。在创建一个对象的时候,对象被放在第一代中,如果在第一代的垃圾检查中对象存活了下来,该对象就会被放到第二代中,同理在第二代的垃圾检查中对象存活下来,该对象就会被放到第三代中。
-
- ```Python
- # 循环引用会导致内存泄露 - Python除了引用技术还引入了标记清理和分代回收
- # 在Python 3.6以前如果重写__del__魔术方法会导致循环引用处理失效
- # 如果不想造成循环引用可以使用弱引用
- list1 = []
- list2 = []
- list1.append(list2)
- list2.append(list1)
- ```
-
- 以下情况会导致垃圾回收:
-
- - 调用`gc.collect()`
- - `gc`模块的计数器达到阀值
- - 程序退出
-
- 如果循环引用中两个对象都定义了`__del__`方法,`gc`模块不会销毁这些不可达对象,因为gc模块不知道应该先调用哪个对象的`__del__`方法,这个问题在Python 3.6中得到了解决。
-
- 也可以通过`weakref`模块构造弱引用的方式来解决循环引用的问题。
-
-- 魔法属性和方法(请参考《Python魔法方法指南》)
-
- 有几个小问题请大家思考:
-
- - 自定义的对象能不能使用运算符做运算?
- - 自定义的对象能不能放到`set`中?能去重吗?
- - 自定义的对象能不能作为`dict`的键?
- - 自定义的对象能不能使用上下文语法?
-
-- 混入(Mixin)
-
- 例子:自定义字典限制只有在指定的key不存在时才能在字典中设置键值对。
-
- ```Python
- class SetOnceMappingMixin:
- """自定义混入类"""
- __slots__ = ()
-
- def __setitem__(self, key, value):
- if key in self:
- raise KeyError(str(key) + ' already set')
- return super().__setitem__(key, value)
-
-
- class SetOnceDict(SetOnceMappingMixin, dict):
- """自定义字典"""
- pass
-
-
- my_dict= SetOnceDict()
- try:
- my_dict['username'] = 'jackfrued'
- my_dict['username'] = 'hellokitty'
- except KeyError:
- pass
- print(my_dict)
- ```
-
-- 元编程和元类
-
- 对象是通过类创建的,类是通过元类创建的,元类提供了创建类的元信息。所有的类都直接或间接的继承自`object`,所有的元类都直接或间接的继承自`type`。
-
- 例子:用元类实现单例模式。
-
- ```Python
- import threading
-
-
- class SingletonMeta(type):
- """自定义元类"""
-
- def __init__(cls, *args, **kwargs):
- cls.__instance = None
- cls.__lock = threading.RLock()
- super().__init__(*args, **kwargs)
-
- def __call__(cls, *args, **kwargs):
- if cls.__instance is None:
- with cls.__lock:
- if cls.__instance is None:
- cls.__instance = super().__call__(*args, **kwargs)
- return cls.__instance
-
-
- class President(metaclass=SingletonMeta):
- """总统(单例类)"""
-
- pass
- ```
-
-- 面向对象设计原则
-
- - 单一职责原则 (**S**RP)- 一个类只做该做的事情(类的设计要高内聚)
- - 开闭原则 (**O**CP)- 软件实体应该对扩展开发对修改关闭
- - 依赖倒转原则(DIP)- 面向抽象编程(在弱类型语言中已经被弱化)
- - 里氏替换原则(**L**SP) - 任何时候可以用子类对象替换掉父类对象
- - 接口隔离原则(**I**SP)- 接口要小而专不要大而全(Python中没有接口的概念)
- - 合成聚合复用原则(CARP) - 优先使用强关联关系而不是继承关系复用代码
- - 最少知识原则(迪米特法则,Lo**D**)- 不要给没有必然联系的对象发消息
-
- > **说明**:上面加粗的字母放在一起称为面向对象的**SOLID**原则。
-
-- GoF设计模式
-
- - 创建型模式:单例、工厂、建造者、原型
- - 结构型模式:适配器、门面(外观)、代理
- - 行为型模式:迭代器、观察者、状态、策略
-
- 例子:可插拔的哈希算法(策略模式)。
-
- ```Python
- class StreamHasher():
- """哈希摘要生成器"""
-
- def __init__(self, alg='md5', size=4096):
- self.size = size
- alg = alg.lower()
- self.hasher = getattr(__import__('hashlib'), alg.lower())()
-
- def __call__(self, stream):
- return self.to_digest(stream)
-
- def to_digest(self, stream):
- """生成十六进制形式的摘要"""
- for buf in iter(lambda: stream.read(self.size), b''):
- self.hasher.update(buf)
- return self.hasher.hexdigest()
-
- def main():
- """主函数"""
- hasher1 = StreamHasher()
- with open('Python-3.7.6.tgz', 'rb') as stream:
- print(hasher1.to_digest(stream))
- hasher2 = StreamHasher('sha1')
- with open('Python-3.7.6.tgz', 'rb') as stream:
- print(hasher2(stream))
-
-
- if __name__ == '__main__':
- main()
- ```
-
-### 迭代器和生成器
-
-- 迭代器是实现了迭代器协议的对象。
-
- - Python中没有像`protocol`或`interface`这样的定义协议的关键字。
- - Python中用魔术方法表示协议。
- - `__iter__`和`__next__`魔术方法就是迭代器协议。
-
- ```Python
- class Fib(object):
- """迭代器"""
-
- def __init__(self, num):
- self.num = num
- self.a, self.b = 0, 1
- self.idx = 0
-
- def __iter__(self):
- return self
-
- def __next__(self):
- if self.idx < self.num:
- self.a, self.b = self.b, self.a + self.b
- self.idx += 1
- return self.a
- raise StopIteration()
- ```
-
-- 生成器是语法简化版的迭代器。
-
- ```Python
- def fib(num):
- """生成器"""
- a, b = 0, 1
- for _ in range(num):
- a, b = b, a + b
- yield a
- ```
-
-- 生成器进化为协程。
-
- 生成器对象可以使用`send()`方法发送数据,发送的数据会成为生成器函数中通过`yield`表达式获得的值。这样,生成器就可以作为协程使用,协程简单的说就是可以相互协作的子程序。
-
- ```Python
- def calc_avg():
- """流式计算平均值"""
- total, counter = 0, 0
- avg_value = None
- while True:
- value = yield avg_value
- total, counter = total + value, counter + 1
- avg_value = total / counter
-
-
- gen = calc_avg()
- next(gen)
- print(gen.send(10))
- print(gen.send(20))
- print(gen.send(30))
- ```
-
-### 并发编程
-
-Python中实现并发编程的三种方案:多线程、多进程和异步I/O。并发编程的好处在于可以提升程序的执行效率以及改善用户体验;坏处在于并发的程序不容易开发和调试,同时对其他程序来说它并不友好。
-
-- 多线程:Python中提供了`Thread`类并辅以`Lock`、`Condition`、`Event`、`Semaphore`和`Barrier`。Python中有GIL来防止多个线程同时执行本地字节码,这个锁对于CPython是必须的,因为CPython的内存管理并不是线程安全的,因为GIL的存在多线程并不能发挥CPU的多核特性。
-
- ```Python
- """
- 面试题:进程和线程的区别和联系?
- 进程 - 操作系统分配内存的基本单位 - 一个进程可以包含一个或多个线程
- 线程 - 操作系统分配CPU的基本单位
- 并发编程(concurrent programming)
- 1. 提升执行性能 - 让程序中没有因果关系的部分可以并发的执行
- 2. 改善用户体验 - 让耗时间的操作不会造成程序的假死
- """
- import glob
- import os
- import threading
-
- from PIL import Image
-
- PREFIX = 'thumbnails'
-
-
- def generate_thumbnail(infile, size, format='PNG'):
- """生成指定图片文件的缩略图"""
- file, ext = os.path.splitext(infile)
- file = file[file.rfind('/') + 1:]
- outfile = f'{PREFIX}/{file}_{size[0]}_{size[1]}.{ext}'
- img = Image.open(infile)
- img.thumbnail(size, Image.ANTIALIAS)
- img.save(outfile, format)
-
-
- def main():
- """主函数"""
- if not os.path.exists(PREFIX):
- os.mkdir(PREFIX)
- for infile in glob.glob('images/*.png'):
- for size in (32, 64, 128):
- # 创建并启动线程
- threading.Thread(
- target=generate_thumbnail,
- args=(infile, (size, size))
- ).start()
-
-
- if __name__ == '__main__':
- main()
- ```
-
- 多个线程竞争资源的情况。
-
- ```Python
- """
- 多线程程序如果没有竞争资源处理起来通常也比较简单
- 当多个线程竞争临界资源的时候如果缺乏必要的保护措施就会导致数据错乱
- 说明:临界资源就是被多个线程竞争的资源
- """
- import time
- import threading
-
- from concurrent.futures import ThreadPoolExecutor
-
-
- class Account(object):
- """银行账户"""
-
- def __init__(self):
- self.balance = 0.0
- self.lock = threading.Lock()
-
- def deposit(self, money):
- # 通过锁保护临界资源
- with self.lock:
- new_balance = self.balance + money
- time.sleep(0.001)
- self.balance = new_balance
-
-
- def main():
- """主函数"""
- account = Account()
- # 创建线程池
- pool = ThreadPoolExecutor(max_workers=10)
- futures = []
- for _ in range(100):
- future = pool.submit(account.deposit, 1)
- futures.append(future)
- # 关闭线程池
- pool.shutdown()
- for future in futures:
- future.result()
- print(account.balance)
-
-
- if __name__ == '__main__':
- main()
- ```
-
- 修改上面的程序,启动5个线程向账户中存钱,5个线程从账户中取钱,取钱时如果余额不足就暂停线程进行等待。为了达到上述目标,需要对存钱和取钱的线程进行调度,在余额不足时取钱的线程暂停并释放锁,而存钱的线程将钱存入后要通知取钱的线程,使其从暂停状态被唤醒。可以使用`threading`模块的`Condition`来实现线程调度,该对象也是基于锁来创建的,代码如下所示:
-
- ```Python
- """
- 多个线程竞争一个资源 - 保护临界资源 - 锁(Lock/RLock)
- 多个线程竞争多个资源(线程数>资源数) - 信号量(Semaphore)
- 多个线程的调度 - 暂停线程执行/唤醒等待中的线程 - Condition
- """
- from concurrent.futures import ThreadPoolExecutor
- from random import randint
- from time import sleep
-
- import threading
-
-
- class Account:
- """银行账户"""
-
- def __init__(self, balance=0):
- self.balance = balance
- lock = threading.RLock()
- self.condition = threading.Condition(lock)
-
- def withdraw(self, money):
- """取钱"""
- with self.condition:
- while money > self.balance:
- self.condition.wait()
- new_balance = self.balance - money
- sleep(0.001)
- self.balance = new_balance
-
- def deposit(self, money):
- """存钱"""
- with self.condition:
- new_balance = self.balance + money
- sleep(0.001)
- self.balance = new_balance
- self.condition.notify_all()
-
-
- def add_money(account):
- while True:
- money = randint(5, 10)
- account.deposit(money)
- print(threading.current_thread().name,
- ':', money, '====>', account.balance)
- sleep(0.5)
-
-
- def sub_money(account):
- while True:
- money = randint(10, 30)
- account.withdraw(money)
- print(threading.current_thread().name,
- ':', money, '<====', account.balance)
- sleep(1)
-
-
- def main():
- account = Account()
- with ThreadPoolExecutor(max_workers=15) as pool:
- for _ in range(5):
- pool.submit(add_money, account)
- for _ in range(10):
- pool.submit(sub_money, account)
-
-
- if __name__ == '__main__':
- main()
- ```
-
-- 多进程:多进程可以有效的解决GIL的问题,实现多进程主要的类是`Process`,其他辅助的类跟`threading`模块中的类似,进程间共享数据可以使用管道、套接字等,在`multiprocessing`模块中有一个`Queue`类,它基于管道和锁机制提供了多个进程共享的队列。下面是官方文档上关于多进程和进程池的一个示例。
-
- ```Python
- """
- 多进程和进程池的使用
- 多线程因为GIL的存在不能够发挥CPU的多核特性
- 对于计算密集型任务应该考虑使用多进程
- time python3 example22.py
- real 0m11.512s
- user 0m39.319s
- sys 0m0.169s
- 使用多进程后实际执行时间为11.512秒,而用户时间39.319秒约为实际执行时间的4倍
- 这就证明我们的程序通过多进程使用了CPU的多核特性,而且这台计算机配置了4核的CPU
- """
- import concurrent.futures
- import math
-
- PRIMES = [
- 1116281,
- 1297337,
- 104395303,
- 472882027,
- 533000389,
- 817504243,
- 982451653,
- 112272535095293,
- 112582705942171,
- 112272535095293,
- 115280095190773,
- 115797848077099,
- 1099726899285419
- ] * 5
-
-
- def is_prime(n):
- """判断素数"""
- if n % 2 == 0:
- return False
-
- sqrt_n = int(math.floor(math.sqrt(n)))
- for i in range(3, sqrt_n + 1, 2):
- if n % i == 0:
- return False
- return True
-
-
- def main():
- """主函数"""
- with concurrent.futures.ProcessPoolExecutor() as executor:
- for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
- print('%d is prime: %s' % (number, prime))
-
-
- if __name__ == '__main__':
- main()
- ```
-
- > **重点**:**多线程和多进程的比较**。
- >
- > 以下情况需要使用多线程:
- >
- > 1. 程序需要维护许多共享的状态(尤其是可变状态),Python中的列表、字典、集合都是线程安全的,所以使用线程而不是进程维护共享状态的代价相对较小。
- > 2. 程序会花费大量时间在I/O操作上,没有太多并行计算的需求且不需占用太多的内存。
- >
- > 以下情况需要使用多进程:
- >
- > 1. 程序执行计算密集型任务(如:字节码操作、数据处理、科学计算)。
- > 2. 程序的输入可以并行的分成块,并且可以将运算结果合并。
- > 3. 程序在内存使用方面没有任何限制且不强依赖于I/O操作(如:读写文件、套接字等)。
-
-- 异步处理:从调度程序的任务队列中挑选任务,该调度程序以交叉的形式执行这些任务,我们并不能保证任务将以某种顺序去执行,因为执行顺序取决于队列中的一项任务是否愿意将CPU处理时间让位给另一项任务。异步任务通常通过多任务协作处理的方式来实现,由于执行时间和顺序的不确定,因此需要通过回调式编程或者`future`对象来获取任务执行的结果。Python 3通过`asyncio`模块和`await`和`async`关键字(在Python 3.7中正式被列为关键字)来支持异步处理。
-
- ```Python
- """
- 异步I/O - async / await
- """
- import asyncio
-
-
- def num_generator(m, n):
- """指定范围的数字生成器"""
- yield from range(m, n + 1)
-
-
- async def prime_filter(m, n):
- """素数过滤器"""
- primes = []
- for i in num_generator(m, n):
- flag = True
- for j in range(2, int(i ** 0.5 + 1)):
- if i % j == 0:
- flag = False
- break
- if flag:
- print('Prime =>', i)
- primes.append(i)
-
- await asyncio.sleep(0.001)
- return tuple(primes)
-
-
- async def square_mapper(m, n):
- """平方映射器"""
- squares = []
- for i in num_generator(m, n):
- print('Square =>', i * i)
- squares.append(i * i)
-
- await asyncio.sleep(0.001)
- return squares
-
-
- def main():
- """主函数"""
- loop = asyncio.get_event_loop()
- future = asyncio.gather(prime_filter(2, 100), square_mapper(1, 100))
- future.add_done_callback(lambda x: print(x.result()))
- loop.run_until_complete(future)
- loop.close()
-
-
- if __name__ == '__main__':
- main()
- ```
-
- > **说明**:上面的代码使用`get_event_loop`函数获得系统默认的事件循环,通过`gather`函数可以获得一个`future`对象,`future`对象的`add_done_callback`可以添加执行完成时的回调函数,`loop`对象的`run_until_complete`方法可以等待通过`future`对象获得协程执行结果。
-
- Python中有一个名为`aiohttp`的三方库,它提供了异步的HTTP客户端和服务器,这个三方库可以跟`asyncio`模块一起工作,并提供了对`Future`对象的支持。Python 3.6中引入了`async`和`await`来定义异步执行的函数以及创建异步上下文,在Python 3.7中它们正式成为了关键字。下面的代码异步的从5个URL中获取页面并通过正则表达式的命名捕获组提取了网站的标题。
-
- ```Python
- import asyncio
- import re
-
- import aiohttp
-
- PATTERN = re.compile(r'\
-
-
-
-#### 结构
-
-- html
- - head
- - title
- - meta
- - body
-
-#### 文本
-
-- 标题(heading)和段落(paragraph)
- - h1 ~ h6
- - p
-- 上标(superscript)和下标(subscript)
- - sup
- - sub
-- 空白(白色空间折叠)
-- 折行(break)和水平标尺(horizontal ruler)
- - br
- - hr
-- 语义化标签
- - 加粗和强调 - strong
- - 引用 - blockquote
- - 缩写词和首字母缩写词 - abbr / acronym
- - 引文 - cite
- - 所有者联系信息 - address
- - 内容的修改 - ins / del
-
-#### 列表(list)
-
- - 有序列表(ordered list)- ol / li
- - 无序列表(unordered list)- ul / li
- - 定义列表(definition list)- dl / dt / dd
-
-#### 链接(anchor)
-
-- 页面链接
-- 锚链接
-- 功能链接
-
-#### 图像(image)
-
-- 图像存储位置
-
- 
-
-- 图像及其宽高
-
-- 选择正确的图像格式
- - JPEG
- - GIF
- - PNG
-
-- 矢量图
-
-- 语义化标签 - figure / figcaption
-
-#### 表格(table)
-
-- 基本的表格结构 - table / tr / td / th
-- 表格的标题 - caption
-- 跨行和跨列 - rowspan属性 / colspan属性
-- 长表格 - thead / tbody / tfoot
-
-#### 表单(form)
-
-- 重要属性 - action / method / enctype
-- 表单控件(input)- type属性
- - 文本框 - `text` / 密码框 - `password` / 数字框 - `number`
- - 邮箱 - `email` / 电话 - `tel` / 日期 - `date` / 滑条 - `range` / URL - `url` / 搜索 - `search`
- - 单选按钮 - `radio` / 复选按钮 - `checkbox`
- - 文件上传 - `file` / 隐藏域 - `hidden`
- - 提交按钮 - `submit` / 图像按钮 - `image` / 重置按钮 - `reset`
-- 下拉列表 - select / option
-- 文本域(多行文本)- textarea
-- 组合表单元素 - fieldset / legend
-
-#### 音视频(audio / video)
-
-- 视频格式和播放器
-- 视频托管服务
-- 添加视频的准备工作
-- video标签和属性 - autoplay / controls / loop / muted / preload / src
-- audio标签和属性 - autoplay / controls / loop / muted / preload / src / width / height / poster
-
-#### 窗口(frame)
-
-- 框架集(过时,不建议使用) - frameset / frame
-
-- 内嵌窗口 - iframe
-
-#### 其他
-
-- 文档类型
-
- ```HTML
-
- ```
-
- ```HTML
-
- ```
-
- ```HTML
-
- ```
-
-- 注释
-
- ```HTML
-
- ```
-
-- 属性
- - id:唯一标识
- - class:元素所属的类,用于区分不同的元素
- - title:元素的额外信息(鼠标悬浮时会显示工具提示文本)
- - tabindex:Tab键切换顺序
- - contenteditable:元素是否可编辑
- - draggable:元素是否可拖拽
-
-- 块级元素 / 行级元素
-
-- 字符实体(实体替换符)
-
- 
-
-### 使用CSS渲染页面
-
-#### 简介
-
-- CSS的作用
-
-- CSS的工作原理
-
-- 规则、属性和值
-
- 
-
-- 常用选择器
-
- 
-
-#### 颜色(color)
-
-- 如何指定颜色
-- 颜色术语和颜色对比
-- 背景色
-
-#### 文本(text / font)
-
-- 文本的大小和字型(font-size / font-family)
-
- 
-
- 
-
-- 粗细、样式、拉伸和装饰(font-weight / font-style / font-stretch / text-decoration)
-
- 
-
-- 行间距(line-height)、字母间距(letter-spacing)和单词间距(word-spacing)
-
-- 对齐(text-align)方式和缩进(text-ident)
-
-- 链接样式(:link / :visited / :active / :hover)
-
-- CSS3新属性
- - 阴影效果 - text-shadow
- - 首字母和首行文本(:first-letter / :first-line)
- - 响应用户
-
-#### 盒子(box model)
-
-- 盒子大小的控制(width / height)
-
- 
-
-- 盒子的边框、外边距和内边距(border / margin / padding)
-
- 
-
-- 盒子的显示和隐藏(display / visibility)
-
-- CSS3新属性
- - 边框图像(border-image)
- - 投影(border-shadow)
- - 圆角(border-radius)
-
-#### 列表、表格和表单
-
-- 列表的项目符号(list-style)
-- 表格的边框和背景(border-collapse)
-- 表单控件的外观
-- 表单控件的对齐
-- 浏览器的开发者工具
-
-#### 图像
-
-- 控制图像的大小(display: inline-block)
-- 对齐图像
-- 背景图像(background / background-image / background-repeat / background-position)
-
-#### 布局
-
-- 控制元素的位置(position / z-index)
- - 普通流
- - 相对定位
- - 绝对定位
- - 固定定位
- - 浮动元素(float / clear)
-- 网站布局
-
- - HTML5布局
-
- 
-- 适配屏幕尺寸
- - 固定宽度布局
- - 流体布局
- - 布局网格
-
-### 使用JavaScript控制行为
-
-#### JavaScript基本语法
-
-- 语句和注释
-- 变量和数据类型
- - 声明和赋值
- - 简单数据类型和复杂数据类型
- - 变量的命名规则
-- 表达式和运算符
- - 赋值运算符
- - 算术运算符
- - 比较运算符
- - 逻辑运算符:`&&`、`||`、`!`
-- 分支结构
- - `if...else...`
- - `switch...cas...default...`
-- 循环结构
- - `for`循环
- - `while`循环
- - `do...while`循环
-- 数组
- - 创建数组
- - 操作数组中的元素
-- 函数
- - 声明函数
- - 调用函数
- - 参数和返回值
- - 匿名函数
- - 立即调用函数
-
-#### 面向对象
-
- - 对象的概念
- - 创建对象的字面量语法
- - 访问成员运算符
- - 创建对象的构造函数语法
- - `this`关键字
- - 添加和删除属性
- - `delete`关键字
- - 标准对象
- - `Number` / `String` / `Boolean` / `Symbol` / `Array` / `Function`
- - `Date` / `Error` / `Math` / `RegExp` / `Object` / `Map` / `Set`
- - `JSON` / `Promise` / `Generator` / `Reflect` / `Proxy`
-
-#### BOM
-
- - `window`对象的属性和方法
- - `history`对象
- - `forward()` / `back()` / `go()`
- - `location`对象
- - `navigator`对象
- - `screen`对象
-
-#### DOM
-
- - DOM树
- - 访问元素
- - `getElementById()` / `querySelector()`
- - `getElementsByClassName()` / `getElementsByTagName()` / `querySelectorAll()`
- - `parentNode` / `previousSibling` / `nextSibling` / `children` / `firstChild` / `lastChild`
-- 操作元素
- - `nodeValue`
- - `innerHTML` / `textContent` / `createElement()` / `createTextNode()` / `appendChild()` / `insertBefore()` / `removeChild()`
- - `className` / `id` / `hasAttribute()` / `getAttribute()` / `setAttribute()` / `removeAttribute()`
-- 事件处理
- - 事件类型
- - UI事件:`load` / `unload` / `error` / `resize` / `scroll`
- - 键盘事件:`keydown` / `keyup` / `keypress`
- - 鼠标事件:`click` / `dbclick` / `mousedown` / `mouseup` / `mousemove` / `mouseover` / `mouseout`
- - 焦点事件:`focus` / `blur`
- - 表单事件:`input` / `change` / `submit` / `reset` / `cut` / `copy` / `paste` / `select`
- - 事件绑定
- - HTML事件处理程序(不推荐使用,因为要做到标签与代码分离)
- - 传统的DOM事件处理程序(只能附加一个回调函数)
- - 事件监听器(旧的浏览器中不被支持)
- - 事件流:事件捕获 / 事件冒泡
- - 事件对象(低版本IE中的window.event)
- - `target`(有些浏览器使用srcElement)
- - `type`
- - `cancelable`
- - `preventDefault()`
- - `stopPropagation()`(低版本IE中的cancelBubble)
- - 鼠标事件 - 事件发生的位置
- - 屏幕位置:`screenX`和`screenY`
- - 页面位置:`pageX`和`pageY`
- - 客户端位置:`clientX`和`clientY`
- - 键盘事件 - 哪个键被按下了
- - `keyCode`属性(有些浏览器使用`which`)
- - `String.fromCharCode(event.keyCode)`
- - HTML5事件
- - `DOMContentLoaded`
- - `hashchange`
- - `beforeunload`
-
-#### JavaScript API
-
-- 客户端存储 - `localStorage`和`sessionStorage`
-
- ```JavaScript
- localStorage.colorSetting = '#a4509b';
- localStorage['colorSetting'] = '#a4509b';
- localStorage.setItem('colorSetting', '#a4509b');
- ```
-
-- 获取位置信息 - `geolocation`
-
- ```JavaScript
- navigator.geolocation.getCurrentPosition(function(pos) {
- console.log(pos.coords.latitude)
- console.log(pos.coords.longitude)
- })
- ```
-
-- 从服务器获取数据 - Fetch API
-- 绘制图形 - `