Python 金融编程第二版(GPT 重译)(一)(2)https://developer.aliyun.com/article/1559383
使用云实例
本节展示了如何在 DigitalOcean 云实例上设置一个完整的 Python 基础设施。还有许多其他的云服务提供商,其中包括 亚马逊网络服务(AWS)作为领先的提供商。然而,DigitalOcean 以其简单性和相对较低的价格而闻名,他们称之为 droplet 的较小的云实例。最小的 droplet,通常足够用于探索和开发目的,每月只需 5 美元或每小时 0.007 美元。用户只按小时计费,因此您可以轻松地为 2 小时启动一个 droplet,然后销毁它,仅需收取 0.014 美元。如果您还没有账户,请在这个 注册页面 上注册一个账户,这可以为您提供 10 美元的起始信用额。
本节的目标是在 DigitalOcean 上设置一个 droplet,其中包含 Python 3.6 安装和通常所需的包(例如 NumPy
、pandas
),以及一个密码保护和安全套接字层(SSL)加密的 Jupyter Notebook 服务器安装。作为一个基于 Web 的工具套件,Jupyter Notebook 提供了三个主要工具,可以通过常规浏览器使用:
- Jupyter Notebook:这是目前非常流行的交互式开发环境,具有不同语言内核的选择,如 Python、R 和 Julia。
- 终端:通过浏览器访问的系统 shell 实现,允许进行所有典型的系统管理任务,但也可以使用诸如
Vim
或git
等有用工具。 - 编辑器:第三个主要工具是一个基于浏览器的文件编辑器,具有许多不同的编程语言和文件类型的语法突出显示以及典型的编辑功能。
在一个 droplet 上安装 Jupyter Notebook 允许通过浏览器进行 Python 开发和部署,避免了通过安全外壳(SSH)访问登录云实例的需求。
为了完成本节的目标,需要一些文件。
- 服务器设置脚本:这个脚本协调所有必要的步骤,比如将其他文件复制到 droplet 上并在 droplet 上运行它们。
- Python 和 Jupyter 安装脚本:这个脚本安装 Python、额外的包、Jupyter Notebook 并启动 Jupyter Notebook 服务器。
- Jupyter Notebook 配置文件:此文件用于配置 Jupyter Notebook 服务器,例如密码保护方面。
- RSA 公钥和私钥文件:这两个文件用于对 Jupyter Notebook 服务器进行 SSL 加密。
接下来,我们将逆向处理这个文件列表。
RSA 公钥和私钥
为了通过任意浏览器安全连接到 Jupyter Notebook 服务器,需要一个由 RSA 公钥和私钥组成的 SSL 证书(参见RSA 维基百科页面)。一般来说,人们期望这样的证书来自所谓的证书颁发机构(CA)。然而,在本书的目的下,自动生成的证书已经“足够好
“了。[⁶] 生成 RSA 密钥对的流行工具是OpenSSL
。接下来的简要交互式会话生成了适用于 Jupyter Notebook 服务器的证书。
macbookpro:~/cloud$ openssl req -x509 -nodes -days 365 -newkey \ > rsa:1024 -out cert.pem -keyout cert.key Generating a 1024 bit RSA private key ..++++++ .......++++++ writing new private key to 'cert.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]: Locality Name (eg, city) []:Voelklingen Organization Name (eg, company) [Internet Widgits Pty Ltd]:TPQ GmbH Organizational Unit Name (eg, section) []:Algo Trading Common Name (e.g. server FQDN or YOUR name) []:Jupyter Email Address []:team@tpq.io macbookpro:~/cloud$ ls cert.key cert.pem macbookpro:~/cloud$
两个文件 cert.key
和 cert.pem
需要复制到滴管上,并且需要被 Jupyter Notebook 配置文件引用。下面会介绍这个文件。
Jupyter Notebook 配置文件
可以按照运行 Notebook 服务器页面上的说明安全地部署一个公共 Jupyter Notebook 服务器。其中,Jupyter Notebook 应该受到密码保护。为此,有一个叫做 passwd
的密码哈希生成函数,可在 notebook.auth
子包中使用。下面的代码生成了一个以 jupyter
为密码的密码哈希代码。
macbookpro:~/cloud$ ipython Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:04:09) Type 'copyright', 'credits' or 'license' for more information IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: from notebook.auth import passwd In [2]: passwd('jupyter') Out[2]: 'sha1:4c72b4542011:0a8735a18ef2cba12fde3744886e61f76706299b' In [3]: exit
此哈希代码需要放置在 Jupyter Notebook 配置文件中,如示例 2-3 所示。该代码假定 RSA 密钥文件已复制到了滴管的 /root/.jupyter/
文件夹中。
示例 2-3. Jupyter Notebook 配置文件
# # Jupyter Notebook Configuration File # # Python for Finance # (c) Dr. Yves J. Hilpisch # # SSL ENCRYPTION # replace the following file names (and files used) by your choice/files c.NotebookApp.certfile = u'/root/.jupyter/cert.pem' c.NotebookApp.keyfile = u'/root/.jupyter/cert.key' # IP ADDRESS AND PORT # set ip to '*' to bind on all IP addresses of the cloud instance c.NotebookApp.ip = '*' # it is a good idea to set a known, fixed default port for server access c.NotebookApp.port = 8888 # PASSWORD PROTECTION # here: 'jupyter' as password # replace the hash code with the one for your password c.NotebookApp.password = 'sha1:bb5e01be158a:99465f872e0613a3041ec25b7860175f59847702' # NO BROWSER OPTION # prevent Jupyter from trying to open a browser c.NotebookApp.open_browser = False
注意
将 Jupyter Notebook 部署在云中主要会引发一系列安全问题,因为它是一个通过 Web 浏览器可访问的完整的开发环境。因此,使用 Jupyter Notebook 服务器默认提供的安全措施(如密码保护和 SSL 加密)至关重要。但这只是开始,根据在云实例上具体做了什么,可能建议采取进一步的安全措施。
下一步是确保 Python 和 Jupyter Notebook 在滴管上安装。
Python 和 Jupyter Notebook 的安装脚本
用于安装 Python 和 Jupyter Notebook 的 bash 脚本类似于在“使用 Docker 容器化”一节中介绍的用于在 Docker 容器中通过 Miniconda 安装 Python 的脚本。然而,这里的脚本还需要启动 Jupyter Notebook 服务器。所有主要部分和代码行都在内联注释中。
示例 2-4. 安装 Python 并运行 Jupyter Notebook 服务器的 bash 脚本
#!/bin/bash # # Script to Install # Linux System Tools and Basic Python Components # as well as to # Start Jupyter Notebook Server # # Python for Finance # (c) Dr. Yves J. Hilpisch # # GENERAL LINUX apt-get update # updates the package index cache apt-get upgrade -y # updates packages # install system tools apt-get install -y bzip2 gcc git htop screen htop vim wget apt-get upgrade -y bash # upgrades bash if necessary apt-get clean # cleans up the package index cache # INSTALLING MINICONDA wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh bash Miniconda.sh -b # installs Miniconda rm -rf Miniconda.sh # removes the installer # prepends the new path for current session export PATH="/root/miniconda3/bin:$PATH" # prepends the new path in the shell configuration cat >> ~/.profile <<EOF export PATH="/root/miniconda3/bin:$PATH" EOF # INSTALLING PYTHON LIBRARIES conda install -y jupyter # interactive data analytics in the browser conda install -y pytables # wrapper for HDF5 binary storage conda install -y pandas # data analysis package conda install -y pandas-datareader # retrieval of open data conda install -y matplotlib # standard plotting library conda install -y seaborn # statistical plotting library conda install -y quandl # wrapper for Quandl data API conda install -y scikit-learn # machine learning library conda install -y tensorflow # deep learning library conda install -y flask # light weight web framework conda install -y openpyxl # library for Excel interaction conda install -y pyyaml # library to manage yaml files pip install --upgrade pip # upgrading the package manager pip install q # logging and debugging pip install plotly # interactive D3.js plots pip install cufflinks # combining plotly with pandas # COPYING FILES AND CREATING DIRECTORIES mkdir /root/.jupyter mv /root/jupyter_notebook_config.py /root/.jupyter/ mv /root/cert.* /root/.jupyter mkdir /root/notebook cd /root/notebook # STARTING JUPYTER NOTEBOOK jupyter notebook --allow-root
此脚本需要复制到滴管上,并且需要由下一小节中描述的编排脚本启动。
管理滴管设置的脚本
设置滴水筹的第二个 bash 脚本是最短的。它主要将所有其他文件复制到滴水筹中,其中预期的是相应的 IP 地址作为参数。在最后一行,它启动install.sh
bash 脚本,后者又会进行安装并启动 Jupyter Notebook 服务器。
示例 2-5. 用于设置滴水筹的bash
脚本
#!/bin/bash # # Setting up a DigitalOcean Droplet # with Basic Python Stack # and Jupyter Notebook # # Python for Finance # (c) Dr Yves J Hilpisch # # IP ADDRESS FROM PARAMETER MASTER_IP=$1 # COPYING THE FILES scp install.sh root@${MASTER_IP}: scp cert.* jupyter_notebook_config.py root@${MASTER_IP}: # EXECUTING THE INSTALLATION SCRIPT ssh root@${MASTER_IP} bash /root/install.sh
现在一切都准备好尝试设置代码。在 DigitalOcean 上,创建一个新的滴水筹,并选择类似于以下选项:
- 操作系统:Ubuntu 16.04.3 x64(截至 2017 年 11 月 4 日的默认选择)
- 规模:1 核心,512 MB,20GB SSD(最小的滴水筹)
- 数据中心区域:法兰克福(因为作者居住在德国)
- SSH 密钥:添加(新的)SSH 密钥以实现无密码登录 ^(7)
- 滴水筹名称:您可以选择预先指定的名称,也可以选择像
py4fi
这样的名称
最后,点击创建
按钮启动滴水筹建过程,通常需要约一分钟。进行设置过程的主要结果是 IP 地址,例如,当您选择法兰克福作为数据中心位置时,可能为 46.101.156.199。现在设置滴水筹非常简单:
(py3) macbookpro:~/cloud$ bash setup.sh 46.101.156.199
结果过程可能需要几分钟。当 Jupyter Notebook 服务器出现类似于以下消息时,过程结束:
The Jupyter Notebook is running at: https://[all ip addresses on your system]:8888/
在任何当前浏览器中,访问以下地址即可访问正在运行的 Jupyter Notebook(注意https
协议):
https://46.101.156.199:8888
可能需要添加安全例外,然后 Jupyter Notebook 登录屏幕会提示输入密码(在我们的情况下为jupyter
)。现在一切准备就绪,可以通过 Jupyter Notebook 在浏览器中开始 Python 开发,通过终端窗口进行IPython
或文本文件编辑器。还提供了其他文件管理功能,如文件上传,删除文件或创建文件夹。
小贴士
像 DigitalOcean 和 Jupyter Notebook 这样的云实例是算法交易员的强大组合,可以利用专业的计算和存储基础设施。专业的云和数据中心提供商确保您的(虚拟)机器在物理上安全且高度可用。使用云实例也可以使探索和开发阶段的成本相对较低,因为通常按小时收费,而无需签订长期协议。
结论
Python 是本书选择的编程语言和技术平台。然而,Python 部署可能最多时甚至令人厌烦和心神不宁。幸运的是,今天有一些技术可用 — 都不到五年的时间 — 有助于解决部署问题。开源软件conda
有助于 Python 包和虚拟环境的管理。Docker 容器甚至可以进一步扩展,可以在一个技术上受到保护的"沙箱
"中轻松创建完整的文件系统和运行时环境。更进一步,像 DigitalOcean 这样的云提供商在几分钟内提供由专业管理和安全的数据中心提供的计算和存储容量,并按小时计费。这与 Python 3.6 安装和安全的 Jupyter Notebook 服务器安装结合在一起,为算法交易项目的 Python 开发和部署提供了专业的环境。
进一步资源
对于Python 包管理,请参考以下资源:
对于虚拟环境管理,请参阅以下资源:
关于Docker 容器的信息请见此处:
- Docker 首页
- Matthias、Karl 和 Sean Kane (2015): Docker: Up and Running. O’Reilly, 北京等。
Robbins (2016)提供了对bash
脚本语言的简明介绍和概述。
- Robbins, Arnold (2016): Bash Pocket Reference. 第 2 版,O’Reilly, 北京等。
如何安全运行公共 Jupyter Notebook 服务器请参阅运行笔记本服务器。
要在 DigitalOcean 上注册一个新帐户并获得 10 美元的起始信用,请访问此注册页面。这可以支付最小水滴两个月的使用费。
¹在撰写本文时,Python 3.7beta 刚刚发布。
²在 Windows 上,激活新环境的命令仅为activate py27
— 省略了source
。
³在官方文档中,您会找到以下解释:“Python '虚拟环境'允许将 Python 包安装在特定应用程序的隔离位置,而不是全局安装。
"参见创建虚拟环境页面。
⁴ 有关 Docker 技术的全面介绍,请参阅 Matthias 和 Kane (2015) 的书籍。
⁵ 要了解 bash
脚本的简明介绍和快速概述,请参考 Robbins (2016) 的书籍。
⁶ 使用这样一个自行生成的证书时,可能需要在浏览器提示时添加安全异常。
⁷ 如果需要帮助,请访问如何在 DigitalOcean Droplets 上使用 SSH 密钥或如何在 DigitalOcean Droplets 上使用 PuTTY(Windows 用户)。
第二部分:掌握基础知识
本书的这部分内容涉及 Python 编程的基础知识。本部分涵盖的主题对于随后部分中的所有其他章节都是基础的。
这些章节按照特定主题组织,使读者可以作为参考,查找与感兴趣的主题相关的示例和详细信息:
- 第三章 关于
Python
的数据类型和数据结构 - 第四章 关于
NumPy
及其ndarray
类 - 第五章 关于
pandas
及其DataFrame
类 - 第六章 关于使用 Python 的面向对象编程(OOP)
第三章:数据类型和结构
糟糕的程序员担心代码。优秀的程序员担心数据结构及其关系。
Linus Torvalds
介绍
本章介绍了Python
的基本数据类型和数据结构。尽管Python
解释器本身已经带来了丰富多样的数据结构,但NumPy
和其他库在其中增添了宝贵的内容。
本章组织如下:
“基本数据类型”
第一节介绍了基本数据类型,如int
、float
和string
。
“基本数据结构”
下一节介绍了Python
的基本数据结构(例如list
对象)并说明了控制结构、函数式编程范式和匿名函数。
本章的精神是在涉及数据类型和结构时提供对Python
特定内容的一般介绍。如果您具备来自其他编程语言(例如C
或Matlab
)的背景,那么您应该能够轻松掌握Python
用法可能带来的差异。此处介绍的主题对于接下来的章节都是重要且基础的。
本章涵盖以下数据类型和结构:
对象类型 | 含义 | 用法/模型 |
int |
整数值 | 自然数 |
float |
浮点数 | 实数 |
bool |
布尔值 | 某种真或假 |
str |
字符串对象 | 字符、单词、文本 |
tuple |
不可变容器 | 固定的对象集合、记录 |
list |
可变容器 | 变化的对象集合 |
dict |
可变容器 | 键-值存储 |
set |
可变容器 | 唯一对象的集合 |
基本数据类型
Python
是一种动态类型语言,这意味着Python
解释器在运行时推断对象的类型。相比之下,像C
这样的编译语言通常是静态类型的。在这些情况下,对象的类型必须在编译时与对象关联。¹
整数
最基本的数据类型之一是整数,或者int
:
In [1]: a = 10 type(a) Out[1]: int
内置函数type
提供了标准和内置类型的所有对象的类型信息,以及新创建的类和对象。在后一种情况下,提供的信息取决于程序员与类存储的描述。有一句话说“Python
中的一切都是对象。”这意味着,例如,即使是我们刚刚定义的int
对象这样的简单对象也有内置方法。例如,您可以通过调用方法bit_length
来获取表示内存中的int
对象所需的位数:
In [2]: a.bit_length() Out[2]: 4
您会发现,所需的位数随我们分配给对象的整数值的增加而增加:
In [3]: a = 100000 a.bit_length() Out[3]: 17
一般来说,有很多不同的方法,很难记住所有类和对象的所有方法。高级Python
环境,如IPython
,提供了可以显示附加到对象的所有方法的制表符完成功能。您只需键入对象名称,然后跟一个点(例如,a.
),然后按 Tab 键,例如,a.*tab*
。然后,这将提供您可以调用的对象的方法集合。或者,Python
内置函数dir
提供了任何对象的完整属性和方法列表。
Python
的一个特殊之处在于整数可以是任意大的。例如,考虑谷歌数 10¹⁰⁰。Python
对于这样的大数没有问题,这些大数在技术上是long
对象:
In [4]: googol = 10 ** 100 googol Out[4]: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In [5]: googol.bit_length() Out[5]: 333
大整数
Python
整数可以是任意大的。解释器会根据需要使用尽可能多的位/字节来表示数字。
整数的算术运算易于实现:
In [6]: 1 + 4 Out[6]: 5 In [7]: 1 / 4 Out[7]: 0.25 In [8]: type(1 / 4) Out[8]: float
浮点数
最后一个表达式返回通常期望的结果 0.25(在基本的 Python 2.7 中不同)。这使我们进入了下一个基本数据类型,即float
对象。在整数值后添加一个点,如1.
或1.0
,会导致Python
将对象解释为float
。涉及float
的表达式通常也返回一个float
对象:^(2)
In [9]: 1.6 / 4 Out[9]: 0.4 In [10]: type (1.6 / 4) Out[10]: float
float
稍微复杂一些,因为有理数或实数的计算机化表示通常不是精确的,而是取决于所采取的具体技术方法。为了说明这意味着什么,让我们定义另一个float
对象b
。像这样的float
对象总是内部表示为仅具有一定精度的。当向b
添加 0.1 时,这变得明显:
In [11]: b = 0.35 type(b) Out[11]: float In [12]: b + 0.1 Out[12]: 0.44999999999999996
这是因为+float
+s 在内部以二进制格式表示;也就是说,十进制数0 < n < 1通过形式为n = x 2 + y 4 + z 8 + . . .的系列表示。对于某些浮点数,二进制表示可能涉及大量元素,甚至可能是一个无限级数。然而,给定用于表示此类数字的固定位数-即表示系列中的固定项数-不准确是其结果。其他数字可以完美表示,因此即使只有有限数量的位可用,它们也会被精确地存储。考虑以下示例:
In [13]: c = 0.5 c.as_integer_ratio() Out[13]: (1, 2)
一半,即 0.5,被准确地存储,因为它有一个精确(有限)的二进制表示:
< / m i > < m n > 0 < / m n > < m o > . < / m o > < m n > 5 < / m n > < m o > = < / m o > < m f r a c > < m n > 1 < / m n > < m n > 2 < / m n > < / m f r a c > < m i > </mi> <mn>0</mn> <mo>.</mo> <mn>5</mn> <mo>=</mo> <mfrac><mn>1</mn> <mn>2</mn></mfrac> <mi> </mi><mn>0</mn><mo>.</mo><mn>5</mn><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mi> 。然而,对于b = 0.35,我们得到的结果与期望的有理数 < / m i > < m n > 0 < / m n > < m o > . < / m o > < m n > 35 < / m n > < m o > = < / m o > < m f r a c > < m n > 7 < / m n > < m n > 20 < / m n > < / m f r a c > < m i > </mi> <mn>0</mn> <mo>.</mo> <mn>35</mn> <mo>=</mo> <mfrac><mn>7</mn> <mn>20</mn></mfrac> <mi> </mi><mn>0</mn><mo>.</mo><mn>35</mn><mo>=</mo><mfrac><mn>7</mn><mn>20</mn></mfrac><mi> 不同:
In [14]: b.as_integer_ratio() Out[14]: (3152519739159347, 9007199254740992)
精度取决于用于表示数字的位数。一般来说,所有Python
运行的平台都使用 IEEE 754 双精度标准(即 64 位)来进行内部表示。³ 这意味着相对精度为 15 位数字。
由于这个主题在金融等几个应用领域非常重要,有时需要确保数字的确切或至少是最佳可能的表示。例如,在对一大堆数字求和时,这个问题可能很重要。在这种情况下,某种类型和/或数量级别的表示误差可能导致与基准值的显著偏差。
模块decimal
提供了一个用于浮点数的任意精度对象,以及几个选项来解决使用这些数字时的精度问题:
In [15]: import decimal from decimal import Decimal In [16]: decimal.getcontext() Out[16]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) In [17]: d = Decimal(1) / Decimal (11) d Out[17]: Decimal('0.09090909090909090909090909091')
您可以通过改变Context
对象的相应属性值来改变表示的精度:
In [18]: decimal.getcontext().prec = 4 ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png) In [19]: e = Decimal(1) / Decimal (11) e Out[19]: Decimal('0.09091') In [20]: decimal.getcontext().prec = 50 ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png) In [21]: f = Decimal(1) / Decimal (11) f Out[21]: Decimal('0.090909090909090909090909090909090909090909090909091')
低于默认精度。
高于默认精度。
如有需要,可以通过这种方式调整精度以适应手头的确切问题,并且可以处理具有不同精度的浮点对象:
In [22]: g = d + e + f g Out[22]: Decimal('0.27272818181818181818181818181909090909090909090909')
任意精度浮点数
模块decimal
提供了一个任意精度浮点数对象。在金融中,有时需要确保高精度并超越 64 位双精度标准。
布尔值
在编程中,评估比较或逻辑表达式,例如4 > 3
,4.5 <= 3.25
或(4 > 3) and (3 > 2)
,会产生True
或False
之一作为输出,这是两个重要的 Python 关键字。其他例如def
,for
或if
。Python 关键字的完整列表可在keyword
模块中找到。
In [23]: import keyword In [24]: keyword.kwlist Out[24]: ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
True
和False
是bool
数据类型,代表布尔值。以下代码展示了 Python 对相同操作数应用比较操作符后生成的bool
对象。
In [25]: 4 > 3 ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png) Out[25]: True In [26]: type(4 > 3) Out[26]: bool In [27]: type(False) Out[27]: bool In [28]: 4 >= 3 ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png) Out[28]: True In [29]: 4 < 3 ![3](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/3.png) Out[29]: False In [30]: 4 <= 3 ![4](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/4.png) Out[30]: False In [31]: 4 == 3 ![5](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/5.png) Out[31]: False In [32]: 4 != 3 ![6](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/6.png) Out[32]: True
更大。
大于或等于。
更小。
小于或等于。
相等。
不相等。
经常,逻辑运算符被应用于bool
对象,从而产生另一个bool
对象。
In [33]: True and True Out[33]: True In [34]: True and False Out[34]: False In [35]: False and False Out[35]: False In [36]: True or True Out[36]: True In [37]: True or False Out[37]: True In [38]: False or False Out[38]: False In [39]: not True Out[39]: False In [40]: not False Out[40]: True
当然,这两种类型的运算符经常结合使用。
In [41]: (4 > 3) and (2 > 3) Out[41]: False In [42]: (4 == 3) or (2 != 3) Out[42]: True In [43]: not (4 != 4) Out[43]: True In [44]: (not (4 != 4)) and (2 == 3) Out[44]: False
其一主要应用是通过其他 Python 关键字(例如if
或while
)来控制代码流程(本章后面将有更多示例)。
In [45]: if 4 > 3: ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png) print('condition true') ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png) condition true In [46]: i = 0 ![3](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/3.png) while i < 4: ![4](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/4.png) print('condition true, i = ', i) ![5](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/5.png) i += 1 ![6](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/6.png) condition true, i = 0 condition true, i = 1 condition true, i = 2 condition true, i = 3
如果条件成立,则执行要跟随的代码。
如果条件成立,则执行要跟随的代码。
使用 0 初始化参数i
。
只要条件成立,就执行并重复执行后续代码。
打印文本和参数i
的值。
将参数值增加 1;i += 1
等同于i = i + 1
。
在数值上,Python 将False
赋值为 0,将True
赋值为 1。通过bool()
函数将数字转换为bool
对象时,0 给出False
,而所有其他数字给出True
。
In [47]: int(True) Out[47]: 1 In [48]: int(False) Out[48]: 0 In [49]: float(True) Out[49]: 1.0 In [50]: float(False) Out[50]: 0.0 In [51]: bool(0) Out[51]: False In [52]: bool(0.0) Out[52]: False In [53]: bool(1) Out[53]: True In [54]: bool(10.5) Out[54]: True In [55]: bool(-2) Out[55]: True
Python 金融编程第二版(GPT 重译)(一)(4)https://developer.aliyun.com/article/1559389