提交 05e453f5 编写于 作者: 写代码的明哥's avatar 写代码的明哥

更正笔误,使用新版 pandoc 重新渲染

上级 832502cd
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
greenlet = "==0.4.5"
oauthlib = "==0.7.2"
paho-mqtt = "==1.0"
tzlocal = "==1.1.2"
redis = "==2.10.3"
requests = "==2.4.3"
requests-oauthlib = "==0.4.2"
whitenoise = "==1.0.3"
openpyxl = "==2.1.5"
[requires]
python_version = "3.6"
......@@ -11,11 +11,11 @@ if (osName == 'Windows'):
blog_path = 'E:\\MING-Git\\python-guide\\source'
index_path = 'E:\\MING-Git\\python-guide\\README.md'
elif (osName == 'Darwin'):
repo_path = '/Users/MING/Github/python-guide/'
blog_path = '/Users/MING/Github/python-guide/source'
index_path = '/Users/MING/Github/python-guide/README.md'
repo_path = '/Users/iswbm/Documents/Github/python-guide/'
blog_path = '/Users/iswbm/Documents/Github/python-guide/source'
index_path = '/Users/iswbm/Documents/Github/python-guide/README.md'
base_link = "http://python.iswbm.com/en/latest/"
base_link = "https://python.iswbm.com/en/latest/"
readme_header = '''
![](http://image.iswbm.com/20200607120940.png)
......@@ -27,9 +27,9 @@ readme_header = '''
<a href='http://image.iswbm.com/20200607114246.png'><img src='http://img.shields.io/badge/%E5%85%AC%E4%BC%97%E5%8F%B7-30k+-brightgreen'></a>
</p>
## [项目主页](http://python.iswbm.com/)
## [项目主页](https://python.iswbm.com/)
在线阅读:[Python 编程时光](http://python.iswbm.com/)
在线阅读:[Python 编程时光](https://python.iswbm.com/)
![](http://image.iswbm.com/20200607130051.png)
......
此差异已折叠。
......@@ -21,7 +21,7 @@ Python 3.9 (截止撰稿时最新:2020/12/16)。
进入 `Python 官网 <https://www.python.org/downloads/windows/>`__\ ,目前
Python 最新 Python 稳定版为 3.9,点击如下链接
|image0|
.. image:: http://image.iswbm.com/image-20201129172024424.png
直接跳到最后,根据你电脑系统以及的位数
......@@ -32,7 +32,7 @@ Python 最新 Python 稳定版为 3.9,点击如下链接
- Mac
:\ `Python-3.9.1-macosx10.9.pkg <https://www.python.org/ftp/python/3.9.1/python-3.9.1-macosx10.9.pkg>`__
|image1|
.. image:: http://image.iswbm.com/image-20201129172153677.png
下载下来后,根据你的电脑系统选择后面的内容进行阅读。
......@@ -41,84 +41,66 @@ Python 最新 Python 稳定版为 3.9,点击如下链接
下载到本地后,双击打开开始安装
|image2|
.. image:: http://image.iswbm.com/20201207164009.png
记得勾选 ``Add Python 3.9 to PATH``\ ,这是把你的 Python
路径加入到系统环境变量中。如果不想自定义选择安装路径,可以直接点击
``Install Now``\ ,如果要选择安装路径,点击下图位置。
|image3|
.. image:: http://image.iswbm.com/20201207164148.png
然后全部选上,然后点击 Next
|image4|
.. image:: http://image.iswbm.com/20201207164207.png
这里根据需要进行打勾,一般默认就行,然后点击 ``Browse`` ,选择你想要把
Python 安装到的哪那个目录里。
然后再直接点击 Install 开始安装。
|image5|
.. image:: http://image.iswbm.com/20201207164309.png
安装过程只要几分钟就行
|image6|
.. image:: http://image.iswbm.com/20201207164451.png
出现如下界面,说明安装过程已经结束。
|image7|
.. image:: http://image.iswbm.com/20201207164957.png
安装是安装上了,那么如何验证呢?
使用 windows 搜索 cmd,选择 ``命令提示符`` (我们把这个称之为你的终端)
|image8|
.. image:: http://image.iswbm.com/20201207165111.png
然后敲入 python ,若出现如下界面,则说明 Python
已经成功安装到你的机器上。
|image9|
.. image:: http://image.iswbm.com/20201218200632.png
3. Mac 安装
-----------
下载到本地后,双击打开开始安装
|image10|
.. image:: http://image.iswbm.com/image-20201215124444268.png
出现如下界面,一直点继续
|image11|
.. image:: http://image.iswbm.com/image-20201215124456818.png
直到出现如下界面,输入密码开始安装
|image12|
.. image:: http://image.iswbm.com/image-20201215124710859.png
安装的速度非常地快,大概在一分钟左右
|image13|
.. image:: http://image.iswbm.com/image-20201215124720398.png
|image14|
.. image:: http://image.iswbm.com/image-20201215124935041.png
打开Terminal 或者 iTerm(同样我们把这个称之为你的终端),输入 Python 3
,如果进入如下界面,说明 Python3 已经安装完成。
|image15|
.. |image0| image:: http://image.iswbm.com/image-20201129172024424.png
.. |image1| image:: http://image.iswbm.com/image-20201129172153677.png
.. |image2| image:: http://image.iswbm.com/20201207164009.png
.. |image3| image:: http://image.iswbm.com/20201207164148.png
.. |image4| image:: http://image.iswbm.com/20201207164207.png
.. |image5| image:: http://image.iswbm.com/20201207164309.png
.. |image6| image:: http://image.iswbm.com/20201207164451.png
.. |image7| image:: http://image.iswbm.com/20201207164957.png
.. |image8| image:: http://image.iswbm.com/20201207165111.png
.. |image9| image:: http://image.iswbm.com/20201218200632.png
.. |image10| image:: http://image.iswbm.com/image-20201215124444268.png
.. |image11| image:: http://image.iswbm.com/image-20201215124456818.png
.. |image12| image:: http://image.iswbm.com/image-20201215124710859.png
.. |image13| image:: http://image.iswbm.com/image-20201215124720398.png
.. |image14| image:: http://image.iswbm.com/image-20201215124935041.png
.. |image15| image:: http://image.iswbm.com/image-20201215125120591.png
.. image:: http://image.iswbm.com/image-20201215125120591.png
......@@ -37,7 +37,7 @@ IDEA,C 语言对应 Clion 等等。
可以看出专业版比社区版多了
``科学工具``\ 、\ ``WEB 开发``\ 、\ ``Python Web 框架``\ 、\ ``Python 代码分析``\ 、\ ``远程开发调试``\ 、\ ``数据库支持``\ 。
|image0|
.. image:: http://image.iswbm.com/20190506150523.png
社区版的功能有限,有些非常好用的功能只有专业版才有,比如 远程调试。
......@@ -71,7 +71,7 @@ IDEA,C 语言对应 Clion 等等。
如果你暂时付不起购买费用,可以加下面微信,我这有
``绿色免安装的专业版``\ ,对,就是那种连安装都不用安装的 专业版。
|image1|
.. image:: http://image.iswbm.com/image-20201218210141865.png
1. 下载链接
-----------
......@@ -85,38 +85,38 @@ PyCharm for Mac
PyCharm for Linux
:https://www.jetbrains.com/pycharm/download/#section=linux
|image2|
.. image:: http://image.iswbm.com/20200901213017.png
2. 安装步骤
-----------
下载完成后,双击 exe 文件
|image3|
.. image:: http://image.iswbm.com/20200901213223.png
选择安装目录,Pycharm需要的内存较多,建议将其安装在D盘或者E盘,不建议放在系统盘C盘:
|image4|
.. image:: http://image.iswbm.com/20200901213310.png
选好路径后,点击 Next ,创建桌面快捷方式等一系列选项参照下图勾选!
|image5|
.. image:: http://image.iswbm.com/20200901213325.png
最后默认安装即可,直接点击Install。
|image6|
.. image:: http://image.iswbm.com/20200901213415.png
7、耐心的等待两分钟左右。
之后就会得到下面的安装完成的界面
|image7|
.. image:: http://image.iswbm.com/20200901213504.png
点击Finish,Pycharm安装完成。
接下来对Pycharm进行配置,双击运行桌面上的Pycharm图标,进入下图界面:
|image8|
.. image:: http://image.iswbm.com/20200901213526.png
选择Do not import settings,之后选择OK,进入下一步。
......@@ -126,7 +126,7 @@ PyCharm for Linux
-> 点击Next:Featured plugins
|image9|
.. image:: http://image.iswbm.com/20200901213602.png
建议选择Darcula主题,该主题更有利于保护眼睛。
......@@ -135,7 +135,7 @@ PyCharm for Linux
首先,点击 ``View`` -> ``Appearance`` 勾上
``Toolbar``\ ,来调出工具栏,个人认为这个工具栏对于新手非常有用,使用频率很高。
|image10|
.. image:: http://image.iswbm.com/20201218203225.png
再然后,应该告诉 PyCharm 你的 CPython 解释器在哪里?不然后面要执行
Python 代码的时候,都不知道去哪里找。
......@@ -143,53 +143,34 @@ Python 代码的时候,都不知道去哪里找。
点击 ``File`` -> ``Settings`` ,就会出现如下界面,在搜索框输入
``interpreter`` ,点击右上角的 ``Add``
|image11|
.. image:: http://image.iswbm.com/20201218203836.png
跳到如下界面,再选择 ``System Interpreter``
,然后右边选择你在上一节中安装 CPython 的路径。
|image12|
.. image:: http://image.iswbm.com/20201218203632.png
然后在文件夹下,新建一个 ``demo.py``
的文件,并写入如下代码,然后再点击上面的 ``Add Configuration``
配置脚本运行的参数
|image13|
.. image:: http://image.iswbm.com/20201218204204.png
接下来,我们要在 PyCharm 中运行这个 ``demo.py`` 这个脚本了。右键然后选择
``Run 'demo'`` ,或者直接按住快捷键:\ ``Ctrl+Shift+F10``
|image14|
.. image:: http://image.iswbm.com/image-20201218204355375.png
运行后,在下面就会弹出一个 ``Run`` 窗口,你在执行 Python
脚本时,所有的输出内容,都会出现在这里。
|image15|
.. image:: http://image.iswbm.com/image-20201218204718039.png
至此, PyCharm
这个非常好用的集成开发环境就配置完成了,后面我们就要正式开始接触代码了。
另外,关于 PyCharm
的使用,我花了两个月的时间,整理了一份非常实用且全面的 `《PyCharm
中文指南》 <http://pycharm.iswbm.com/>`__\ ,点击这个链接,即可跳转学习:http://pycharm.iswbm.com/
|image16|
.. |image0| image:: http://image.iswbm.com/20190506150523.png
.. |image1| image:: http://image.iswbm.com/image-20201218210141865.png
.. |image2| image:: http://image.iswbm.com/20200901213017.png
.. |image3| image:: http://image.iswbm.com/20200901213223.png
.. |image4| image:: http://image.iswbm.com/20200901213310.png
.. |image5| image:: http://image.iswbm.com/20200901213325.png
.. |image6| image:: http://image.iswbm.com/20200901213415.png
.. |image7| image:: http://image.iswbm.com/20200901213504.png
.. |image8| image:: http://image.iswbm.com/20200901213526.png
.. |image9| image:: http://image.iswbm.com/20200901213602.png
.. |image10| image:: http://image.iswbm.com/20201218203225.png
.. |image11| image:: http://image.iswbm.com/20201218203836.png
.. |image12| image:: http://image.iswbm.com/20201218203632.png
.. |image13| image:: http://image.iswbm.com/20201218204204.png
.. |image14| image:: http://image.iswbm.com/image-20201218204355375.png
.. |image15| image:: http://image.iswbm.com/image-20201218204718039.png
.. |image16| image:: http://image.iswbm.com/20200901220204.png
中文指南》 <https://pycharm.iswbm.com/>`__\ ,点击这个链接,即可跳转学习:https://pycharm.iswbm.com/
.. image:: http://image.iswbm.com/20200901220204.png
......@@ -21,7 +21,7 @@ Python 程序的执行分为两种:
的一个函数,通过它可以把你内容输出到终端屏幕上。这是我们写的第一行
Python 代码,调用的第一个 Python 函数,也是第一个 Python 程序。
|image0|
.. image:: http://image.iswbm.com/20201218210312.png
2. 第二种方法
-------------
......@@ -34,12 +34,12 @@ PyCharm 来执行脚本,有什么办法呢?
首先先进入脚本所在的文件夹,然后按住 ``Shift`` 和
右键,再点击如图位置打开 ``PowerShell``
|image1|
.. image:: http://image.iswbm.com/image-20201218210755151.png
然后在 ``PowerShell`` 中输入 ``python dmeo.py``\ ,就可以执行这个 python
脚本啦。
|image2|
.. image:: http://image.iswbm.com/image-20201218210911124.png
以上介绍了两种最原始的 Python 程序的执行方式。
......@@ -51,8 +51,3 @@ PyCharm 来执行脚本,有什么办法呢?
``>>>`` 标识),请你注意,后面不再提及。
2. 实际上不管你使用哪个编辑器和 IDE 执行 Python
文件,它们的本质都是采用的第二种方法,因此这里很有必要向你介绍。
.. |image0| image:: http://image.iswbm.com/20201218210312.png
.. |image1| image:: http://image.iswbm.com/image-20201218210755151.png
.. |image2| image:: http://image.iswbm.com/image-20201218210911124.png
......@@ -160,7 +160,7 @@ b的内存地址是一样的,因此二者其实是一个数据。
- 执行a =
‘Tom’,解释器创建字符串‘Tom’对象,并把a改为指向‘Tom’对象,与b无关。
|image0|
.. image:: http://image.iswbm.com/20210116171300.png
6. 简单介绍常量
---------------
......@@ -178,6 +178,3 @@ b的内存地址是一样的,因此二者其实是一个数据。
但事实上,从Python语法角度看,PI仍然是一个变量,因为Python根本没有任何机制保证PI不会被改变。你完全可以给PI赋值为10,不会弹出任何错误。所以,用全部大写的变量名表示常量只是一个习惯上的用法。
常量通常放置在代码的最上部,并作为全局使用。
.. |image0| image:: http://image.iswbm.com/20210116171300.png
......@@ -79,7 +79,7 @@ print函数用于将内容格式化显示在标准输出上,主要指的是屏
print可以接受多个字符串,字符串类型的变量或者可print的对象。每个字符串用逗号“,”隔开,连成一串输出。print会依次打印每个字符串,同时,每遇到一个逗号“,”就输出一个空格。
```
```python 
>>> a = "i am"
>>> b = "student"
>>> print(a,"a" , b)
......@@ -90,7 +90,7 @@ i amastudent # 无分隔
对于形如`print(a+"a"+b)`的语句,其实是先计算`a+"a"+b`的值,然后再通过print打印它。print()会自动执行内部的语句,输出想要的结果。再看一个例子:
```
```python
>>> a = 10
>>> b = 2
>>> print(sum((a, a*b))) # 先求a*b,再求和,再打印
......@@ -103,7 +103,7 @@ i amastudent # 无分隔
**end参数**: 打印后的结束方式,默认为换行符`\n`。如果,设置`end=''`,则可以不换行,让print在一行内连续打印。活用print的参数,可以实现灵活的打印控制。
```
```python
>>> a = "i am"
>>> b = "student"
>>> print(a,"a" , b, sep="*")
......
......@@ -88,7 +88,7 @@ print函数用于将内容格式化显示在标准输出上,主要指的是屏
print可以接受多个字符串,字符串类型的变量或者可print的对象。每个字符串用逗号“,”隔开,连成一串输出。print会依次打印每个字符串,同时,每遇到一个逗号“,”就输出一个空格。
::
.. code:: python 
>>> a = "i am"
>>> b = "student"
......@@ -99,7 +99,7 @@ print可以接受多个字符串,字符串类型的变量或者可print的对
对于形如\ ``print(a+"a"+b)``\ 的语句,其实是先计算\ ``a+"a"+b``\ 的值,然后再通过print打印它。print()会自动执行内部的语句,输出想要的结果。再看一个例子:
::
.. code:: python
>>> a = 10
>>> b = 2
......@@ -113,7 +113,7 @@ print可以接受多个字符串,字符串类型的变量或者可print的对
**end参数**:
打印后的结束方式,默认为换行符\ ``\n``\ 。如果,设置\ ``end=''``\ ,则可以不换行,让print在一行内连续打印。活用print的参数,可以实现灵活的打印控制。
::
.. code:: python
>>> a = "i am"
>>> b = "student"
......
......@@ -8,8 +8,6 @@
由于这三种格式化的内容都非常的多,这里仅为了你看本教程后面的内容,我只介绍最常用的几种
## 第一种方法:使用 %
`%s` 表示这个位置接的是一个字符串变量
......@@ -64,7 +62,7 @@ format 函数会依次填充,比如第一个 `{}` 会取到第一个参数 nam
## 第三种方法:使用 f-string
这种方法是 Python 3.9 才支持的写法,只要你在字符串前面加一个 `f`,开启 f-string ,就可以在字符中写入变量。
这种方法是 Python 3.6 才支持的写法,只要你在字符串前面加一个 `f`,开启 f-string ,就可以在字符中写入变量。
直接看案例了
......
......@@ -27,7 +27,7 @@
更多的格式化式符号,可以参考这张表
|image0|
.. image:: http://image.iswbm.com/20201209211318.png
第二种方法:使用 format
-----------------------
......@@ -67,7 +67,7 @@ format 函数会依次填充,比如第一个 ``{}`` 会取到第一个参数 n
第三种方法:使用 f-string
-------------------------
这种方法是 Python 3.9 才支持的写法,只要你在字符串前面加一个
这种方法是 Python 3.6 才支持的写法,只要你在字符串前面加一个
``f``\ ,开启 f-string ,就可以在字符中写入变量。
直接看案例了
......@@ -78,6 +78,3 @@ format 函数会依次填充,比如第一个 ``{}`` 会取到第一个参数 n
>>> age = 18
>>> print(f"我的名字是:{name}, 今年 {age} 岁")
我的名字是:Jack, 今年 18 岁
.. |image0| image:: http://image.iswbm.com/20201209211318.png
此差异已折叠。
......@@ -93,6 +93,8 @@ for i in my_list:
```python
>>> alist = [0, 1, 2, 3]
>>> gen = iter(alist)
>>> gen
<list_iterator object at 0x100a94b20>
>>> next(gen)
0
>>> next(gen)
......
......@@ -112,6 +112,8 @@ StopIteration 提示无元素可取。
>>> alist = [0, 1, 2, 3]
>>> gen = iter(alist)
>>> gen
<list_iterator object at 0x100a94b20>
>>> next(gen)
0
>>> next(gen)
......
......@@ -94,11 +94,11 @@ b。类似这样的控制流程语句,称之为条件语句。
在讲多个条件组合时,先来了解一下 Python 中的逻辑运算符。
以下假设变量 a 为 10, b为 20: \| 运算符 \| 逻辑表达式 \| 描述\| 实例 \|
\| — \| — \| — \| — \| \| and \| x and y \| 布尔与” - 如果 x 为
\| — \| — \| — \| — \| \| and \| x and y \| 布尔与” - 如果 x 为
False,x and y 返回 False,否则它返回 y 的计算值。 \| (a and b) 返回
20。 \| \| or \| x or y \| 布尔或” - 如果 x 是非 0,它返回 x
20。 \| \| or \| x or y \| 布尔或” - 如果 x 是非 0,它返回 x
的值,否则它返回 y 的计算值。 \| (a or b) 返回 10。 \| \| not \| not x
\| 布尔非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回
\| 布尔非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回
True。 \| not(a and b) 返回 False \|
学习完逻辑运算符,就可以开始写多条件语句
......
......@@ -12,6 +12,7 @@
2. 字典(dict)推导式
3. 集合(set)推导式
4. 生成器推导式
1. 列表推导式
......
......@@ -36,7 +36,7 @@ mySum(2, 3)
递归函数
```pyhton
```python 
>>> func = lambda n:1 if n == 0 else n * func(n-1)
>>> func(5)
120
......@@ -52,4 +52,4 @@ mySum(2, 3)
从以上示例来看,lambda 表达式和常规的函数相比,写法比较怪异,可读性相对较差。除了可以直接运行之外,好像并没有其他较为突出的功能,为什么在今天我们要介绍它呢?
首先我们要知道 lambda 是一个表达式,而不是一个语句。正因为这个特点,我们可以在一些特殊的场景中去使用它。具体是什么场景呢?接下来我们会介绍到几个非常好用的内置函数。
\ No newline at end of file
首先我们要知道 lambda 是一个表达式,而不是一个语句。正因为这个特点,我们可以在一些特殊的场景中去使用它。具体是什么场景呢?接下来我们会介绍到几个非常好用的内置函数。
......@@ -39,7 +39,7 @@ function)是指一类无需定义标识符(函数名)的函数。通俗来
递归函数
.. code:: pyhton
.. code:: python 
>>> func = lambda n:1 if n == 0 else n * func(n-1)
>>> func(5)
......
......@@ -45,7 +45,7 @@ reduce 函数,也是类似的。它的作用是先对序列中的第 1、2
个元素进行操作,得到的结果再与第三个数据用 lambda
函数运算,将其得到的结果再与第四个元素进行运算,以此类推下去直到后面没有元素了。
|image0|
.. image:: http://image.iswbm.com/20200930175131.png
这边举个例子你也就明白了。
......@@ -93,6 +93,3 @@ Pythonic ,在某一程度上代码看起来更加的简洁。
.. code:: python
from functools import reduce
.. |image0| image:: http://image.iswbm.com/20200930175131.png
......@@ -24,32 +24,32 @@ help()
,可以看到输出了一段帮助文档,教你如何使用这个
help,当你看到提示符变成了 ``help>`` 时,这时候就进入了 help 模式。
|image0|
.. image:: http://image.iswbm.com/image-20200606121047415.png
此时你可以键入你想要了解的模块、语法等,help 告诉你如何使用。
比如我输入 keywords ,就可以看到 Python 里所有的关键字。再输入 modules
就可以查看 Python 中所有的内置模块。
|image1|
.. image:: http://image.iswbm.com/image-20200606121544062.png
输入 modules + ``指定包名``\ ,就可以查看这个包下有哪些模块
|image2|
.. image:: http://image.iswbm.com/image-20200606121942898.png
如果你想学习某个包要如何使用,可以直接在 help 模式下输入
``包名``\ ,就像下面这样,我就可以获得一份 json 的帮助文档。
|image3|
.. image:: http://image.iswbm.com/image-20200606122408522.png
如果你想学习某个关键字的用法,可以在 help 模式下直接键入 ``关键字``
查询用法,比如我直接键入 ``for`` 。
|image4|
.. image:: http://image.iswbm.com/image-20200606133933401.png
查完后,使用 quit 就可以退出 help 模式了。
|image5|
.. image:: http://image.iswbm.com/image-20200606123145109.png
如果你觉得进入 help 模式太麻烦,可以在 console 模式下直接查询
......@@ -65,7 +65,7 @@ dir() 函数可能是 Python
dir() 返回当前作用域中的名称。让我们将 dir() 函数应用于 keyword
模块,并观察它揭示了什么:
|image6|
.. image:: http://image.iswbm.com/image-20200606134519352.png
2. 应用到实际开发中
-------------------
......@@ -181,7 +181,7 @@ callable()
使用 ``__doc__`` 这个魔法方法,可以查询该模块的文档,它输出的内容和
help() 一样。
|image7|
.. image:: http://image.iswbm.com/image-20200606134858285.png
\__name_\_
~~~~~~~~~~
......@@ -279,7 +279,7 @@ help() 一样。
如果将上面的代码放入 demo.py,并且从 people 模块导入 People 类,其值就是
people 模块
|image8|
.. image:: http://image.iswbm.com/image-20200905115039771.png
\__bases_\_
~~~~~~~~~~~
......@@ -297,14 +297,3 @@ people 模块
>>> Student.__bases__
(<class '__main__.Teenager'>,)
>>>
.. |image0| image:: http://image.iswbm.com/image-20200606121047415.png
.. |image1| image:: http://image.iswbm.com/image-20200606121544062.png
.. |image2| image:: http://image.iswbm.com/image-20200606121942898.png
.. |image3| image:: http://image.iswbm.com/image-20200606122408522.png
.. |image4| image:: http://image.iswbm.com/image-20200606133933401.png
.. |image5| image:: http://image.iswbm.com/image-20200606123145109.png
.. |image6| image:: http://image.iswbm.com/image-20200606134519352.png
.. |image7| image:: http://image.iswbm.com/image-20200606134858285.png
.. |image8| image:: http://image.iswbm.com/image-20200905115039771.png
......@@ -115,7 +115,7 @@ deco()()
但是这样就OK
```
```python
def deco():
age = 10
def wrapper():
......@@ -129,7 +129,7 @@ deco()()
其实,你如果不使用 `+=``-=`等一类的操作,不加nonlocal也没有关系。这就展示了闭包的特性。
```
```python
def deco():
age = 10
def wrapper():
......
......@@ -117,7 +117,7 @@ global好理解,这里只讲下nonlocal。
但是这样就OK
::
.. code:: python
def deco():
age = 10
......@@ -132,7 +132,7 @@ global好理解,这里只讲下nonlocal。
其实,你如果不使用
``+=``\ 、\ ``-=``\ 等一类的操作,不加nonlocal也没有关系。这就展示了闭包的特性。
::
.. code:: python
def deco():
age = 10
......
......@@ -208,11 +208,11 @@ open)的上下文管理器。
这段代码的主逻辑是\ ``创建快照``\ ,而\ ``创建临时目录``\ ,属于前置条件,\ ``删除临时目录``\ ,是收尾工作。
虽然代码量很少,逻辑也不复杂,但是“``创建临时目录,使用完后再删除临时目录``”这个功能,在一个项目中很多地方都需要用到,如果可以将这段逻辑处理写成一个工具函数作为一个上下文管理器,那代码的复用率也大大提高。
虽然代码量很少,逻辑也不复杂,但是“\ ``创建临时目录,使用完后再删除临时目录``\ ”这个功能,在一个项目中很多地方都需要用到,如果可以将这段逻辑处理写成一个工具函数作为一个上下文管理器,那代码的复用率也大大提高。
代码是这样的
|image0|
.. image:: http://image.iswbm.com/20190310172800.png
5. 总结起来
-----------
......@@ -222,6 +222,3 @@ open)的上下文管理器。
1. 提高代码的复用率;
2. 提高代码的优雅度;
3. 提高代码的可读性;
.. |image0| image:: http://image.iswbm.com/20190310172800.png
......@@ -340,7 +340,4 @@ Python工匠:使用装饰器的小技巧)
其实例化的过程,你可以参考我这里的调试过程,加以理解。
|image0|
.. |image0| image:: http://image.iswbm.com/20190512113917.png
.. image:: http://image.iswbm.com/20190512113917.png
......@@ -107,7 +107,7 @@ Python 还支持多继承,可以继承自多个类。
它们的继承关系是
|image0|
.. image:: http://image.iswbm.com/image-20201213150058921.png
运行后的结果如下
......@@ -153,7 +153,7 @@ Python 还支持多继承,可以继承自多个类。
由此可见,多继承的顺序使用的是从左向右再深度优先的原则。
|image1|
.. image:: http://image.iswbm.com/image-20201213151434342.png
4. MRO 算法
-----------
......@@ -184,7 +184,7 @@ Python 还支持多继承,可以继承自多个类。
class C(A):pass
class D(B, C):pass
|image2|
.. image:: http://image.iswbm.com/20201004123106.png
可以使用 ``__mro__``
......@@ -212,7 +212,7 @@ Python 还支持多继承,可以继承自多个类。
使用 merge 推导
~~~~~~~~~~~~~~~
|image3|
.. image:: http://image.iswbm.com/20201004123115.png
1. 检查第一个列表的头元素(如 L[B1] 的头),记作 H。
2. 若 H
......@@ -247,9 +247,3 @@ Python 还支持多继承,可以继承自多个类。
- https://www.python.org/download/releases/2.3/mro/
- https://www.cnblogs.com/whatisfantasy/p/6046991.html
.. |image0| image:: http://image.iswbm.com/image-20201213150058921.png
.. |image1| image:: http://image.iswbm.com/image-20201213151434342.png
.. |image2| image:: http://image.iswbm.com/20201004123106.png
.. |image3| image:: http://image.iswbm.com/20201004123115.png
......@@ -55,6 +55,7 @@
中一个内置的装饰器,它可以在新式类中把一个函数 ``改造`` 成属性。
- 当你读取属性值时,会进入被 ``property`` 装饰的函数。
- 当你对属性进行赋值时,会进入被 ``@xx.setter`` 装饰的函数。
- 两个装饰器,一定是 ``@property`` 在前面,而 ``@xx.setter`` 在后
......@@ -102,7 +102,7 @@ class Word(str):
print "Value contains spaces. Truncating to first space."
word = word[:word.index(' ')]
# Word现在包含第一个空格前的所有字母
return str.`__new__`(cls, word)
return str.__new__(cls, word)
def __gt__(self, other):
return len(self) > len(other)
......@@ -156,7 +156,7 @@ class Word(str):
- `__trunc__(self)`
实现 math.trunc() 函数,即距离零最近的整数。
实现 math.trunc() 函数,即截断整数。
#### 常见算数操作符
......@@ -711,7 +711,7 @@ Not closable.
定义当描述符的值改变时的行为。instance 是拥有者类的实例, value 是要赋给描述符的值。
- `__delete__(self, instance, owner)`
- `__delete__(self, instance, value)`
定义当描述符的值被删除时的行为。instance 是拥有者类的实例
......@@ -725,7 +725,7 @@ class Meter(object):
self.value = float(value)
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, owner):
def __set__(self, instance, value):
self.value = float(value)
class Foot(object):
......
......@@ -131,7 +131,7 @@ Python包含了一系列的魔法方法,用于实现对象之间直接比较
print "Value contains spaces. Truncating to first space."
word = word[:word.index(' ')]
# Word现在包含第一个空格前的所有字母
return str.`__new__`(cls, word)
return str.__new__(cls, word)
def __gt__(self, other):
return len(self) > len(other)
......@@ -196,7 +196,7 @@ functools 模块中提供了一个类装饰器,只要我们定义 ``__eq__``
- ``__trunc__(self)``
实现 math.trunc() 函数,即距离零最近的整数。
实现 math.trunc() 函数,即截断整数。
常见算数操作符
^^^^^^^^^^^^^^
......@@ -636,8 +636,8 @@ super 是因为不是所有的类都有 ``__dict__`` 属性):
``__missing__``
在字典的子类中使用,它定义了当试图访问一个字典中不存在的键时的行为(目前为止是指字典的实例,例如我有一个字典
d , “george” 不是字典中的一个键,当试图访问 d["george’] 时就会调用
d.\ ``__missing__``\ (george”) )。
d , “george” 不是字典中的一个键,当试图访问 d[george’] 时就会调用
d.\ ``__missing__``\ (george”) )。
5.2 一个例子
~~~~~~~~~~~~
......@@ -856,7 +856,7 @@ contextlib 模块,里面有一个上下文管理器 contextlib.closing()
定义当描述符的值改变时的行为。instance 是拥有者类的实例, value
是要赋给描述符的值。
- ``__delete__(self, instance, owner)``
- ``__delete__(self, instance, value)``
定义当描述符的值被删除时的行为。instance 是拥有者类的实例
......@@ -871,7 +871,7 @@ contextlib 模块,里面有一个上下文管理器 contextlib.closing()
self.value = float(value)
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, owner):
def __set__(self, instance, value):
self.value = float(value)
class Foot(object):
......
......@@ -152,8 +152,6 @@ cls:User
True
```
## 4. 使用元类的意义
正常情况下,我们都不会使用到元类。但是这并不意味着,它不重要。假如某一天,我们需要写一个框架,很有可能就需要你对元类要有进一步的研究。
......
......@@ -72,7 +72,7 @@
这下程序稍微有点人工智能了,能够自己明辨是非了。
|image0|
.. image:: http://image.iswbm.com/20190425221322.png
程序是智能了,但在\ ``__init__``\ 里有太多的判断逻辑,很影响代码的可读性。巧的是,你刚好学过
Property
......@@ -127,7 +127,7 @@ Property
程序还是一样的人工智能,非常好。
|image1|
.. image:: http://image.iswbm.com/20190425221322.png
你以为你写的代码,已经非常优秀,无懈可击了。
......@@ -197,7 +197,7 @@ math、chinese、english这三个属性的时候,都会经过 Score
实现的效果和前面的一样,可以对数据的合法性进行有效控制(字段类型、数值区间等)
|image2|
.. image:: http://image.iswbm.com/20190425221233.png
以上,我举了下具体的实例,从最原始的编码风格到 Property
,最后引出描述符。由浅入深,一步一步带你感受到描述符的优雅之处。
......@@ -466,7 +466,7 @@ property
其实就相当于一个描述符类,而\ ``myfunc`` 在此刻变成了一个描述符。关于
``staticmethod`` 的实现,你可以参照下面这段我自己写的代码,加以理解。
|image3|
.. image:: http://image.iswbm.com/20190519001930.png
调用这个方法可以知道,每调用一次,它都会经过描述符类的 ``__get__`` 。
......@@ -621,7 +621,7 @@ Student
引导程序逻辑进入描述符之后,不管你是获取属性,还是设置属性,都是直接作用于
instance 的。
|image4|
.. image:: http://image.iswbm.com/20200812085823.png
这段代码,你可以仔细和前面的对比一下。
......@@ -636,10 +636,3 @@ instance 的。
--------
- `Python描述器引导(翻译) <https://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html#python>`__
.. |image0| image:: http://image.iswbm.com/20190425221322.png
.. |image1| image:: http://image.iswbm.com/20190425221322.png
.. |image2| image:: http://image.iswbm.com/20190425221233.png
.. |image3| image:: http://image.iswbm.com/20190519001930.png
.. |image4| image:: http://image.iswbm.com/20200812085823.png
......@@ -385,7 +385,4 @@ pip 的文件夹,若没有则创建之。
以上几乎包含了 pip 的所有常用使用场景,为了方便,我将其整理成一张表格。
|image0|
.. |image0| image:: http://image.iswbm.com/20191105200041.png
.. image:: http://image.iswbm.com/20191105200041.png
......@@ -9,7 +9,7 @@ Python 包的分发可以分为两种:
源码包的本质是一个压缩包,其常见的格式有:
|image0|
.. image:: http://image.iswbm.com/20191218202833.png
2. 以二进制包形式发布
......@@ -19,8 +19,4 @@ Python 包的分发可以分为两种:
二进制包的常见格式有:
|image1|
.. |image0| image:: http://image.iswbm.com/20191218202833.png
.. |image1| image:: http://image.iswbm.com/20191218203005.png
.. image:: http://image.iswbm.com/20191218203005.png
......@@ -35,7 +35,7 @@
创建一个压缩的tarball和一个zip文件。可用格式为:
|image0|
.. image:: http://image.iswbm.com/20191218203517.png
对以上的格式,有几点需要注意一下:
......@@ -101,6 +101,3 @@ setup.py 文件是可用的呢?
.. code:: shell
$ python setup.py develop
.. |image0| image:: http://image.iswbm.com/20191218203517.png
......@@ -12,11 +12,12 @@
1. 第一步:在你想要调试的地方,打上断点
2. 第二步:使用调试模式来运行这个 python 程序
3. 第三步:使用各种手段开始代码调试
首先第一步和第二步,我用下面这张图表示
|image0|
.. image:: http://image.iswbm.com/20200823134911.png
点击上图中的小蜘蛛,开启调试模式后,在 PyCharm 下方会弹出一个选项卡。
......@@ -27,7 +28,7 @@
3. 线程控制窗口
4. 程序控制窗口
|image1|
.. image:: http://image.iswbm.com/20200823140008.png
在变量查看窗口,你可以查看当前程序进行到该断点处,所有的普通变量和特殊变量,你每往下执行一行代码,这些变量都有可能跟着改变。
......@@ -57,32 +58,36 @@ F8,跳过不想看的地方,直接设置下一个断点,然后 F9 过去
看这张图就行了(下面第6点有误,应该是运行到光标处,而不是下一断点处)
|image2|
.. image:: http://image.iswbm.com/20200823143211.png
在程序控制窗口,共有 6
个按钮,他们的作用分别又是什么呢?同时看下面这张图就行了。
|image3|
.. image:: http://image.iswbm.com/20200823143535.png
2. 调试相关的快捷键
-------------------
- ⇧ + F9:调试当前文件
- ⌥ + ⇧ + F9:弹出菜单,让你选择调试哪一个文件
- F8:单步执行,不进入函数
- F7:单步执行,进入函数
- ⌥ + ⇧ +F7:单步执行,只进入自己写的函数
- ⇧ + F8:跳出函数体
- F9:运行到下一断点
- ⌥ + F9:运行到光标处
- ⇧ + ⌘ + F8:查看所有设置的断点
- ⌘ + F8:切换断点(有断点则取消断点,没有则加上断点)
- ⌥ + F5:重新以调试模式运行
- ⌥ + F8 计算表达式(可以更改变量值使其生效)
.. |image0| image:: http://image.iswbm.com/20200823134911.png
.. |image1| image:: http://image.iswbm.com/20200823140008.png
.. |image2| image:: http://image.iswbm.com/20200823143211.png
.. |image3| image:: http://image.iswbm.com/20200823143535.png
- ⌥ + F5:重新以调试模式运行
- ⌥ + F8 计算表达式(可以更改变量值使其生效)
......@@ -15,18 +15,13 @@
对于刚使用 Pycharm 的同学,可能并不知道 Pycharm
也是可以指定参数的。点击下图位置
|image0|
.. image:: http://image.iswbm.com/FmfL3r0iWx_srT_xMASBEp1ZaaId
进入设置面板,在 ``Script parameters`` 中填入参数即可。
|image1|
.. image:: http://image.iswbm.com/FujczKwTUPa8l5EEmS0eoh-zL1Nk
同时在上图的底部,你可以看到,这里可以很方便的切换
解释器,比你跑到这边来要容易得多吧
|image2|
.. |image0| image:: http://image.iswbm.com/FmfL3r0iWx_srT_xMASBEp1ZaaId
.. |image1| image:: http://image.iswbm.com/FujczKwTUPa8l5EEmS0eoh-zL1Nk
.. |image2| image:: http://image.iswbm.com/Fq60WOdcRJopqV6MVoRcIuZclYKx
.. image:: http://image.iswbm.com/Fq60WOdcRJopqV6MVoRcIuZclYKx
......@@ -15,16 +15,16 @@ Pycharm 中可以像 IPython Shell 和 Jupyter Notebook
假如我在调试如下几行简单的代码。在第 3 行处打了个断点。然后点击图示位置
``Show Python Prompt`` 按钮。
|image0|
.. image:: http://image.iswbm.com/Fi3N02x9OeOPatGdaReam_icn9G_
就进入了 ``Python Shell`` 的界面,这个Shell
环境和我们当前运行的程序环境是打通的,变量之间可以互相访问,这下你可以轻松地进行调试了。
|image1|
.. image:: http://image.iswbm.com/Fj1W53Txj0iFs5eYhFYh_dHlPtIL
上面我们打了个断点,是为了方便说明这个效果。并不是说一定要打断点。如果不打断点,在脚本执行完成后,也仍然可以在这个界面查看并操作所有变量。
|image2|
.. image:: http://image.iswbm.com/FlMsB7B1x6ET9mLOgydTWuTEXuOe
现在我们已经可以满足我们的调试的需求,但是每次运行脚本,都要手动点击
``Show Python Prompt``
......@@ -32,11 +32,11 @@ Pycharm 中可以像 IPython Shell 和 Jupyter Notebook
你需要点击图示位置 ``Edit Configurations`` 处。
|image3|
.. image:: http://image.iswbm.com/FmfL3r0iWx_srT_xMASBEp1ZaaId
然后在这里打勾选中。
|image4|
.. image:: http://image.iswbm.com/FiNCYpVlI93gk1zhOdQn4c0A8FMX
设置上之后,之后你每次运行后脚本后,都会默认为你存储所有变量的值,并为你打开
console 命令行调试界面。
......@@ -47,18 +47,9 @@ debug 模式运行项目,并打断点。
使用方法就是,在你打了断点后,在图示位置处,点击右键使用
``Evaluate Expression``
|image5|
.. image:: http://image.iswbm.com/FrAq1tVRM7Bz948wRqZFzU2PQnI0
就弹出了一个 ``Evaluate Expression`` 窗口,这里
可以运行命令表达式,直接操作变量。
|image6|
.. |image0| image:: http://image.iswbm.com/Fi3N02x9OeOPatGdaReam_icn9G_
.. |image1| image:: http://image.iswbm.com/Fj1W53Txj0iFs5eYhFYh_dHlPtIL
.. |image2| image:: http://image.iswbm.com/FlMsB7B1x6ET9mLOgydTWuTEXuOe
.. |image3| image:: http://image.iswbm.com/FmfL3r0iWx_srT_xMASBEp1ZaaId
.. |image4| image:: http://image.iswbm.com/FiNCYpVlI93gk1zhOdQn4c0A8FMX
.. |image5| image:: http://image.iswbm.com/FrAq1tVRM7Bz948wRqZFzU2PQnI0
.. |image6| image:: http://image.iswbm.com/Fo2aEraqbj_2KqDt44EzJTVe8pEf
.. image:: http://image.iswbm.com/Fo2aEraqbj_2KqDt44EzJTVe8pEf
......@@ -21,7 +21,7 @@ Shell 模式,方便你进行调试。
具体演示如下:
|image0|
.. image:: http://image.iswbm.com/20200801195950.png
需要注意的是:脚本执行完毕,有两种情况:
......@@ -31,8 +31,4 @@ Shell 模式,方便你进行调试。
这两种都会进入 Python Shell,如果脚本并无异常,最终也会进入 Python Shell
模式,需要你手动退出
|image1|
.. |image0| image:: http://image.iswbm.com/20200801195950.png
.. |image1| image:: http://image.iswbm.com/20200801201110.png
.. image:: http://image.iswbm.com/20200801201110.png
......@@ -49,7 +49,7 @@ pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文
使用这个方式进入调试模式,会在脚本的第一行开始单步调试。
|image0|
.. image:: http://image.iswbm.com/20190118000111.png
对于单文件的脚本并没有什么问题,如果是一个大型的项目,项目里有很多的文件,使用这种方式只能大大降低我们的效率。
......@@ -65,9 +65,9 @@ pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文
然后执行时,也不需要再指定\ ``-m pdb``\ 了,直接\ ``python pdb_demo.py``
,就会直接在这个地方暂停。
|image1|
.. image:: http://image.iswbm.com/20190118000234.png
|image2|
.. image:: http://image.iswbm.com/20190118000557.png
3. 调试指令
-----------
......@@ -82,90 +82,61 @@ pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文
**最常用**
+------+-----------+--------------------------+
| 指令 | 英文 | 解释 |
+======+===========+==========================+
| n | Next | 下一步 |
+------+-----------+--------------------------+
| l | list | 列出当前断点处源码 |
+------+-----------+--------------------------+
| p | print | 打印变量 |
+------+-----------+--------------------------+
| s | step into | 执行当前行,可以进入函数 |
+------+-----------+--------------------------+
| r | return | 运行完当前函数,返回结果 |
+------+-----------+--------------------------+
| c | continue | 执行到下一断点或者结束 |
+------+-----------+--------------------------+
| b | break | 设置断点 |
+------+-----------+--------------------------+
| q | quit | 退出程序 |
+------+-----------+--------------------------+
==== ========= ========================
指令 英文 解释
==== ========= ========================
n Next 下一步
l list 列出当前断点处源码
p print 打印变量
s step into 执行当前行,可以进入函数
r return 运行完当前函数,返回结果
c continue 执行到下一断点或者结束
b break 设置断点
q quit 退出程序
==== ========= ========================
**有时使用**
+-------------+----------+------------------------------+
| 指令 | 英文 | 解释 |
+=============+==========+==============================+
| a | args | 列出当前函数的参数 |
+-------------+----------+------------------------------+
| pp | pprint | 一种可视化更好的打印 |
+-------------+----------+------------------------------+
| j | jump | 跳到指定行 |
+-------------+----------+------------------------------+
| cl | clear | 清除断点 |
+-------------+----------+------------------------------+
| w | where | 打印当前堆栈 |
+-------------+----------+------------------------------+
| u | up | 执行跳转到当前堆栈的上一层 |
+-------------+----------+------------------------------+
| unt | until | 行数递增执行(忽略循环和函数) |
+-------------+----------+------------------------------+
| ll | longlist | 列出更多的源码 |
+-------------+----------+------------------------------+
| run/restart | run | 重新启动 debug(-m pdb) |
+-------------+----------+------------------------------+
=========== ======== ============================
指令 英文 解释
=========== ======== ============================
a args 列出当前函数的参数
pp pprint 一种可视化更好的打印
j jump 跳到指定行
cl clear 清除断点
w where 打印当前堆栈
u up 执行跳转到当前堆栈的上一层
unt until 行数递增执行(忽略循环和函数)
ll longlist 列出更多的源码
run/restart run 重新启动 debug(-m pdb)
=========== ======== ============================
**几乎不用**
+---------+-----------------+--------------------+
| 指令 | 英文 | 解释 |
+=========+=================+====================+
| tbreak | temporary break | 临时断点 |
+---------+-----------------+--------------------+
| disable | | 停用断点 |
+---------+-----------------+--------------------+
| enable | | 启用断点 |
+---------+-----------------+--------------------+
| alias | | 设置别名 |
+---------+-----------------+--------------------+
| unalias | | 删除别名 |
+---------+-----------------+--------------------+
| whatis | | 打印对象类型 |
+---------+-----------------+--------------------+
| ignore | | 设置忽略的断点 |
+---------+-----------------+--------------------+
| source | | 列出给定对象的源码 |
+---------+-----------------+--------------------+
======= =============== ==================
指令 英文 解释
======= =============== ==================
tbreak temporary break 临时断点
disable 停用断点
enable 启用断点
alias 设置别名
unalias 删除别名
whatis 打印对象类型
ignore 设置忽略的断点
source 列出给定对象的源码
======= =============== ==================
其上全部是我翻译自官方文档,原文在这里:https://docs.python.org/3/library/pdb.html
其实你大可不必死记这些命令,忘记的时候,只要敲入\ ``help``\ 并回车,就可以看所有的指令了。
|image3|
.. image:: http://image.iswbm.com/20190118083809.png
4. 开始调试
-----------
这里就几个最常用的指定,来演示一遍。
|image4|
.. image:: http://image.iswbm.com/20190118005507.png
这个调试过程,我加了些注释,你应该能够很轻易地理解这种调试方式。
.. |image0| image:: http://image.iswbm.com/20190118000111.png
.. |image1| image:: http://image.iswbm.com/20190118000234.png
.. |image2| image:: http://image.iswbm.com/20190118000557.png
.. |image3| image:: http://image.iswbm.com/20190118083809.png
.. |image4| image:: http://image.iswbm.com/20190118005507.png
......@@ -133,7 +133,7 @@ PySnooper
如此一来,PySnooper 会在 ``out["foo"]`` 值有变化时,也将其打印出来
|image0|
.. image:: http://image.iswbm.com/20201114183018.png
watch 参数,接收一个可迭代对象(可以是list 或者
tuple),里面的元素为字符串表达式,什么意思呢?看下面例子就知道了
......@@ -185,7 +185,7 @@ tuple),里面的元素为字符串表达式,什么意思呢?看下面例
效果如下
|image1|
.. image:: http://image.iswbm.com/20201114193131.png
2.5 设置最大的输出长度
~~~~~~~~~~~~~~~~~~~~~~
......@@ -223,7 +223,7 @@ PySnooper 同样支持多线程的调试,通过设置参数
效果如下
|image2|
.. image:: http://image.iswbm.com/20201114194449.png
2.7 自定义对象的格式输出
~~~~~~~~~~~~~~~~~~~~~~~~
......@@ -285,7 +285,7 @@ PySnooper 在打印对象的调试信息时,会逐个判断它是否是 Person
运行一下,观察一下效果。
|image3|
.. image:: http://image.iswbm.com/20201114201042.png
如果你要自定义格式输出的有很多个类型,那么 ``custom_repr``
参数的值可以这么写
......@@ -325,9 +325,3 @@ PySnooper 在打印对象的调试信息时,会逐个判断它是否是 Person
以上就是明哥今天给大家介绍的一款调试神器(\ ``PySnooper``\ )
的详细使用手册,是不是觉得还不错?
.. |image0| image:: http://image.iswbm.com/20201114183018.png
.. |image1| image:: http://image.iswbm.com/20201114193131.png
.. |image2| image:: http://image.iswbm.com/20201114194449.png
.. |image3| image:: http://image.iswbm.com/20201114201042.png
......@@ -27,14 +27,14 @@ Debug 。而远程调试需要不少前置步骤,这些设置过程,也是
首先,要在Pycharm中新建一个空的项目,后面我们拉服务器上的项目代码就会放置在这个项目目录下。我这边的名字是
NOVA,你可以自己定义。
|image0|
.. image:: http://image.iswbm.com/20190113104817.png
2. 配置连接服务器
~~~~~~~~~~~~~~~~~
Tools -> Deployment -> configuration
|image1|
.. image:: http://image.iswbm.com/20190113105512.png
添加一个\ ``Server``
......@@ -42,7 +42,7 @@ Tools -> Deployment -> configuration
- Type:设定为SFTP
|image2|
.. image:: http://image.iswbm.com/20190113105858.png
点击\ ``OK``\ 后,进入如下界面,你可以按我的备注,填写信息:
......@@ -55,37 +55,37 @@ Tools -> Deployment -> configuration
这里请注意,要确保你的电脑可以ssh连接到你的服务器,不管是密钥登陆还是密码登陆,如果开启了白名单限制要先解除。
|image3|
.. image:: http://image.iswbm.com/20190113105931.png
填写完成后,切换到\ ``Mappings``\ 选项卡,在箭头位置,填写\ ``\``
|image4|
.. image:: http://image.iswbm.com/20190113110928.png
以上服务器信息配置,全部正确填写完成后,点击\ ``OK``
接下来,我们要连接远程服务器了。 Tools -> Deployment -> Browse Remote
Host
|image5|
.. image:: http://image.iswbm.com/20190113111042.png
3. 下载项目代码
~~~~~~~~~~~~~~~
如果之前填写的服务器登陆信息准确无误的话,现在就可以看到远程的项目代码。
|image6|
.. image:: http://image.iswbm.com/20190113111151.png
选择下载远程代码要本地。
|image7|
.. image:: http://image.iswbm.com/20190113111217.png
下载完成提示。
|image8|
.. image:: http://image.iswbm.com/20190113111248.png
现在的IDE界面应该是这样子的。
|image9|
.. image:: http://image.iswbm.com/20190113111307.png
4. 下载远程解释器
~~~~~~~~~~~~~~~~~
......@@ -96,11 +96,11 @@ Host
进入 File -> Settings 按图示,添加远程解释器。
|image10|
.. image:: http://image.iswbm.com/20190113111747.png
填写远程服务器信息,跟之前的一样,不再赘述。
|image11|
.. image:: http://image.iswbm.com/20190113111828.png
点击\ ``OK``\ 后,会自动下载远程解释器。如果你的项目比较大,这个时间可能会比较久,请耐心等待。
......@@ -135,19 +135,19 @@ Host
看到那个\ ``ExecStart``\ 没有?那个就是我们程序的入口。
我们只要将其拷贝至我们的Pycharm中,并向远程同步该文件。
|image12|
.. image:: http://image.iswbm.com/20190113112004.png
6. 调试前设置
~~~~~~~~~~~~~
开启代码自动同步,这样,我们对代码的修改Pycharm都能识别,并且为我们提交到远程服务器。
|image13|
.. image:: http://image.iswbm.com/20190113112055.png
开启
``Gevent compatible``\ ,如果不开启,在调试过程中,很可能出现无法调试,或者无法追踪/查看变量等问题。
|image14|
.. image:: http://image.iswbm.com/20190113113211.png
7. 开始调试代码
~~~~~~~~~~~~~~~
......@@ -156,11 +156,11 @@ Host
如果你的程序入口,需要引入参数,这是经常有的事,可以的这里配置。
|image15|
.. image:: http://image.iswbm.com/20190113112456.png
配置完点击保存即可。
|image16|
.. image:: http://image.iswbm.com/20190113112649.png
8. 友情提醒
~~~~~~~~~~~
......@@ -168,22 +168,3 @@ Host
按照文章的试调试代码,会自动同步代码至远端,千万不要在生产环境使用,一定要在开发环境中使用,否则后果自负。
调试工具给了程序员提供了很大的便利,但还是希望你不要过度依赖。尽量在每次写代码的时候,都追求一次成型,提高自己的编码能力。
.. |image0| image:: http://image.iswbm.com/20190113104817.png
.. |image1| image:: http://image.iswbm.com/20190113105512.png
.. |image2| image:: http://image.iswbm.com/20190113105858.png
.. |image3| image:: http://image.iswbm.com/20190113105931.png
.. |image4| image:: http://image.iswbm.com/20190113110928.png
.. |image5| image:: http://image.iswbm.com/20190113111042.png
.. |image6| image:: http://image.iswbm.com/20190113111151.png
.. |image7| image:: http://image.iswbm.com/20190113111217.png
.. |image8| image:: http://image.iswbm.com/20190113111248.png
.. |image9| image:: http://image.iswbm.com/20190113111307.png
.. |image10| image:: http://image.iswbm.com/20190113111747.png
.. |image11| image:: http://image.iswbm.com/20190113111828.png
.. |image12| image:: http://image.iswbm.com/20190113112004.png
.. |image13| image:: http://image.iswbm.com/20190113112055.png
.. |image14| image:: http://image.iswbm.com/20190113113211.png
.. |image15| image:: http://image.iswbm.com/20190113112456.png
.. |image16| image:: http://image.iswbm.com/20190113112649.png
......@@ -68,12 +68,12 @@
``pdb.pn()``\ ,就可以切换到熟悉的 pdb
调试界面,并在抛错的地方打上断点,然后你就可以任意的查看运行时的变量信息。
|image0|
.. image:: http://image.iswbm.com/20210314164424.png
如果你不是想等报错了再调试,而是一开始就想进入调试模式,可以使用
``pdb.runcall()`` 函数
|image1|
.. image:: http://image.iswbm.com/20210314170221.png
有的同学可能还会想到 ``pdb.run()`` 和 ``pdb.runeval()``
这两个函数,但这两种方法,是需要提前在函数调试断点的,这就比较麻烦了,一般情况下不推荐使用。
......@@ -83,7 +83,3 @@
1. ``pdb.pm()``\ :在出错后直接切换到调试模式,并定位到报错位置。 –
**今天的重点**
2. ``pdb.runcall()``\ :可以在不设置断点的情况下,直接调试代码片段。
.. |image0| image:: http://image.iswbm.com/20210314164424.png
.. |image1| image:: http://image.iswbm.com/20210314170221.png
......@@ -26,7 +26,7 @@
- ``多进程``\ ,并行执行,真正意义上的并发。
|image0|
.. image:: http://image.iswbm.com/20201219162110.png
2. 单线程VS多线程VS多进程
-------------------------
......@@ -37,7 +37,7 @@
我的实验环境配置如下
|image1|
.. image:: http://image.iswbm.com/20190112205155.png
开始对比之前,首先定义四种类型的场景 - CPU计算密集型 - 磁盘IO密集型 -
网络IO密集型 - 【模拟】IO密集型
......@@ -203,7 +203,7 @@
将结果汇总一下,制成表格。
|image2|
.. image:: http://image.iswbm.com/20190112204930.png
我们来分析下这个表格。
......@@ -218,8 +218,3 @@
多进程适合在对CPU计算运算要求较高的场景下使用,譬如大数据分析,机器学习等
-
多进程虽然总是最快的,但是不一定是最优的选择,因为它需要CPU资源支持下才能体现优势
.. |image0| image:: http://image.iswbm.com/20201219162110.png
.. |image1| image:: http://image.iswbm.com/20190112205155.png
.. |image2| image:: http://image.iswbm.com/20190112204930.png
......@@ -245,4 +245,3 @@
.. |普通函数中 不能使用 await| image:: https://i.loli.net/2018/05/26/5b09794f45340.png
.. |async 中 不能使用yield| image:: https://i.loli.net/2018/05/26/5b0978b646230.png
.. |验证通过| image:: https://i.loli.net/2018/05/26/5b09814dc4714.png
......@@ -114,11 +114,11 @@
为了简单起见,并且协程更适合单线程的方式,我们的主线程用来监听队列,子线程用于处理队列。这里使用redis的队列。主线程中有一个是无限循环,用户消费队列。
先安装Redis 到 https://github.com/MicrosoftArchive/redis/releases 下载
|image0| 解压到你的路径。 |image1|
|image1| 解压到你的路径。 |image2|
然后,在当前路径运行cmd,运行redis的服务端。 |image2|
然后,在当前路径运行cmd,运行redis的服务端。 |image3|
服务开启后,我们就可以运行我们的客户端了。
并依次输入key=queue,value=5,3,1的消息。 |image3|
并依次输入key=queue,value=5,3,1的消息。 |image4|
一切准备就绪之后,我们就可以运行我们的代码了。
......@@ -199,8 +199,7 @@
运行后,程序是一直运行在后台的,我们每一次在Redis中输入新值,都会触发新任务的执行。。
.. |image0| image:: https://i.loli.net/2018/06/03/5b13ba8525bcf.png
.. |image1| image:: https://i.loli.net/2018/06/03/5b13ba9f66baa.png
.. |image2| image:: https://i.loli.net/2018/06/03/5b13bab682a32.png
.. |image3| image:: https://i.loli.net/2018/06/03/5b13bad79f5ce.png
.. |image1| image:: https://i.loli.net/2018/06/03/5b13ba8525bcf.png
.. |image2| image:: https://i.loli.net/2018/06/03/5b13ba9f66baa.png
.. |image3| image:: https://i.loli.net/2018/06/03/5b13bab682a32.png
.. |image4| image:: https://i.loli.net/2018/06/03/5b13bad79f5ce.png
......@@ -79,6 +79,7 @@ yield
**协程的优点:**
- 线程属于系统级别调度,而协程是程序员级别的调度。使用协程避免了无意义的调度,减少了线程上下文切换的开销,由此可以提高性能。
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
- 无需原子操作锁定及同步的开销
......
......@@ -97,7 +97,7 @@ operation**\ ),指不会被线程调度机制打断的操作,这种操作
当我们还是无法确定我们的代码是否具有原子性的时候,可以尝试通过 ``dis``
模块里的 dis 函数来查看
|image0|
.. image:: http://image.iswbm.com/20200506080445.png
当我们执行这段代码时,可以看到 ``number += 1``
这一行代码,由两条字节码实现。
......@@ -113,7 +113,7 @@ operation**\ ),指不会被线程调度机制打断的操作,这种操作
这里我拿字典的 update 操作举例,代码和执行过程如下图
|image1|
.. image:: http://image.iswbm.com/20200506081541.png
从截图里可以看到,\ ``info.update(new)`` 虽然也分为好几个操作
......@@ -190,7 +190,3 @@ Queue,而我们都知道它是线程安全的。当我们对它进行写入和
https://zhuanlan.zhihu.com/p/34150765
https://juejin.im/post/5b129a1be51d45068a6c91d4#comment
.. |image0| image:: http://image.iswbm.com/20200506080445.png
.. |image1| image:: http://image.iswbm.com/20200506081541.png
......@@ -22,27 +22,21 @@
Working directory: $ProjectFileDir$
Output filters: $FILE_PATH$\:$LINE$\:$COLUMN$\:.*
|image0|
.. image:: http://image.iswbm.com/20190323164120.png
我随意写了一段不符合 pep8 规范的代码。
|image1|
.. image:: http://image.iswbm.com/20190323211635.png
点击右键,选择 ``External Tools`` -> ``AutoPep8``
|image2|
.. image:: http://image.iswbm.com/20190323211301.png
看一下效果,还是挺明显的。
|image3|
.. image:: http://image.iswbm.com/20190324111603.png
你可能会说,Pycharm 本身就自带这个功能了呀,快捷键
``Command``\ +\ ``Option``\ +\ ``L``
,就可以实现一键pep8了。你可以对比一下,Pycharm 自带的代码 pep8 化功能
并没有像这个\ ``autopep8`` 来得彻底。 我相信你最终的选择肯定是后者。
.. |image0| image:: http://image.iswbm.com/20190323164120.png
.. |image1| image:: http://image.iswbm.com/20190323211635.png
.. |image2| image:: http://image.iswbm.com/20190323211301.png
.. |image3| image:: http://image.iswbm.com/20190324111603.png
......@@ -111,7 +111,7 @@ virtualenv 虽然已经相当好用了,可是功能还是不够完善。
若是 windows 则新增环境变量:\ ``WORKON_HOME``
|image0|
.. image:: http://image.iswbm.com/20200209161935.png
**基本语法**\ :
......@@ -232,9 +232,7 @@ https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
点击小齿轮。如图点击添加,按提示添加一个虚拟环境。然后点 OK
就可以使用这个虚拟环境,之后的项目都会在这个虚拟环境下运行。 |image4|
.. |image0| image:: http://image.iswbm.com/20200209161935.png
.. |image1| image:: https://i.loli.net/2018/06/11/5b1e7d36ce8ad.png
.. |image2| image:: https://i.loli.net/2018/06/11/5b1e7f140be6a.png
.. |image3| image:: https://i.loli.net/2018/06/11/5b1e805c996c8.png
.. |image4| image:: https://i.loli.net/2018/06/11/5b1e812db603f.png
......@@ -26,11 +26,11 @@
如果你的电脑是 windows 的。
|image0|
.. image:: http://image.iswbm.com/Fk6WZ2xbqg2DM3AvnYCpsiKQ4xOn
需要将如标示路径,加入到 环境变量 PATH 中。
|image1|
.. image:: http://image.iswbm.com/FjuJ8yZsgjkzVuBRZHxK1ZnnzaEX
然后需要重启一下,CMD 终端才能够刷新环境变量。
......@@ -58,13 +58,13 @@ DjangoWebBlog 是我们的项目目录,进入这个目录下创建虚拟环境
这边以安装 python2 版本的虚拟环境为例说明。
|image2|
.. image:: http://image.iswbm.com/20190612211330.png
如果你原项目使用的是 requirements.txt 这个管理包的方式,这时候执行
``pipenv --tow`` 创建一个虚拟环境后,会找到 requirements.txt
,并根据这里面的依赖包生成 Pipfile文件。
|image3|
.. image:: http://image.iswbm.com/20190612213015.png
3. 查询虚拟环境
---------------
......@@ -82,7 +82,7 @@ DjangoWebBlog 是我们的项目目录,进入这个目录下创建虚拟环境
演示如下:
|image4|
.. image:: http://image.iswbm.com/20190612213950.png
4. 操作虚拟环境
---------------
......@@ -102,7 +102,7 @@ DjangoWebBlog 是我们的项目目录,进入这个目录下创建虚拟环境
执行 ``pipenv shell``
就可以进入这个虚拟环境,在头部会有虚拟环境的标识名称。有这个标识,说明已经进入虚拟环境。
|image5|
.. image:: http://image.iswbm.com/20190612211925.png
.. code:: python
......@@ -156,19 +156,9 @@ DjangoWebBlog 是我们的项目目录,进入这个目录下创建虚拟环境
打印该虚拟环境下所有包的依赖关系图
|image6|
.. image:: http://image.iswbm.com/20190614000336.png
有的python第三方包旧版本会有安全漏洞,使用 pipenv check
可以检查安全漏洞。
|image7|
.. |image0| image:: http://image.iswbm.com/Fk6WZ2xbqg2DM3AvnYCpsiKQ4xOn
.. |image1| image:: http://image.iswbm.com/FjuJ8yZsgjkzVuBRZHxK1ZnnzaEX
.. |image2| image:: http://image.iswbm.com/20190612211330.png
.. |image3| image:: http://image.iswbm.com/20190612213015.png
.. |image4| image:: http://image.iswbm.com/20190612213950.png
.. |image5| image:: http://image.iswbm.com/20190612211925.png
.. |image6| image:: http://image.iswbm.com/20190614000336.png
.. |image7| image:: http://image.iswbm.com/20190612215924.png
.. image:: http://image.iswbm.com/20190612215924.png
......@@ -37,13 +37,13 @@ pipx 的存在使这个流程变得更加舒畅,使用 pipx
1. 二进制文件的保存位置:默认是 ``~/.local/bin``\ ,可使用环境变量
``PIPX_BIN_DIR``
进行更改,或者执行如下命令(\ ``python3 -m userpath append ${you_path}``)
进行更改,或者执行如下命令(``python3 -m userpath append ${you_path}``)
2. 虚拟环境的保存位置:默认是 ``~/.local/pipx``\ ,可使用环境变量
``PIPX_HOME`` 进行更改
在我安装好 pipx ,准备使用的时候,发现全局找不到 pipx 这个命令。
|image0|
.. image:: http://image.iswbm.com/image-20201130124107950.png
按照如上图所示,难道使用全路径执行命令?
......@@ -60,7 +60,7 @@ pipx 的存在使这个流程变得更加舒畅,使用 pipx
软链接建好后,就可以直接使用 ``pipx`` 的命令啦。
|image1|
.. image:: http://image.iswbm.com/image-20201130124554404.png
刚刚我使用 pipx 安装了 youtube-dl 后,其实并没有将这个 youtube-dl
安装到系统全局的 Python 环境中。
......@@ -69,7 +69,7 @@ pipx 的存在使这个流程变得更加舒畅,使用 pipx
现在来看一下,这个路径下面都有哪些东西?
|image2|
.. image:: http://image.iswbm.com/image-20201130125257203.png
从截图上可以看出
......@@ -79,7 +79,7 @@ pipx 的存在使这个流程变得更加舒畅,使用 pipx
- 然后在 ``~/.local/bin`` 的目录下新建一个软链接,指向这个虚拟环境中
- 这样 ``youtube-dl`` 就变成全局的工具啦。
|image3|
.. image:: http://image.iswbm.com/image-20201130131138939.png
为了避免你新安装的 youtube-dl 与全局的冲突,你也可以指定 pipx
的命令来运行 youtube-dl
......@@ -90,7 +90,7 @@ pipx 的存在使这个流程变得更加舒畅,使用 pipx
运行效果如下:
|image4|
.. image:: http://image.iswbm.com/image-20201130210539907.png
pip run 也可以直接执行在线的 python 脚本
......@@ -200,7 +200,7 @@ pip run 也可以直接执行在线的 python 脚本
效果如下
|image5|
.. image:: http://image.iswbm.com/image-20201130215320069.png
8. 其他
-------
......@@ -217,12 +217,12 @@ pip run 也可以直接执行在线的 python 脚本
我安装好后,可以使用 tab 键进行命令补全。
|image6|
.. image:: http://image.iswbm.com/image-20201130220233001.png
执行 ``pipx ensurepath`` 可以确保 ``~/.local/bin``
这个重要的目录,已经放入到 ``$PATH`` 的变量中。
|image7|
.. image:: http://image.iswbm.com/image-20201130215826513.png
9. pipx vs pip
--------------
......@@ -241,13 +241,3 @@ pipx 只是解决 pip
- https://github.com/pipxproject/pipx
- https://pipxproject.github.io/pipx/comparisons/
.. |image0| image:: http://image.iswbm.com/image-20201130124107950.png
.. |image1| image:: http://image.iswbm.com/image-20201130124554404.png
.. |image2| image:: http://image.iswbm.com/image-20201130125257203.png
.. |image3| image:: http://image.iswbm.com/image-20201130131138939.png
.. |image4| image:: http://image.iswbm.com/image-20201130210539907.png
.. |image5| image:: http://image.iswbm.com/image-20201130215320069.png
.. |image6| image:: http://image.iswbm.com/image-20201130220233001.png
.. |image7| image:: http://image.iswbm.com/image-20201130215826513.png
......@@ -23,6 +23,23 @@ $ poetry --version
Poetry version 1.1.4
```
如果不可用,可能是环境变量没有设置
```shell
echo $PATH
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
```
我使用第一种方法,安装后,会自动把设置环境变量的命令写入 `.zshrc`,要使之立即生效,需要手动 source 下
```bash
tail -n 1 ~/.zshrc
export PATH="$HOME/.poetry/bin:$PATH"
source ~/.zshrc
echo $PATH
/Users/iswbm/.poetry/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
```
## 2. 创建项目
如果你是在一个已有的项目里使用 Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件:
......@@ -161,12 +178,11 @@ $ poetry config settings.virtualenvs.in-project true
```
[[tool.poetry.source]]
name = "douban"
url = "https://pypi.doubanio.com/simple/"
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
```
不过经过测试 Poetry 会使用 pip.ini 设置的 PyPI 镜像,而且豆瓣的源好像很久没更新了(创建虚拟环境安装的默认依赖里 importlib-metadata==0.20 找不到),[这篇文章](https://link.zhihu.com/?target=http%3A//greyli.com/set-custom-pypi-mirror-url-for-pip-pipenv-poetry-and-flit/)列出了一些其他国内的 PyPI 源。
## 7. 参考文章
- [相比 Pipenv,Poetry 是一个更好的选择](https://zhuanlan.zhihu.com/p/81025311)
\ No newline at end of file
- [相比 Pipenv,Poetry 是一个更好的选择](https://zhuanlan.zhihu.com/p/81025311)
- [从国内的 PyPI 镜像(源)安装 Python 包](https://greyli.com/set-pypi-mirror/)
\ No newline at end of file
......@@ -26,6 +26,26 @@ pipx 或 pipsi
$ poetry --version
Poetry version 1.1.4
如果不可用,可能是环境变量没有设置
.. code:: shell
➜ echo $PATH
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
我使用第一种方法,安装后,会自动把设置环境变量的命令写入
``.zshrc``\ ,要使之立即生效,需要手动 source 下
.. code:: bash
➜ tail -n 1 ~/.zshrc
export PATH="$HOME/.poetry/bin:$PATH"
➜ source ~/.zshrc
➜ echo $PATH
/Users/iswbm/.poetry/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
2. 创建项目
-----------
......@@ -76,7 +96,7 @@ pipx 或 pipsi
文件,会安装这个文件中列出的锁定版本的依赖。如果执行 add/remove
命令的时候没有检测到虚拟环境,也会为当前目录自动创建虚拟环境。
|image0|
.. image:: http://image.iswbm.com/image-20201220164337699.png
4. 使用虚拟环境
---------------
......@@ -183,20 +203,13 @@ Poetry 的配置存储在单独的文件中,比 Pipenv
::
[[tool.poetry.source]]
name = "douban"
url = "https://pypi.doubanio.com/simple/"
不过经过测试 Poetry 会使用 pip.ini 设置的 PyPI
镜像,而且豆瓣的源好像很久没更新了(创建虚拟环境安装的默认依赖里
importlib-metadata==0.20
找不到),\ `这篇文章 <https://link.zhihu.com/?target=http%3A//greyli.com/set-custom-pypi-mirror-url-for-pip-pipenv-poetry-and-flit/>`__\ 列出了一些其他国内的
PyPI 源。
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
7. 参考文章
-----------
- `相比 Pipenv,Poetry
是一个更好的选择 <https://zhuanlan.zhihu.com/p/81025311>`__
.. |image0| image:: http://image.iswbm.com/image-20201220164337699.png
- `从国内的 PyPI 镜像(源)安装 Python
包 <https://greyli.com/set-pypi-mirror/>`__
......@@ -23,7 +23,7 @@
使用 venv 创建虚拟环境的速度非常快,大概只需要两三秒的样子。
|image0|
.. image:: http://image.iswbm.com/image-20201226172542169.png
创建完成后,在你所指定的目录下会有一个 ``pyvenv.cfg``
的配置文件,它记录着虚拟环境的基本信息,包括你使用的 Python
......@@ -72,7 +72,7 @@ Python 去创建,就要用绝对路径去创建了。
如果你使用PowserShell激活虚拟环境出现如下错误,那要先执行这个命令:\ ``Set-ExecutionPolicy RemoteSigned``\ ,再按
``Y``
|image1|
.. image:: http://image.iswbm.com/20201231140727.png
而如果你使用的 Mac 或者 Linux,那么直接执行下面命令就行
......@@ -85,7 +85,7 @@ Python 去创建,就要用绝对路径去创建了。
由于虚拟环境是全新的干净环境,此时你使用 ``pip list``
,会看到啥包都没有,只有最基本的 pip 和 setuptools 。
|image2|
.. image:: http://image.iswbm.com/image-20201226174305992.png
3. 退出虚拟环境
---------------
......@@ -106,8 +106,3 @@ Python 去创建,就要用绝对路径去创建了。
poetry 和 pipenv 用于项目的管理,因此 venv
建议只做了解,在一些简单的场景中可以使用,如果是复杂的项目中,可以直接上
poetry 和 pipenv。
.. |image0| image:: http://image.iswbm.com/image-20201226172542169.png
.. |image1| image:: http://image.iswbm.com/20201231140727.png
.. |image2| image:: http://image.iswbm.com/image-20201226174305992.png
......@@ -15,7 +15,7 @@ pep8规范的代码,并且能够自动格式化。这需要用到两个工具
整个的 workflow 如下图所示:
|image0|
.. image:: http://image.iswbm.com/20201213224702.png
具体的执行步骤如下:
......@@ -46,20 +46,20 @@ commit,就能顺利提交了。
新建一个测试文件:\ ``bad_pep8.py``\ :
|image1|
.. image:: http://image.iswbm.com/20201213224716.png
有好几处不符合 pep8规范,我们试着 commit 一下:
|image2|
.. image:: http://image.iswbm.com/20201213224726.png
可以看到两个 hook 都没有通过,另外 ``black``\ 帮我们把代码格式化了。
|image3|
.. image:: http://image.iswbm.com/20201213224737.png
同时\ ``flake8``\ 提示我们\ ``x``\ 变量定义了但是没有使用,把这一行删掉,然后重新add
并 commit:
|image4|
.. image:: http://image.iswbm.com/20201213224752.png
如果你觉得没有必要强制要求不能定义变量而不使用(从输出可以看出这个规范的编号为F841),可以在项目根目录建一个\ ``.flake8``\ 配置文件,如下图。更加详细的配置请看\ `官方文档 <http://flake8.pycqa.org/en/latest/user/configuration.html>`__\ 。
......@@ -67,10 +67,3 @@ commit,就能顺利提交了。
[flake8]
ignore = F841
.. |image0| image:: http://image.iswbm.com/20201213224702.png
.. |image1| image:: http://image.iswbm.com/20201213224716.png
.. |image2| image:: http://image.iswbm.com/20201213224726.png
.. |image3| image:: http://image.iswbm.com/20201213224737.png
.. |image4| image:: http://image.iswbm.com/20201213224752.png
......@@ -140,15 +140,13 @@ Cookiecutters <https://github.com/audreyr/cookiecutter/tree/db14e06a1dcc0187beea
`cookiecutter <https://github.com/audreyr/cookiecutter>`__\ 的简短形式,支持以下三种平台。
+----------------------------------------+--------------+
| Platform | abbreviation |
+========================================+==============+
| `GitHub <https://github.com/>`__ | ``gh`` |
+----------------------------------------+--------------+
| `BitBucket <https://bitbucket.org/>`__ | ``bb`` |
+----------------------------------------+--------------+
| `GitLab <https://gitlab.com/>`__ | ``gl`` |
+----------------------------------------+--------------+
====================================== ============
Platform abbreviation
====================================== ============
`GitHub <https://github.com/>`__ ``gh``
`BitBucket <https://bitbucket.org/>`__ ``bb``
`GitLab <https://gitlab.com/>`__ ``gl``
====================================== ============
`cookiecutter <https://github.com/audreyr/cookiecutter>`__\ 也支持Mercurial(\ ``hg``\ )。
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册