描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111687382丛书名: 智能系统与技术丛书
编辑推荐
本书包括新的强化学习工具和技术,介绍了强化学习的基础知识,以及如何动手编写智能体以执行一系列实际任务。
本书较上一版新增6章,专门介绍了强化学习的新发展,包括离散优化(解决魔方问题)、多智能体方法、Microsoft的TextWorld环境、高级探索技术等。学完本书,你将对这个新兴领域的前沿技术有深刻的理解。
此外,你将获得对深度Q-network、策略梯度方法、连续控制问题以及高度可扩展的非梯度方法等领域的可行洞见,还将学会如何构建一个经过强化学习训练、价格低廉的真实硬件机器人,并通过逐步代码优化在短短30分钟的训练后解决Pong环境问题。
简而言之,本书将帮助你探索强化学习中令人兴奋的复杂主题,让你通过实例获得经验和知识。
本书较上一版新增6章,专门介绍了强化学习的新发展,包括离散优化(解决魔方问题)、多智能体方法、Microsoft的TextWorld环境、高级探索技术等。学完本书,你将对这个新兴领域的前沿技术有深刻的理解。
此外,你将获得对深度Q-network、策略梯度方法、连续控制问题以及高度可扩展的非梯度方法等领域的可行洞见,还将学会如何构建一个经过强化学习训练、价格低廉的真实硬件机器人,并通过逐步代码优化在短短30分钟的训练后解决Pong环境问题。
简而言之,本书将帮助你探索强化学习中令人兴奋的复杂主题,让你通过实例获得经验和知识。
内容简介
本书理论与实践相结合,系统阐述强化学习的基础知识,以及如何动手编写智能体以执行一系列实际任务。通过阅读本书,读者将获得深层Q网络、策略梯度方法、连续控制问题以及高度可扩展的非梯度方法等主题领域的可行洞见,还将学会如何构建一个经过强化学习训练、价格低廉的真实硬件机器人,并通过一步步代码优化在短短30分钟的训练后解决Pong环境。此外,本书还专门介绍了强化学习的新发展,包括离散优化(解决魔方问题)、多智能体方法、Microsoft的TextWorld环境、高级探索技术等。
目 录
译者序
前言
作者简介
审校者简介
第1章 什么是强化学习1
1.1 机器学习分类2
1.1.1 监督学习2
1.1.2 非监督学习2
1.1.3 强化学习2
1.2 强化学习的复杂性4
1.3 强化学习的形式4
1.3.1 奖励5
1.3.2 智能体6
1.3.3 环境6
1.3.4 动作7
1.3.5 观察7
1.4 强化学习的理论基础9
1.4.1 马尔可夫决策过程9
1.4.2 策略17
1.5 总结18
第2章 OpenAI Gym19
2.1 剖析智能体19
2.2 硬件和软件要求21
2.3 OpenAI Gym API23
2.3.1 动作空间23
2.3.2 观察空间23
2.3.3 环境25
2.3.4 创建环境26
2.3.5 车摆系统28
2.4 随机CartPole智能体30
2.5 Gym的额外功能:包装器和监控器30
2.5.1 包装器31
2.5.2 监控器33
2.6 总结35
第3章 使用PyTorch进行深度学习36
3.1 张量36
3.1.1 创建张量37
3.1.2 零维张量39
3.1.3 张量操作39
3.1.4 GPU张量40
3.2 梯度41
3.3 NN构建块44
3.4 自定义层45
3.5 终黏合剂:损失函数和优化器47
3.5.1 损失函数48
3.5.2 优化器48
3.6 使用TensorBoard进行监控50
3.6.1 TensorBoard 10150
3.6.2 绘图52
3.7 示例:将GAN应用于Atari图像53
3.8 PyTorch Ignite57
3.9 总结61
第4章 交叉熵方法62
4.1 RL方法的分类62
4.2 交叉熵方法的实践63
4.3 交叉熵方法在CartPole中的应用65
4.4 交叉熵方法在FrozenLake中的应用72
4.5 交叉熵方法的理论背景78
4.6 总结79
第5章 表格学习和Bellman方程80
5.1 价值、状态和性80
5.2 Bellman方程82
5.3 动作的价值84
5.4 价值迭代法86
5.5 价值迭代实践87
5.6 Q-learning在FrozenLake中的应用92
5.7 总结94
第6章 深度Q-network95
6.1 现实的价值迭代95
6.2 表格Q-learning96
6.3 深度Q-learning100
6.3.1 与环境交互102
6.3.2 SGD优化102
6.3.3 步骤之间的相关性103
6.3.4 马尔可夫性质103
6.3.5 DQN训练的终形式103
6.4 DQN应用于Pong游戏104
6.4.1 包装器105
6.4.2 DQN模型109
6.4.3 训练110
6.4.4 运行和性能118
6.4.5 模型实战120
6.5 可以尝试的事情122
6.6 总结123
第7章 高级强化学习库124
7.1 为什么使用强化学习库124
7.2 PTAN库125
7.2.1 动作选择器126
7.2.2 智能体127
7.2.3 经验源131
7.2.4 经验回放缓冲区136
7.2.5 TargetNet类137
7.2.6 Ignite帮助类139
7.3 PTAN版本的CartPole解决方案139
7.4 其他强化学习库141
7.5 总结141
第8章 DQN扩展142
8.1 基础DQN143
8.1.1 通用库143
8.1.2 实现147
8.1.3 结果148
8.2 N步DQN150
8.2.1 实现152
8.2.2 结果152
8.3 Double DQN153
8.3.1 实现154
8.3.2 结果155
8.4 噪声网络156
8.4.1 实现157
8.4.2 结果159
8.5 带优先级的回放缓冲区160
8.5.1 实现161
8.5.2 结果164
8.6 Dueling DQN165
8.6.1 实现166
8.6.2 结果167
8.7 Categorical DQN168
8.7.1 实现171
8.7.2 结果175
8.8 组合所有方法178
8.9 总结180
8.10 参考文献180
第9章 加速强化学习训练的方法182
9.1 为什么速度很重要182
9.2 基线184
9.3 PyTorch中的计算图186
9.4 多个环境188
9.5 在不同进程中分别交互和训练190
9.6 调整包装器194
9.7 基准测试总结198
9.8 硬核CuLE199
9.9 总结199
9.10 参考文献199
第10章 使用强化学习进行股票交易200
10.1 交易200
10.2 数据201
10.3 问题陈述和关键决策202
10.4 交易环境203
10.5 模型210
10.6 训练代码211
10.7 结果211
10.7.1 前馈模型212
10.7.2 卷积模型217
10.8 可以尝试的事情218
10.9 总结219
第11章 策略梯度:一种替代方法220
11.1 价值与策略220
11.1.1 为什么需要策略221
11.1.2 策略表示221
11.1.3 策略梯度222
11.2 REINFORCE方法222
11.2.1 CartPole示例223
11.2.2 结果227
11.2.3 基于策略的方法与基于价值的方法228
11.3 REINFORCE的问题229
11.3.1 需要完整片段229
11.3.2 高梯度方差229
11.3.3 探索230
11.3.4 样本相关性230
11.4 用于CartPole的策略梯度方法230
11.4.1 实现231
11.4.2 结果233
11.5 用于Pong的策略梯度方法237
11.5.1 实现238
11.5.2 结果239
11.6 总结240
第12章 actor-critic方法241
12.1 减小方差241
12.2 CartPole的方差243
12.3 actor-crit
前言
作者简介
审校者简介
第1章 什么是强化学习1
1.1 机器学习分类2
1.1.1 监督学习2
1.1.2 非监督学习2
1.1.3 强化学习2
1.2 强化学习的复杂性4
1.3 强化学习的形式4
1.3.1 奖励5
1.3.2 智能体6
1.3.3 环境6
1.3.4 动作7
1.3.5 观察7
1.4 强化学习的理论基础9
1.4.1 马尔可夫决策过程9
1.4.2 策略17
1.5 总结18
第2章 OpenAI Gym19
2.1 剖析智能体19
2.2 硬件和软件要求21
2.3 OpenAI Gym API23
2.3.1 动作空间23
2.3.2 观察空间23
2.3.3 环境25
2.3.4 创建环境26
2.3.5 车摆系统28
2.4 随机CartPole智能体30
2.5 Gym的额外功能:包装器和监控器30
2.5.1 包装器31
2.5.2 监控器33
2.6 总结35
第3章 使用PyTorch进行深度学习36
3.1 张量36
3.1.1 创建张量37
3.1.2 零维张量39
3.1.3 张量操作39
3.1.4 GPU张量40
3.2 梯度41
3.3 NN构建块44
3.4 自定义层45
3.5 终黏合剂:损失函数和优化器47
3.5.1 损失函数48
3.5.2 优化器48
3.6 使用TensorBoard进行监控50
3.6.1 TensorBoard 10150
3.6.2 绘图52
3.7 示例:将GAN应用于Atari图像53
3.8 PyTorch Ignite57
3.9 总结61
第4章 交叉熵方法62
4.1 RL方法的分类62
4.2 交叉熵方法的实践63
4.3 交叉熵方法在CartPole中的应用65
4.4 交叉熵方法在FrozenLake中的应用72
4.5 交叉熵方法的理论背景78
4.6 总结79
第5章 表格学习和Bellman方程80
5.1 价值、状态和性80
5.2 Bellman方程82
5.3 动作的价值84
5.4 价值迭代法86
5.5 价值迭代实践87
5.6 Q-learning在FrozenLake中的应用92
5.7 总结94
第6章 深度Q-network95
6.1 现实的价值迭代95
6.2 表格Q-learning96
6.3 深度Q-learning100
6.3.1 与环境交互102
6.3.2 SGD优化102
6.3.3 步骤之间的相关性103
6.3.4 马尔可夫性质103
6.3.5 DQN训练的终形式103
6.4 DQN应用于Pong游戏104
6.4.1 包装器105
6.4.2 DQN模型109
6.4.3 训练110
6.4.4 运行和性能118
6.4.5 模型实战120
6.5 可以尝试的事情122
6.6 总结123
第7章 高级强化学习库124
7.1 为什么使用强化学习库124
7.2 PTAN库125
7.2.1 动作选择器126
7.2.2 智能体127
7.2.3 经验源131
7.2.4 经验回放缓冲区136
7.2.5 TargetNet类137
7.2.6 Ignite帮助类139
7.3 PTAN版本的CartPole解决方案139
7.4 其他强化学习库141
7.5 总结141
第8章 DQN扩展142
8.1 基础DQN143
8.1.1 通用库143
8.1.2 实现147
8.1.3 结果148
8.2 N步DQN150
8.2.1 实现152
8.2.2 结果152
8.3 Double DQN153
8.3.1 实现154
8.3.2 结果155
8.4 噪声网络156
8.4.1 实现157
8.4.2 结果159
8.5 带优先级的回放缓冲区160
8.5.1 实现161
8.5.2 结果164
8.6 Dueling DQN165
8.6.1 实现166
8.6.2 结果167
8.7 Categorical DQN168
8.7.1 实现171
8.7.2 结果175
8.8 组合所有方法178
8.9 总结180
8.10 参考文献180
第9章 加速强化学习训练的方法182
9.1 为什么速度很重要182
9.2 基线184
9.3 PyTorch中的计算图186
9.4 多个环境188
9.5 在不同进程中分别交互和训练190
9.6 调整包装器194
9.7 基准测试总结198
9.8 硬核CuLE199
9.9 总结199
9.10 参考文献199
第10章 使用强化学习进行股票交易200
10.1 交易200
10.2 数据201
10.3 问题陈述和关键决策202
10.4 交易环境203
10.5 模型210
10.6 训练代码211
10.7 结果211
10.7.1 前馈模型212
10.7.2 卷积模型217
10.8 可以尝试的事情218
10.9 总结219
第11章 策略梯度:一种替代方法220
11.1 价值与策略220
11.1.1 为什么需要策略221
11.1.2 策略表示221
11.1.3 策略梯度222
11.2 REINFORCE方法222
11.2.1 CartPole示例223
11.2.2 结果227
11.2.3 基于策略的方法与基于价值的方法228
11.3 REINFORCE的问题229
11.3.1 需要完整片段229
11.3.2 高梯度方差229
11.3.3 探索230
11.3.4 样本相关性230
11.4 用于CartPole的策略梯度方法230
11.4.1 实现231
11.4.2 结果233
11.5 用于Pong的策略梯度方法237
11.5.1 实现238
11.5.2 结果239
11.6 总结240
第12章 actor-critic方法241
12.1 减小方差241
12.2 CartPole的方差243
12.3 actor-crit
前 言
本书的主题是强化学习(Reinforcement Learning,RL),它是机器学习(Machine Learning,ML)的一个分支,强调如何解决在复杂环境中选择动作时产生的通用且极具挑战的问题。学习过程仅由奖励值和从环境中获得的观察驱动。该模型非常通用,能应用于多个真实场景,从玩游戏到优化复杂制造过程都能涵盖。
由于它的灵活性和通用性,RL领域在快速发展的同时,吸引了很多人的关注。其中,既包括试图改进现有方法或创造新方法的研究人员,也包括专注于用有效的方式解决问题的从业人员。
写本书的目的
写本书的目的是填补RL理论系统和实际应用之间的巨大空白。目前全世界有很多研究活动,基本上每天都有新的相关论文发表,并且有很多深度学习的会议,例如神经信息处理系统(Neural Information Processing Systems,NeurIPS)大会和国际学习表征会议(International Conference on Learning Representations,ICLR)。同时,有好几个大型研究组织致力于将RL应用于机器人、医学、多智能体系统等领域。
的相关研究资料虽然很容易获得,却都过于专业和抽象,难以理解。RL的实践落地则显得更为困难,因为将论文中由数学公式堆砌的大量抽象理论转换成解决实际问题的实现方式并不总是显而易见的。
这使得一些对该领域感兴趣的人很难理解隐含在论文或学术会议背后的方法与思想。虽然针对RL的各个方面有很多非常棒的博客用生动的例子来解释,但博客的形式限制让作者们只能阐述一两种方法,而不是构建一个完整的全景图来将不同的方法联系起来。本书就是为了解决这个问题而写的。
教学方法
本书的另一个关注点是实际应用。每个方法针对非常简单到非常复杂的情况都进行了实现。我试图让例子简洁易懂,PyTorch的易读与强大使之成为可能。另外,例子的复杂度是针对RL业余爱好者而设计的,不需要大量的计算资源,比如图形处理器(GPU)集群或很强大的工作站。我相信,这将使充满乐趣和令人兴奋的RL领域不仅限于研究小组或大型人工智能公司,还可以让更广泛的受众涉足。但毕竟本书有关内容还是“深度”RL,因此强烈建议大家使用GPU。
除了Atari游戏或连续控制问题等RL中一些经典的中等规模例子外,本书还有好几章(第10、14、15、16和18章)介绍大型项目,说明RL方法能应用到更复杂的环境和任务中。这些例子不是现实场景中的完整项目,但也足以说明,除了精心设计的基准测试外,RL能在更大的范围内应用。
本书从结构上看分为四个部分,其中第1~4章为部分,第5~10章为第二部分,第11~16为第三部分,第17~25章为第四部分。关于本书前三个部分的例子,值得注意的另一件事是我试图使它们成为独立的,会完整地显示所有代码。有时这会导致代码片段的重复(例如,大多数方法中的训练迭代都很相似),但是我认为,让大家学到想学的函数比刻意避免一些重复更重要,你可以自行跳转到需要的代码。本书中的所有例子都能在GitHub上找到,网址为https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition。欢迎你来获取、实验并贡献代码。
读者对象
本书面向已经有机器学习基础而想对RL领域进行实践的读者。阅读本书前,读者应该熟悉Python并且有一定的深度学习和机器学习基础。具有统计学和概率论知识会大有帮助,但对于理解本书的大部分内容都不是必要的。
本书内容
第1章介绍了RL的思想和模型。
第2章使用开源库Gym介绍了RL实践。
第3章概述了PyTorch库。
第4章用简单的RL方法对RL的方法和问题进行了初步介绍。
第5章介绍了基于价值的RL方法。
第6章描述了深度Q-network(DQN),是对基础的基于价值的方法的扩展,能解决复杂环境下的问题。
第7章描述了PTAN库,它可以简化RL方法的实现。
第8章详细介绍了DQN的扩展方法,以提升在复杂环境下的稳定性和收敛性。
第9章概述了使RL代码加速执行的办法。
第10章给出了个练习项目,重点是将DQN方法应用于股票交易。
第11章介绍了另一类RL方法,即基于策略学习的方法。
第12章描述了RL中使用非常广泛的方法之一。
第13章用并行环境交互的方式扩展了actor-critic方法,从而提高了稳定性和收敛性。
第14章给出了第二个项目,展示了如何将RL方法应用于自然语言处理问题。
第15章介绍了RL方法在文字冒险游戏中的应用。
第16章给出了另一个大项目,使用MiniWoB任务集将RL应用于Web导航。
第17章介绍了连续动作空间的环境特性以及各种方法。
第18章介绍了RL方法在机器人问题中的应用,描述了如何用RL方法来构建和训练小型机器人。
第19章仍是有关连续动作空间的章节,描述了一组置信域方法在其中的应用。
第20章展示了另一组不显式使用梯度的方法。
第21章介绍了能更好地进行环境探索的方法。
第22章介绍了RL的基于模型的方法,并使用了将想象力应用于RL的研究结果。
第23章描述了AlphaGo Zero方法并将其应用于四子连横棋游戏中。
第24章使用魔方作为环境,描述了RL方法在离散优化领域的应用。
第25章介绍了一个相对较新的RL方法应用方向,即在多智能体情境下的应用。
阅读指导
本书的所有章节都采用同样的结构来描述RL方法:首先讨论方法的动机、理论基础以及背后的思想;然后,给出几个不同环境下的带完整源代码的例子。
你可以通过不同的方式来阅读本书:
1. 若要快速熟悉某些方法,可以只阅读相关章节的简介部分。
2. 若要深入理解某个方法是如何实现的,可以阅读代码和相关注释。
3. 若要深度熟悉某个方法(我认为是好的学习方式),可以尝试借助提供的代码重新实现该方法并使之有效。
无论如何,我希望这本书对你有帮助!
下载示例代码及彩色图片
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。
本书的代码也托管在GitHub上(https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition)。如果代码有更新,GitHub上的代码会同步更新。本书所有彩色版屏幕截图/图表的PDF文件也可以从https://static.packt-cdn.com/downloads/ 9781838826994_ColorImages.pdf下载。
排版约定
文中的代码体:表示出现在文中的代码、数据库表名、目录名、文件名、文件扩展名、路径、用户输入、Twitter句柄。
代码块示例:
由于它的灵活性和通用性,RL领域在快速发展的同时,吸引了很多人的关注。其中,既包括试图改进现有方法或创造新方法的研究人员,也包括专注于用有效的方式解决问题的从业人员。
写本书的目的
写本书的目的是填补RL理论系统和实际应用之间的巨大空白。目前全世界有很多研究活动,基本上每天都有新的相关论文发表,并且有很多深度学习的会议,例如神经信息处理系统(Neural Information Processing Systems,NeurIPS)大会和国际学习表征会议(International Conference on Learning Representations,ICLR)。同时,有好几个大型研究组织致力于将RL应用于机器人、医学、多智能体系统等领域。
的相关研究资料虽然很容易获得,却都过于专业和抽象,难以理解。RL的实践落地则显得更为困难,因为将论文中由数学公式堆砌的大量抽象理论转换成解决实际问题的实现方式并不总是显而易见的。
这使得一些对该领域感兴趣的人很难理解隐含在论文或学术会议背后的方法与思想。虽然针对RL的各个方面有很多非常棒的博客用生动的例子来解释,但博客的形式限制让作者们只能阐述一两种方法,而不是构建一个完整的全景图来将不同的方法联系起来。本书就是为了解决这个问题而写的。
教学方法
本书的另一个关注点是实际应用。每个方法针对非常简单到非常复杂的情况都进行了实现。我试图让例子简洁易懂,PyTorch的易读与强大使之成为可能。另外,例子的复杂度是针对RL业余爱好者而设计的,不需要大量的计算资源,比如图形处理器(GPU)集群或很强大的工作站。我相信,这将使充满乐趣和令人兴奋的RL领域不仅限于研究小组或大型人工智能公司,还可以让更广泛的受众涉足。但毕竟本书有关内容还是“深度”RL,因此强烈建议大家使用GPU。
除了Atari游戏或连续控制问题等RL中一些经典的中等规模例子外,本书还有好几章(第10、14、15、16和18章)介绍大型项目,说明RL方法能应用到更复杂的环境和任务中。这些例子不是现实场景中的完整项目,但也足以说明,除了精心设计的基准测试外,RL能在更大的范围内应用。
本书从结构上看分为四个部分,其中第1~4章为部分,第5~10章为第二部分,第11~16为第三部分,第17~25章为第四部分。关于本书前三个部分的例子,值得注意的另一件事是我试图使它们成为独立的,会完整地显示所有代码。有时这会导致代码片段的重复(例如,大多数方法中的训练迭代都很相似),但是我认为,让大家学到想学的函数比刻意避免一些重复更重要,你可以自行跳转到需要的代码。本书中的所有例子都能在GitHub上找到,网址为https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition。欢迎你来获取、实验并贡献代码。
读者对象
本书面向已经有机器学习基础而想对RL领域进行实践的读者。阅读本书前,读者应该熟悉Python并且有一定的深度学习和机器学习基础。具有统计学和概率论知识会大有帮助,但对于理解本书的大部分内容都不是必要的。
本书内容
第1章介绍了RL的思想和模型。
第2章使用开源库Gym介绍了RL实践。
第3章概述了PyTorch库。
第4章用简单的RL方法对RL的方法和问题进行了初步介绍。
第5章介绍了基于价值的RL方法。
第6章描述了深度Q-network(DQN),是对基础的基于价值的方法的扩展,能解决复杂环境下的问题。
第7章描述了PTAN库,它可以简化RL方法的实现。
第8章详细介绍了DQN的扩展方法,以提升在复杂环境下的稳定性和收敛性。
第9章概述了使RL代码加速执行的办法。
第10章给出了个练习项目,重点是将DQN方法应用于股票交易。
第11章介绍了另一类RL方法,即基于策略学习的方法。
第12章描述了RL中使用非常广泛的方法之一。
第13章用并行环境交互的方式扩展了actor-critic方法,从而提高了稳定性和收敛性。
第14章给出了第二个项目,展示了如何将RL方法应用于自然语言处理问题。
第15章介绍了RL方法在文字冒险游戏中的应用。
第16章给出了另一个大项目,使用MiniWoB任务集将RL应用于Web导航。
第17章介绍了连续动作空间的环境特性以及各种方法。
第18章介绍了RL方法在机器人问题中的应用,描述了如何用RL方法来构建和训练小型机器人。
第19章仍是有关连续动作空间的章节,描述了一组置信域方法在其中的应用。
第20章展示了另一组不显式使用梯度的方法。
第21章介绍了能更好地进行环境探索的方法。
第22章介绍了RL的基于模型的方法,并使用了将想象力应用于RL的研究结果。
第23章描述了AlphaGo Zero方法并将其应用于四子连横棋游戏中。
第24章使用魔方作为环境,描述了RL方法在离散优化领域的应用。
第25章介绍了一个相对较新的RL方法应用方向,即在多智能体情境下的应用。
阅读指导
本书的所有章节都采用同样的结构来描述RL方法:首先讨论方法的动机、理论基础以及背后的思想;然后,给出几个不同环境下的带完整源代码的例子。
你可以通过不同的方式来阅读本书:
1. 若要快速熟悉某些方法,可以只阅读相关章节的简介部分。
2. 若要深入理解某个方法是如何实现的,可以阅读代码和相关注释。
3. 若要深度熟悉某个方法(我认为是好的学习方式),可以尝试借助提供的代码重新实现该方法并使之有效。
无论如何,我希望这本书对你有帮助!
下载示例代码及彩色图片
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。
本书的代码也托管在GitHub上(https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition)。如果代码有更新,GitHub上的代码会同步更新。本书所有彩色版屏幕截图/图表的PDF文件也可以从https://static.packt-cdn.com/downloads/ 9781838826994_ColorImages.pdf下载。
排版约定
文中的代码体:表示出现在文中的代码、数据库表名、目录名、文件名、文件扩展名、路径、用户输入、Twitter句柄。
代码块示例:
命令行输入或输出示例:
黑体:表示新的术语、重要的词或会在屏幕中显示的词(例如,菜单或对话框中的内容)。
表示警告或重要的提示。
表示提示和技巧。
评论
还没有评论。