diff --git a/Advanced-Features/context.md b/Advanced-Features/context.md index 0716bbc..6807d9c 100644 --- a/Advanced-Features/context.md +++ b/Advanced-Features/context.md @@ -49,7 +49,7 @@ Exiting context # 调用了 __exit__ 方法 - Point(3, 4) 生成了一个上下文管理器; - 调用上下文管理器的 `__enter__()` 方法,并将 `__enter__()` 方法的返回值赋给 as 字句中的变量 pt; - 执行**语句体**(指 with 语句包裹起来的代码块)内容,输出 distance; -- 不管执行过程中是否发生异常,都执行上下文管理器的 `__exit__()` 方法。`__exit__()` 方法负责执行『清理』工作,如释放资源,关闭文件等。如果执行过程没有出现异常,或者语句体中执行了语句 break/continue/return,则以 None 作为参数调用 `__exit__(None, None, None) `;如果执行过程中出现异常,则使用 sys.exc_info 得到的异常信息为参数调用 `__exit__(exc_type, exc_value, exc_traceback)`; +- 不管执行过程中是否发生异常,都执行上下文管理器的 `__exit__()` 方法。`__exit__()` 方法负责执行『清理』工作,如释放资源,关闭文件等。如果执行过程没有出现异常,或者语句体中执行了语句 break/continue/return,则以 None 作为参数调用 `__exit__(None, None, None) `;如果执行过程中出现异常,则使用 `sys.exc_info` 得到的异常信息为参数调用 `__exit__(exc_type, exc_value, exc_traceback)`; - 出现异常时,如果 `__exit__(type, value, traceback)` 返回 False 或 None,则会重新抛出异常,让 with 之外的语句逻辑来处理异常;如果返回 True,则忽略异常,不再对异常进行处理; 上面的 with 语句执行过程没有出现异常,我们再来看出现异常的情形: diff --git a/Class/class_and_object.md b/Class/class_and_object.md index 416f2bb..1f3e6b9 100644 --- a/Class/class_and_object.md +++ b/Class/class_and_object.md @@ -30,7 +30,7 @@ class Animal(object): 然后,在创建实例的时候,传入参数: ```python ->>> animal = Aniaml('dog1') # 传入参数 'dog1' +>>> animal = Animal('dog1') # 传入参数 'dog1' >>> animal.name # 访问对象的 name 属性 'dog1' ``` diff --git a/Datatypes/README.md b/Datatypes/README.md index 44fd8c2..397145e 100644 --- a/Datatypes/README.md +++ b/Datatypes/README.md @@ -7,7 +7,7 @@ 所有序列类型都可以进行某些通用的操作,比如: - 索引(indexing) -- 分片(sliceing) +- 分片(slicing) - 迭代(iteration) - 加(adding) - 乘(multiplying) diff --git a/Datatypes/set.md b/Datatypes/set.md index 32d4fd6..4feb79a 100644 --- a/Datatypes/set.md +++ b/Datatypes/set.md @@ -56,7 +56,7 @@ set(['a', 'c', 'b', 4, 'd', 'e']) ## 删除元素 -`remove()` 方法可以删除集合中的元素。 +`remove()` 方法可以删除集合中的元素, 但是删除不存在的元素,会抛出 KeyError,可改用 `discard()`。 看看例子: @@ -67,10 +67,11 @@ set(['a', 'c', 'b', 'd']) >>> s.remove('a') # 删除元素 'a' >>> s set(['c', 'b', 'd']) ->>> s.remove('e') # 删除不存在的元素,会抛出 KeyErro +>>> s.remove('e') # 删除不存在的元素,会抛出 KeyError Traceback (most recent call last): File "", line 1, in KeyError: 'e' +>>> s.discard('e') # 删除不存在的元素, 不会抛出 KeyError ``` ## 交集/并集/差集 diff --git a/File-Directory/os.md b/File-Directory/os.md index aa1b7b6..75cac12 100644 --- a/File-Directory/os.md +++ b/File-Directory/os.md @@ -109,7 +109,7 @@ False - os.walk -os.walk 是遍历目录常用的模块,它返回一个包含 3 个元素的元祖:(dirpath, dirnames, filenames)。dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;filesnames 是以列表 list 形式返回该路径下所有文件名字。 +os.walk 是遍历目录常用的模块,它返回一个包含 3 个元素的元组:(dirpath, dirnames, filenames)。dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;filenames 是以列表 list 形式返回该路径下所有文件名字。 ```python >>> for root, dirs, files in os.walk('/Users/ethan/coding'): diff --git a/PYTHONroadmap.png b/PYTHONroadmap.png new file mode 100644 index 0000000..8a2e097 Binary files /dev/null and b/PYTHONroadmap.png differ diff --git a/Process-Thread-Coroutine/process.md b/Process-Thread-Coroutine/process.md index a75f91c..8861568 100644 --- a/Process-Thread-Coroutine/process.md +++ b/Process-Thread-Coroutine/process.md @@ -129,6 +129,29 @@ pid:11747, num is 13 pid:11748, num is 13 ``` +这是因为根据不同的平台,multiprocessing支持三种启动进程的办法: +#### spawn +父进程会启动一个新的解释器,子进程只会继承run()所需的资源。 +不必要的文件描述符和句柄(一种指针)不会被继承。 +该方法和fork,forkserver相比,启动进程较慢。 + +可在Unix和Windows上使用。 Windows上的默认设置。 + +#### fork +父进程使用 os.fork() 来产生 Python 解释器分叉。 +子进程在开始时实际上与父进程相同,并且会继承父进程的所有资源。 +多线程的安全是有问题的。 + +只能在Unix上使用。Unix上的默认设置。 + +#### forkserver +程序启动并选择forkserver启动方法时,将启动一个服务器进程。 +之后每当需要一个新进程时,父进程就会连接到服务器并请求它分叉一个新进程。 +分叉服务器进程是单线程的,因此使用 os.fork() 是安全的。 +没有不必要的资源被继承。 + +可在Unix平台上使用,并支持通过Unix管道传递文件描述符。 + ## 使用进程池创建多个进程 在上面,我们只是创建了一个进程,如果要创建多个进程呢?Python 提供了**进程池**的方式,让我们批量创建子进程,让我们看一个简单的示例: @@ -254,9 +277,7 @@ DONE - [编程中的进程、线程、协程、同步、异步、回调 · 浮生半日闲](https://wangdashuaihenshuai.github.io/2015/10/17/%E7%BC%96%E7%A8%8B%E4%B8%AD%E7%9A%84%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E3%80%81%E5%8D%8F%E7%A8%8B%E3%80%81%E5%90%8C%E6%AD%A5%E3%80%81%E5%BC%82%E6%AD%A5%E3%80%81%E5%9B%9E%E8%B0%83/) - [python中多进程以及多线程编程的总结 - Codefly](http://sunms.codefly.top/2016/11/05/python%E4%B8%AD%E5%A4%9A%E8%BF%9B%E7%A8%8B%E4%BB%A5%E5%8F%8A%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BC%96%E7%A8%8B%E7%9A%84%E6%80%BB%E7%BB%93/) - [multithreading - Python multiprocessing.Pool: when to use apply, apply_async or map? - Stack Overflow](http://stackoverflow.com/questions/8533318/python-multiprocessing-pool-when-to-use-apply-apply-async-or-map) - +- [multiprocessing --- 基于进程的并行¶](https://docs.python.org/zh-cn/3/library/multiprocessing.html) [mp]: https://docs.python.org/2/library/multiprocessing.html - - diff --git a/README.md b/README.md index 07d98d9..e33cca7 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ -![cover](https://ofaatpail.qnssl.com/2017-01-03-explore-python-cover.png) +![cover](https://i.loli.net/2020/03/23/9B1oWLeu6Q3Hbrz.png) Python 之旅 === ![Version](https://img.shields.io/badge/version-1.0-brightgreen.svg) [![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-brightgreen.svg)](https://raw.githubusercontent.com/ethan-funny/explore-python/master/LICENSE) -[![Analytics](https://ga-beacon.appspot.com/UA-62960961-2/explore-python/readme)](https://github.com/igrigorik/ga-beacon) ## Python 简介 @@ -13,7 +12,9 @@ Python 诞生于 1989 年的圣诞期间,由 [Guido van Rossum](https://gvanro Python 是一门面向对象,解释型的高级程序设计语言,它的语法非常简洁、优雅,而这也是 Python 的一些设计哲学。Python 自带了很完善的库,涵盖了数据库,网络,文件处理,GUI 等方方面面,通过这些库,我们可以比较快速地解决一些棘手问题,也可以将其作为基础库,开发出一些高级库。 -目前 Python 在大部分领域都占有一席之地,比如 Web 开发,机器学习,科学计算等。不少大型网站都是使用 Python 作为后台开发语言的,比如 [YouTube](https://www.youtube.com/)、[Pinterest](https://www.pinterest.com/)、国内的[豆瓣](https://www.douban.com/)和[知乎](http://www.zhihu.com/)等。另外,有不少知名的机器学习库也是使用 Python 开发的,比如,[scikit-learn](http://scikit-learn.org/stable/) 是一个强大的机器学习库,[Theano](https://github.com/Theano/Theano) 是一个成熟的深度学习库。 +目前 Python 在大部分领域都占有一席之地,比如 Web 开发,机器学习,科学计算等。不少大型网站都是使用 Python 作为后台开发语言的,比如 [YouTube](https://www.youtube.com/)、[Pinterest](https://www.pinterest.com/)、国内的[豆瓣](https://www.douban.com/)和[知乎](http://www.zhihu.com/)等。 + +另外,有不少知名的机器学习库也是使用 Python 开发的,比如,[scikit-learn](http://scikit-learn.org/stable/) 是一个强大的机器学习库,[PyTorch](https://pytorch.org/) 是一个成熟的深度学习库。 当然了,Python 也有一些缺点。Python 经常被人们吐槽的一点就是:运行速度慢,和 C/C++ 相比非常慢。但是,除了像视频高清解码等**计算密集型任务**对运行速度有较高的要求外,在大部分时候,我们可能并不需要非常快的运行速度。比如,一个程序使用 C 来实现,运行时间只需 0.01 秒,而使用 Python 来实现,需要 0.1 秒,虽然 Python 的运行时间是 C 的 10 倍,显然很慢,但对我们而言,这压根不是问题。 @@ -25,7 +26,8 @@ Python 是一门面向对象,解释型的高级程序设计语言,它的语 首先,我参考一些相关的书籍,作了一个基础的思维导图,如下: -![思维导图](https://ofaatpail.qnssl.com/2017-01-03-explore-python2.png) +![思维导图](https://i.loli.net/2020/03/23/uZN8aehmwl14XcG.png) +![Eng journy](PYTHONroadmap.png) 接下来,就要开始写作了,这也是最艰难的一关。 @@ -58,11 +60,6 @@ Python 是一门面向对象,解释型的高级程序设计语言,它的语 本书将会持续进行修订和更新,读者如果遇到问题,请及时向我反馈,我会在第一时间加以解决。 -## 下载电子版 - -目前本书暂时提供 epub 格式的电子版,因为生成的 pdf 和 mobi 版本并不是很美观,不利于阅读,故暂不提供。 - -[点击下载 epub 版本](https://github.com/ethan-funny/explore-python/files/691859/explore-python.epub.zip) ## 声明 @@ -80,19 +77,13 @@ Python 是一门面向对象,解释型的高级程序设计语言,它的语 | 时间 | 说明 | | :---: | :---: | | 2017-01-03 | 发布版本 v1.0 | +| 2019-02-09 | fix typo | -## 联系我 - -如果你对于本书有什么建议或意见,欢迎批评指正,并联系我。 - -- [个人主页](http://funhacks.net) -- [GitHub](https://github.com/ethan-funny) -- [Twitter](https://twitter.com/pihacks) ## 支持我 如果你觉得本书对你有所帮助,不妨请我喝杯咖啡,感谢支持! - + diff --git a/SUMMARY.md b/SUMMARY.md index 1b73d93..dc8cb78 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -53,6 +53,7 @@ * [argparse](Standard-Modules/argparse.md) * [base64](Standard-Modules/base64.md) * [collections](Standard-Modules/collections.md) + * [itertools](Standard-Modules/itertools.md) * [datetime](Standard-Modules/datetime.md) * [hashlib](Standard-Modules/hashlib.md) * [hmac](Standard-Modules/hmac.md) diff --git a/book.json b/book.json index f36863d..0520c60 100644 --- a/book.json +++ b/book.json @@ -12,7 +12,6 @@ "weibo": null }, "sidebar": { - "个人主页": "http://funhacks.net", "书籍源码": "https://github.com/ethan-funny/explore-python/" } },