书名:Python 3.0科学计算指南
ISBN:978-7-115-48114-6
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [瑞典] 克劳斯•福勒(Claus Führer)
简•埃里克•索利姆(Jan Erik Solem)
奥利维尔•维迪尔(Olivier Verdier)
译 王 威
责任编辑 吴晋瑜
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Simplified Chinese translation copyright ©2018 by Posts and Telecommunications Press
All Rights Reserved.
Scientific Computing with Python 3 by Claus Führer,Jan Erik Solem,Olivier Verdier. Copyright © 2016 Packt Publishing.
本书中文简体版由Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书旨在通过实际的Python 3.0代码示例展示Python与数学应用程序的紧密联系,介绍将Python中的各种概念用于科学计算的方法。
本书共有15章。第1~3章介绍Python中的主要语法元素、基本数据类型、容器类型等概念;第4~9章介绍线性代数、高级数组、函数、类、迭代等与数学数据类型紧密相关的内容;第10~14章就有关科学计算程序运行过程中错误处理、输入输出、测试等问题进行探索,并具体给出了一些综合实例,以帮助读者进一步掌握前述章节所涵盖的内容;第15章介绍符号计算的相关内容,旨在让读者了解这一常用于推导和验证理论上的数学模型和数值结果的技术。
本书特色鲜明,示例生动有趣,内容易读易学,既适合Python初学者和程序员阅读,也适合高校计算机专业的教师和学生参考。具有编程经验以及科学计算的爱好者也可以将本书作为研究SciPy和NumPy的参考资料。
Claus Führer 是瑞典隆德大学科学计算系的教授。他曾在许多国家和教学机构任教,拥有十分丰富的课堂教学经验,所教授的课程涉及各级数值分析和工程数学的密集程序设计。在与工业界的研究合作中,Claus还开发出了数值分析软件,并因此荣获了2016年度隆德大学工程学院最佳教师奖。
Jan Erik Solem 是Python的狂热爱好者。他曾任瑞典隆德大学的副教授,目前是Mapillary公司(一家街景计算机视觉公司)的CEO。他曾是Polar Rose公司的创始人兼CTO,并担任人脸识别专家,还担任过苹果公司计算机视觉团队的负责人。Jan是世界经济论坛的技术先驱之一,曾凭借图像分析和模式识别的论文荣获2005—2006年度北美最佳论文奖。他也是《Programming Computer Vision with Python》①一书的作者。
Olivier Verdier 于2009年获得了瑞典隆德大学的数学博士学位。他也是德国科隆大学、挪威特隆赫姆大学、挪威卑尔根大学和瑞典乌梅奥大学的博士后。Olivier Verdier早在2007年就开始用Python进行科学计算,目前是挪威卑尔根大学数学系的副教授。
① 2012年由O'Reilly出版社出版,中文名为《Python计算机视觉编程》,2014年由人民邮电出版社出版。——编辑注
王威,资深研发工程师,曾就职于携程、东方财富等互联网公司,目前专注于互联网分布式架构设计、大数据与机器学习、算法设计等领域的研究,擅长C#、Python、Java、C++等技术栈。《精通Python自然语言处理》一书的译者。
Helmut Podhaisky 在德国马丁路德•哈勒维腾贝格大学的数学研究所工作,教授数学和科学计算课程。他参与编写了一本有关常微分方程数值解法的书,并发表了若干有关数值解法的研究论文。出于工作需要和个人爱好,他同时使用Python、Fortran、Octave、Mathematica和Haskell等编程语言。
感谢德国哈勒大学的Helmut Podhaisky为我们提供了许多中肯且有益的意见和建议。在写作过程中有这样的一位合作伙伴,是我们莫大的幸运。
还要感谢本书初版的审阅者—瑞典皇家理工学院的Linda Kann、仿真研究实验室的Hans Petter Langtangen以及特隆赫姆挪威科技和自然大学的Alf Inge Wang。
一本书必须要在实际教学实践中进行检验。我们有非常棒的合作伙伴—这几年从事“Beräkningsprogramering med Python”课程的助教以及参与教学的同事。他们分别是隆德大学的Najmeh Abiri、Christian Andersson、Dara Maghdid、Peter Meisrimel、Fatemeh Mohammadi、Azahar Monge、Anna-Maria Persson、Alexandros Sopasakis和Tony Stillfjord。Najmeh Abiri还测试了本书大部分Jupyter notebook素材。
在编写本书的过程中,我们得到了来自Packt出版社的Aishwarya Pandere和 Karan Thakkar的帮助,他们在组合不同时区和不同文本处理工具方面一直都是富有建设性、友好且乐于助人的合作伙伴,谢谢两位朋友。
Claus Führer,Jan Erik Solem,Olivier Verdier隆德大学
于挪威卑尔根
Python不仅可用于通用编程,其免费开源的语言和环境使得它在科学计算领域也具有巨大的潜力。本书呈现了Python与数学应用程序的紧密联系,展示了如何将Python中的各种概念用于科学计算目的,并给出了最新版的Python 3.0代码示例。在衔接科学计算和数学时,Python可以作为一个有效的工具来使用。本书将向读者介绍将其应用于线性代数、数组、绘图、迭代、函数以及多项式等的方法。
第1章介绍了Python的主要语法元素。本章不深入细节,仅对全书进行了概览。对于想要直接开始的读者来说,本章是一个好的起点。希望在后面的章节中理解某个示例(在深入解释函数之前可能会使用类似函数的结构)的读者可以将本章作为一个快速参考。
第2章介绍了Python中最重要的基本数据类型。浮点类型以及特殊数值类型nan和inf是科学计算中比较重要的数据类型。其他基本数据类型以及布尔类型、整型、复合类型和字符串类型都会在本书中用到。
第3章解释了如何使用容器类型,主要是列表的使用。本章分别以索引和循环的方式来访问容器对象,以便解释字典和元组。有时甚至会使用集合作为一个特殊的容器类型。
第4章介绍了如何使用线性代数中最重要的对象——向量和矩阵。本书选择NumPy数组作为描述矩阵甚至高阶张量的核心工具。该数组具有许多高级特征,还允许将通用函数作用于矩阵或向量元素。本书重点说明了数组索引、切片和点积等大多数计算任务中的基本操作。为了说明SciPy子模块linalg的用法,本章提供了一些线性代数的示例。
第5章解释了数组一些更高级的方面。对于数组副本和视图之间的区别,人们普遍认为视图让程序使用数组非常快,但这通常是错误的来源,而且很难调试。本章展示和说明了使用布尔数组来编写有效、紧凑和可读的代码,最后通过类比对函数执行的操作解释了阵列广播的技术(NumPy数组的一个独特特征)。
第6章展示了如何绘图,主要是经典的x / y二维绘图,还有三维绘图和直方图。科学计算需要好的工具将结果可视化。本章从其子模块pyplot便捷的绘图命令开始介绍Python中的Matplotlib模块。通过创建诸如axes的图形对象,可以实现对绘图的精细调整和修改。我们将说明如何更改这些对象的属性,并对其进行注释。
第7章介绍了构成编程中的基本构件——函数,函数可能是最接近底层的数学概念。函数定义和函数调用可以理解为设置函数参数的不同方式。我们在本书的各种示例中引入并使用了匿名的lambda函数。
第8章介绍了类的相关内容。类的实例即为对象,我们为其提供了方法和属性。在数学中,类的属性通常相互依赖,这需要对setter函数和getter函数使用特殊的编程技术。针对特殊的数学数据类型,可以定义基本的数学运算,例如+。继承和抽象是面向对象编程所反映的数学概念。本章通过一个简单的求解常微分方程的类展示了类继承的用法。
第9章使用循环和迭代器展示了迭代的用法。本书中没有专门设置循环和迭代的章节,但是讨论了迭代器的原理并创建了自己的生成器对象。在本章中,读者将了解为什么生成器可以被用尽以及如何编写无限循环程序。对本章来说,Python的itertools模块是一个不错的伴侣。
第10章介绍错误处理的内容,涵盖错误和异常以及查找和修复它们的方法。错误或异常是一个事件,它会中断程序单元的执行。本章展示了处理异常的方法。读者将学会定义自己的异常类以及如何提供可用于捕获这些异常的有价值的信息。异常处理不仅仅是打印一条错误消息。
第11章介绍了命名空间、范围和模块,涵盖了Python的模块。什么是局部变量和全局变量?变量对程序单元什么时候可知以及什么时候不可知?本章将就这些内容进行了讨论。变量可以通过参数列表传递给函数,也可以通过利用其作用域来默认注入。该技术什么时候应该使用以及什么时候不该使用?本章将试图对这一核心问题给出答案。
第12章介绍了输入和输出,涵盖了处理数据文件的一些选项。数据文件用于为一个给定的问题存储和提供数据,通常是大规模存储量。本章介绍了使用不同的格式来访问和修改这些数据的方法。
第13章重点关注科学计算程序的测试。核心工具是单元测试,它允许我们进行自动化测试和参数化测试。通过思考计算数学中的经典二分算法,我们举例说明了设计有用测试的不同步骤,副作用就是需要发布一段代码的使用文档。详细的测试会提供测试协议,这些测试协议在之后调试一段通常由多名程序员编写的复合代码时非常有用。
第14章展示了一些综合且较长的实例,并简要介绍了其理论背景及完整实现。这些例子使用了本书展示的所有结构,并将它们放在一个更大、更复杂的上下文中。读者可以随意地扩展它们。
第15章主要讨论符号计算。科学计算主要是伴随不精确数据和近似结果的数值计算。这与通常是正式操作的符号计算形成鲜明的对比,符号计算的目标是在闭合的表达式中得到精确的答案。在本书的最后一章中,我们介绍了Python的这项技术,其经常用于推导和验证理论上的数学模型和数值结果。我们将重点介绍符号表达式的高精度浮点评估。
读者需要安装Python 3.5或更高的版本、SciPy、NumPy、Matplotlib、IPython shell(我们强烈建议通过Anaconda安装Python及其软件包)。本书的示例在内存和显卡方面没有任何特殊的硬件要求。
本书是自2008年以来在隆德大学教授的Python科学计算课程的教学成果。多年来,课程不断地扩展,这些课程资料的简明版本曾用于科隆大学、特隆赫姆大学、斯塔万格大学、索伦大学、拉普兰塔大学的教学,同时也用于公司层面的计算任务。
我们坚信Python及其周边的科学计算生态系统——SciPy、NumPY和Matplotlib将在科学计算环境中取得巨大的进步。Python和前面提到的库都是免费和开源的。更重要的是,Python是一种可以添加一系列额外附加功能的现代语言。这些附加功能包括面向对象编程、可测试、IPython的高级shell命令等。在写这本书时,我们考虑到如下两类读者。
我们的目标是阐明在科学计算环境中以Python开始的步骤。读者可以按顺序阅读,或者挑选你最感兴趣的部分阅读。毋庸置疑,提高一个人的编程技能需要大量的实践,因此实践书中所提供的示例和练习是非常明智的。
我们希望读者能使用Python、SciPy、NumPY和Matplotlib进行编程,并享受其中。
要决定一本涉及科学计算的书籍使用什么编程语言,需要考虑许多因素。语言本身的学习门槛对初学者来说是非常重要的。脚本语言通常是最好的选择。对数值计算来说,大量的模块是必需的,最好还要有强大的开发者社区。如果这些核心模块建立在经过良好测试且优化过的快速库(例如 LAPACK)的基础之上,就会更好。最后,如果语言在更广泛的应用范围内也可以使用,读者更有机会在学术背景之外使用本书所学到的技能。因此我们很自然地选择了Python语言。
简单来说,Python具有如下特点。
有一些Python的替代语言,这里列出了其中一些,并给出了它们与Python的区别。
[12]
。我们给出了一些有关Python文献的建议。这些文献可以作为补充资源或者作为并行阅读的文本材料。大多数有关Python的入门书籍都致力于将这种语言作为通用的工具。我们想在这里明确提出一个很好的例子就是文献[19]
,它通过简单的例子来解释语言,例如,用一个组建比萨店的例子来解释面向对象编程。
目前专门针对科学计算和工程的Python专著很少。我们想提一下Langtangen所著的两本书,这两本书将科学计算与现代的“pythonic”编程风格相结合,参见文献[16、17]
。
这种“pythonic”编程风格也是我们教授数值算法编程方法的指导原则。我们试图展示在计算机科学中有多少成熟的概念和结构可应用于科学计算中的问题。比萨店的例子由拉格朗日多项式(Lagrange polynomials)代替,生成器成为ODE的时间步长方法等。
最后我们不得不提到网络上数不胜数的文献。在编写这本书时,网络也是一个主要的知识来源。网络文献通常包含新事物,但也可能是完全过时的。网络还会展示可能相互矛盾的解决方案和解释。我们强烈建议将网络作为附加资源,但更好的切入点是“传统的”教科书加上“编辑过的”网络资源,这足以帮助读者通往丰富且全新世界。
本书用不同的文本样式来区分不同种类的信息。下面给出了这些文本样式的示例及其含义。
文本中的代码文字、数据库表名、文件夹名称、文件名、文件扩展名、路径名以及用户输入表示如下:“install additional packages with conda install
within your virtual environment”。
代码块的样式如下所示:
from scipy import *
from matplotlib.pyplot import *
任何命令行的输入或输出如下所示:
jupyter notebook
新的术语和重要的单词都会以粗体显示。读者在页面上看到的单词,例如在菜单或对话框中,会像这样出现在文本中:“The Jupyter notebook is a fantastic tool for demonstrating your work.”
此图标表示警告或需要特别注意的内容。
此图标表示提示或者技巧。
我们还为读者提供了一个PDF文件,其中包含了书中所使用的截图/图表的彩图。彩图将帮助读者更好地理解输出中的变化。读者可以从以下网站下载该文件,网址为www.epubit.com。
如果读者在本书里发现了错误,可能是文字的或者代码中的错误,请访问http://www.epubit.com,选择相应图书,提交勘误详情。一经证实,读者所提出的勘误将被接收并上传至我们的网站,或加入已有的勘误列表中。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,将赠予您异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
本章将简要介绍Python的主要语法元素,用以指导刚刚开始学习编程的读者。这里介绍的每一个主题都是以how-to的方式呈现的,本书稍后将以更深层概念的方式来解释它们,同时会用许多应用和拓展来丰富这些内容。
本章将会以Python的方式来构建经典的语言结构,以便帮助那些掌握了一门其他编程语言的读者快速入门Python编程。
我们鼓励以上两类读者将本章作为一个简明扼要的指南。然而在开始之前,我们必须确保一切准备就绪,并确保你安装了正确版本的Python以及用于科学计算的主要模块和工具,例如一个性能良好的代码编辑器和一个shell工具,这些将有助于代码的开发和测试。
即便你用的是已经安装过Python的计算机,也请阅读下面的内容,因为可能需要调整一些东西,以便使工作环境适合本书的演示内容。
在深入本书主题之前,你应该在计算机上安装好所有相关的工具。我们会给你一些建议,并推荐一些你可能想要使用的工具,但仅限于通用和免费的工具。
Python目前有两个主要的版本:2.x分支和新的3.x分支。这些分支之间存在语言不兼容性,必须注意使用的是哪个分支。考虑到最新的发布版本是3.5,因此本书采用了基于3.x的分支。
你需要安装以下内容。
通过所谓的分发包,以上这些内容的安装将变得非常轻松。推荐使用Anaconda。Spyder代码编辑器的默认屏幕由位于左边的编辑窗口、右下角的可访问IPython shell命令的控制台窗口以及右上角的帮助窗口所组成,如图1.1所示。
图1.1 Spyder代码编辑器
即使你的计算机预先安装了Python,也推荐你创建自己的Python开发环境,以便你能“无意外风险”(不受计算机所依赖软件的影响)地工作。在一个虚拟的环境中,例如Anaconda,你可以随意地更改语言的版本并安装软件包,却不会有意外的副作用。
如果出现了最坏的情况,而且你把事情全部搞砸了,只需要删除Anaconda目录并重启。运行Anaconda安装包将安装Python、Python开发环境以及代码编辑器(Spyder)、Shell IPython以及最重要的数值计算包,如SciPy、NumPy和Matplotlib。
在Anaconda创建的虚拟环境中,可以使用conda install
来安装其他附加的软件包(见参考文献[2]
的官方文档)。
大多数Python代码都保存在文件中,因此建议在所有的Python文件中使用如下开头:
from scipy import *
from matplotlib.pyplot import *
经过这一步,应确保导入了本书用到的所有标准模块和函数,如SciPy。缺少这一步,本书中的大多数示例都会报错。许多代码编辑器,如Spyder,可用于为文件创建模板。找到此功能,并将上述开头放入模板中。
Python Shell很好,但不是最佳的脚本交互方式,因此建议使用IPython来进行替代(见参考文献[26]
的官方文档)。我们可以用不同的方式启动Ipython。
ipython
。cd
,以便移动到文件所在的目录。myfile.py
的程序文件的内容,只需在IPython Shell中运行如下命令: 通常用户想要运行一个程序文件中的内容。这依赖于文件在计算机上的位置,在运行程序文件的内容之前,导航到正确的文件位置是非常有必要的。
run myfile
下面是一些关于如何使用IPython的小贴士。
%magic
”来找到一个列表及其相关说明。
可以在其在线文档中找到更多有关IPython的信息,见参考文献
[15]
。
Jupyter notebook是演示你工作的绝佳工具。学生可能想用它来制作、记录作业和练习;老师可以用它来备课,甚至制作幻灯片和网页。
如果已经通过Anaconda安装了Python,那么就拥有了Jupyter的所有功能。可以通过在终端窗口中运行以下命令来调用笔记本:
jupyter notebook
此时将会打开一个浏览器窗口,用户可以通过Web浏览器与Python进行交互。
程序是按自上而下顺序执行的一系列语句。这个线性执行顺序会有一些重要的例外。
图1.2 程序流
Python使用特殊语法来标记语句块:一个关键字、一个冒号和一个缩进的语句序列,它们属于一个块(见图1.3)。
图1.3 块命令
如果程序的一行代码包含符号#,则同一行代码#后面的内容都将被视为注释:
# 这是如下语句的注释
a = 3 # ... 这里可能有更进一步的注释
行末尾的反斜杠(\)将下一行标记为连续行,即显式行连接。如果行在所有圆括号关闭之前结束,则以下行将自动被识别为连续行,即隐式行连接。
本节介绍Python中的基本数据类型。
数字可以是整数、实数或复数。常用的运算符有以下几种。
这里有一个例子:
2 ** (2 + 2) # 16
1j ** 2 # -1
1. + 3.0j
复数的符号
j是用于表示复数的虚部的符号。它是一个句法元素,不应该与变量的乘法混淆。有关复数的更多信息,请参见第2章的数值类型部分,变量和基本类型。
字符串是放在单引号或双引号中间的一系列字符序列:
'valid string'
"string with double quotes"
"you shouldn't forget comments"
'these are double quotes: ".." '
还可以对多行的字符串使用三重引号:
"""This is
a long,
long string"""
变量是对某个对象的引用。一个对象可能有好几个引用。可以使用赋值运算符“=”给一个变量赋值:
x = [3, 4] # 创建了一个列表对象
y = x # 该对象现在有两个标签:x和y
del x # 我们将其中一个标签删除
del y # 两个标签均被删除:对象被删除
可以通过print函数来显示变量的值:
x = [3, 4] # 创建了一个列表对象
print(x)
list(range(n))
创建一个n
个元素的列表, 元素从零开始: len
给出一个列表的长度: append
用于将元素添加到列表当中: 列表是一个非常有用的数据结构,也是Python的基本类型之一。Python列表是放在方括号里面的有序对象列表,可以把从零开始的索引放在方括号里来访问列表的元素:
len(['a', 1, 2, 34]) #返回4
L = ['a', 'b', 'c']
L[-1] # 'c'
L.append('d')
L #L现在是['a', 'b', 'c', 'd']
L[-1] # 'd'
L1 = [5, 6]
L1[0] # 5
L1[1] # 6
L1[2] # 引发索引错误
L2 = ['a', 1, [3, 4]]
L2[0] # 'a'
L2[2][0] # 3
L2[-1] # 最后的元素: [3,4]
L2[-2] # 倒数第二个元素: 1
print(list(range(5))) #返回 [0, 1, 2, 3, 4]
元素的索引从零开始。可以将任何类型的对象放在列表中,甚至是其他的列表。一些基本的列表函数如下。
n*L
相当于执行了n次加法操作 L1 = [1, 2]
L2 = [3, 4]
L = L1 + L2 # [1, 2, 3, 4]
L = [1, 2]
3 * L # [1, 2, 1, 2, 1, 2]
布尔表达式是值可能为True或False的表达式。一些可以生成条件表达式的常用操作符如下。
可以用or
或者and
来组合不同的布尔值。
关键字not
给出了其后续表达式的否定逻辑值。比较可以被链接,例如使得x < y < z
等价于x < y and y < z
。不同的是,第一个例子中y
只被求了一次值。
在这两种情况下,z
都没有被计算,对于第一个条件x < y
,算出的值为False
:
2 >= 4 # False
2 < 3 < 4 # True
2 < 3 and 3 < 2 # False
2 != 3 < 4 or False # True
2 <= 2 and 2 >= 2 # True
not 2 == 3 # True
not False or True and False # True!
优先规则
<,>、<=、> =、!=和==操作符的优先级比
not
更高。操作符
and
或or
优先级最低。具有较高优先级规则的操作符在较低优先级规则之前进行计算。
循环用于重复执行一系列语句,同时将变量从一个变量修改为另一个变量。该变量称为索引变量。它依次分配给列表中的元素(见第9章):
L = [1, 2, 10]
for s in L:
print(s * 2) # 输出: 2 4 20
在for
循环中要重复的部分必须正确缩进:
for elt in my_list:
do_something
something_else
print("loop finished") # 在for块之外
for
循环的典型用法是将某个任务重复执行固定的次数。
n = 30
for iteration in range(n):
do_something # 此任务被执行n次
for
语句有两个重要的关键字:break
和else
。即使正在迭代的列表没有迭代完,break
也将退出for
循环:
for x in x_values:
if x > threshold:
break
print(x)
else
检查for
循环是否被break
关键字中断,如果没有中断,则执行else
关键字之后的代码块:
for x in x_values:
if x > threshold:
break
else:
print("all the x are below the threshold")
本节介绍了如何使用条件语句来对代码进行分支、中断或者其他方式的控制。当条件语句为真时,其界定的代码块将被执行。如果条件不满足,将执行以关键字else
开始的可选块(见图1.3)。下面通过打印x的绝对值| x |来展示这个过程:
等效的Python代码如下所示:
x = ...
if x >= 0:
print(x)
else:
print(-x)
任何对象都可以被测试真值,用于if
或while
语句。有关如何获取真值的规则将在第2.3.5节进行说明。
函数用于将相似的代码收集在一个地方。考虑以下数学函数:
等效的Python代码如下所示:
def f(x):
return 2*x + 1
图1.4解释了一个函数块的组成要素。
图1.4 函数解剖
def
告诉Python解释器要定义一个函数。f
为函数的名称。x
是函数的参数或者称为函数的输入。return
语句后面的被称为函数的输出。一旦定义了函数,就可以用以下方式的代码来调用它:
f(2) # 5
f(1) # 3
文件(通常有一个py扩展名)中的语句集合称为脚本。假设将以下代码的内容放入名为smartscript.py的文件中:
def f(x):
return 2*x + 1
z = []
for x in range(10):
if f(x) > pi:
z.append(x)
else:
z.append(-1)
print(z)
在Python或IPython Shell中,当打开和读取文件后,可以使用exec
命令来执行这个脚本。代码如下:
exec(open('smartscript.py').read())
IPython Shell提供了魔法命令%run
,作为执行脚本的一种方便的替代方式:
%run smartscript
通常人们将函数收集在一个脚本文件中。这将创建一个具有额外功能的Python模块。为了说明这一点,下面通过将函数集合在一个单独的文件中来创建一个模块,如smartfunctions.py
:
def f(x):
return 2*x + 1
def g(x):
return x**2 + 4*x – 5
def h(x):
return 1/f(x)
再次强调,命令exec(open('smartfunctions.py'). read())
使这些函数可用于你的IPython Shell(注意还有IPython的魔法函数run
)。在Python术语中,一般说它们被放到了实际的命名空间中。
另外,可以通过命令import
导入模块。它创建了一个有名字的命名空间。命令from
将函数放到了通用的命名空间中:
import smartfunctions
print(smartfunctions.f(2)) # 5
from smartfunctions import g #仅输入此函数
print(g(1)) # 0
from smartfunctions import * #输入所有函数
print(h(2)*f(2)) # 1.0
Import
命令
import
和from
将函数导入相应的命名空间中。在导入之后更改函数对当前的Python会话没有影响。有关模块的更多信息,请参见第11章。
Python解释器按以下步骤执行。
(1)运行语法。
(2)逐行执行代码。
(3)不执行函数或类声明中的代码(但是要检查语法)。
def f(x):
return y**2
a = 3 # a和f在这里均被定义
因为没有语法错误,所以可以运行以上程序。只有当调用函数f
时,才会出现错误。
f(2) # 错误,y未被定义
本章简单地介绍了Python的主要语法元素而没有深入细节。
读者现在应该能够开始尝试一些简短的代码并测试不同的程序结构。所有这些都将作为以下章节的“开胃菜”。在后续章节中,我们将为你提供详细的资料、示例、练习以及更多的背景知识。