本书提供了一种独特的方法来讲解Python编程入门,内容符合新的ACM/IEEECS和相关的计算课程倡议,以及由美国国家科学基金会赞助的数据科学本科课程。内容涵盖了新的主题和应用的覆盖面,模块化架构使教师能够方便地调整文本,适应课程需求。通过本书,你将学习:
538个案例研究,471道练习题和项目,557道自我测验题。基于IPython和Jupyter Notebook的即时反馈。问题求解、算法开发、控制语句、函数等基础知识。
列表、元组、字典、集合、Numpy数组、pandas Series和DataFrame。
2D/3D的静态、动态和交互式可视化。
字符串、文本文件、JSON序列化、CSV、异常。
过程式、函数式和面向对象的程序设计方法。
“数据科学入门”:基础统计、模拟、动画、随机变量、数据整理、回归。
隐私、安全、伦理、可重现、透明。
AI、大数据和云数据科学案例研究:NLP、Twitter数据挖掘、IBM Watson、机器学习、深度学习、计算机视觉、Hadoop、Spark、NoSQL、IoT。
开源库:NumPy、pandas、Matplotlib、Seaborn、Folium、SciPy、NLTK、TextBlob、spaCy、Textatistic、Tweepy、Scikit-learn、Keras、PubNub等。
前 言
“塔尔山上有黄金。”
在过去的几十年中,很多发展趋势一一显现。计算机的硬件速度越来越快,价格越来越便宜,尺寸越来越小。网络带宽(携带信息的能力)越来越大,价格越来越便宜。同时软件规模越来越庞大,而“开源”运动又将它们变成完全免费或者接近免费。短时间内,“物联网”将数百亿各种各样的设备连接起来,并快速产生了大规模的数据。
几年之前,如果有人让我们写一本主题为“大数据”和“云计算”的大学阶段编程入门教材,并且在封面上绘制一只彩色的大象(象征“巨大”),我们可能会如此反应:“嗯?”如果他们继续让我们在书名中囊括AI(人工智能),我们可能会说:“真的吗?这对于编程初学者会不会过于超前了?”
如果有人让我们在书名中加上“数据科学”,我们可能会问:“计算机科学不是已经包含了数据吗?为什么我们需要为此单独分一个科目?”好吧,如今谈及程序设计,最酷的说法就是“什么都是数据”—数据科学、数据分析、大数据、关系数据库(SQL)以及NoSQL和NewSQL数据库。
如今我们真的写了这样一本书!欢迎阅读!
在本书中,你将会着手学习当今最引人入胜、最前沿的计算技术—你将会看到,它将计算机科学和数据科学轻松地结合在一起,是一门适用于这些学科和相关学科的入门课程。此外,你将使用Python进行编程,这是世界上发展速度最快、最流行的编程语言之一。在前言中,我们将展示这本书的“灵魂”。
专业程序员常常很快喜欢上Python。他们欣赏Python的表现力、易读性、简洁性和交互性。他们喜欢开源软件世界,这个世界正在为广泛的应用领域不断生成可复用的软件。
无论你是教师、初学者或者有经验的专业人士,这本书都将对你有所帮助。Python对于初学者而言是优秀的第一门编程语言,并且适用于开发工业级的应用。对于初学者而言,本书前面的章节奠定了坚实的编程基础。
我们希望你在这本书中学到知识,并且发现快乐与挑战。徜徉其中,享受乐趣。
将Python用于计算机科学和数据科学教学
许多顶尖的美国大学使用Python作为介绍计算机科学的语言,“CS学科排名前10的有8个(80%)、排名前39的有27个(69%)使用Python”。Python如今在教学和科学计算中尤其受到欢迎,最近已超过R语言并成为最受欢迎的数据科学编程语言。
模块化体系结构
我们预计计算机科学的本科生课程将会包含数据科学部分—这本书为此而设计,并且在Python编程方面满足数据科学入门课程的需求。
本书的模块化体系结构帮助我们满足计算机科学、数据科学和其他相关受众的多样化需求。教师能方便地进行调整,为不同专业的学生开设系列课程。
第1~11章介绍传统的计算机科学编程主题。第1~10章每章都包含可选的、简洁的“数据科学入门”一节,介绍人工智能、描述性统计学基础知识、趋中和离中度量、模拟、静态/动态可视化、CSV文件的使用、用于数据探索和数据整理的pandas库、时间序列和简单的线性回归。这会帮助你学习第12~17章中的数据科学、AI、大数据和云计算相关的案例研究,这些案例研究使用了真实数据集。
学完第1~5章中的Python相关知识以及第6~7章中的一些关键部分,你已经能够解决第12~17章的数据科学、AI和大数据案例研究中的关键用例,这对于所有的编程通识课都是实用的:
计算机科学方面的课程可以着重于第1~11章并略讲第1~10章的“数据科学入门”部分。教师还可以介绍第12~17章中的部分或者全部案例研究。
数据科学方面的课程可以略讲第1~11章,着重于大部分或者全部的第1~10章中的“数据科学入门”部分以及第12~17章中的案例研究。
前言中的“章节依赖关系”部分将展示本书的独特架构并帮助教师规划个性化的教学大纲。
第12~17章的内容很酷、很强大、很现代。其中包含能动手实现的案例研究,例如有监督学习、无监督学习、深度学习、强化学习(在练习中)、自然语言处理、Twitter数据挖掘、IBM Watson认知计算、大数据以及其他内容。在这个过程中,你将会掌握数据科学的大量术语和概念,包括术语的定义以及在不同规模的程序中使用的概念。
本书读者对象
模块化的结构使得本书适用于以下读者:
所有标准的Python计算机科学及相关专业。首先,我们的书是一本现代的、可靠的Python CS1入门教材。ACM/IEEE的计算课程建议列出了5个类别:计算机工程、计算机科学、信息系统、信息技术和软件工程。这本书对这些类别都适用。
数据科学专业的本科生课程。我们的书对许多数据科学课程都是有用的。对于入门级课程而言,它遵循课程建议,整合了所有课程的关键领域。在计算机科学或者数据科学课程计划中,本书都可以作为第一本专业教材,也可用作高年级课程的Python参考书。
非计算机和数据科学专业学生的辅修课程。
数据科学的研究生课程。这本书可以作为入门级课程的主要教材,也可以作为高年级课程的Python参考书。
两年制学院。这些学校会为准备进入四年制学院的数据科学专业的学生开设相关课程—这本书就是一个合适的选择。
高中。就像出于强烈的兴趣爱好而开设计算机课程一样,很多高中已经开设了Python编程和数据科学课程。最近在LinkedIn上发表的一篇文章写道:“高中就应该教授数据科学,课程应该直面我们的学生将要选择的职业类型,直接关注工作和技术的发展方向。”我们相信数据科学很快就会成为一门受欢迎的大学先修课程并且最终会有数据科学的AP考试。
专业行业培训课程。
本书主要特色
保持简洁,保持短小,保持新颖
保持简洁(KIS)。在书的各个方面以及教师和学生资源中,我们都力求简单明了。例如,在写自然语言处理的时候,我们使用了简洁直观的TextBlob库而不是更为复杂的NLTK。一般情况下,当有多个库都能完成相近的任务时,我们选择最简单的一个。
保持短小(KIS)。本书的538个案例大多数都很短小—伴随交互式IPython的即时反馈,通常只有几行代码。我们只在大约40个大型脚本和完整案例研究中使用了较长的代码示例。
保持新颖(KIT)。我们查阅了大量最新的Python编程和数据科学教材以及专业书籍,浏览、阅读或者观看了大约15 000篇最新的文献、研究论文、白皮书、视频、博客文章、论坛文章和文档。这让我们能够“把握”Python、计算机科学、数据科学、AI、大数据和云计算社区的脉搏,从而创建出1566个崭新的案例、练习题和项目(EEP)。
IPython的实时反馈、搜索、发现和实验教学方法
学习这本书的理想方法是阅读它并同时运行代码示例。在整本书中,我们使用了IPython解释器,它采用一种友好的、实时反馈的模式,能够在Python及其扩展库上快速进行搜索、发现和实验。
大多数代码都在小型的可交互的IPython会话中展示。你所写的每一个代码片段,IPython能够立即读取然后计算并给出结果。这种即时反馈使你保持注意力,并助力学习过程、支撑原型设计和加速软件开发过程。
我们的书总是强调实时代码的教学方法,通过样例输入和结果显示,专注于程序的完整和可运行。IPython的“魔力”在于将代码片段转换为实时代码,每当你输入一行时,这些代码就会“活起来”。这有助于学习并鼓励动手实验。
IPython是学习常见错误的报错信息的好方法。我们有时故意犯错来告知你将发生什么,因此,当我们说某件事是错误的时候,试试看会发生什么。
本书配有557道自我测验题(适合于“翻转课堂”,稍后介绍)和471道章末练习题和项目,它们中的大多数遵循了同样的实时反馈理念。
Python编程基础
首先,本书是一本Python入门教材。我们提供了丰富的Python编程知识和常规的编程基础内容。
我们讨论了Python的编程模型—过程式编程、函数式编程和面向对象编程。
我们强调问题求解和算法设计。
我们为准备进入产业界的学生提供了最佳实践。
函数式编程贯穿全书。第4章中的一个图表展示了Python中关键的函数式编程能力及其对应的章节。
538个案例以及471道练习题和项目
学生通过动手实践的方法,在广泛选择的真实案例、练习和项目(EEP)中开展学习,这些内容来自计算机科学、数据科学和其他很多领域。
538个案例的内容均围绕计算机科学、数据科学、人工智能和大数据,从单个代码片段到完整案例研究均有涉及。
471道练习题和项目自然地拓展了章节中的示例。每章都以一系列涵盖了各种主题的练习作为结尾,这有助于教师根据受众的需求调整课程内容并且在每个学期布置不同的作业。
EEP向你提供了引人入胜的、富有挑战性的、有趣的Python基础知识,包括可以动手实验的AI、计算机科学和数据科学项目。
学生将面对令人兴奋且有趣的有关AI、大数据和云技术应用问题的挑战,比如自然语言处理、Twitter数据挖掘、机器学习、深度学习、Hadoop、MapReduce、Spark、IBM Watson、关键的数据科学库(NumPy、pandas、SciPy、NLTK、TextBlob、spaCy、BeautifulSoup、Textatistic、Tweepy、scikit-learn、Keras)、关键的可视化库(Matplotlib、Seaborn、Folium)以及其他。
我们的EEP鼓励你思考未来。下述案例研究虽然只出现在前言中,但本书包含了多个发人深省的类似项目:利用深度学习、物联网以及电视摄像机(由体育赛事数据训练出来的),我们可以自动进行统计分析、回顾比赛细节以及即时回放,因此球迷不再需要忍受直播体育赛事的误判和延迟。既然如此,我们可能会产生这样的想法:可以使用这些技术来取消裁判。为什么不呢?我们已经越来越多地把自己的生命托付给基于深度学习的技术,比如机器人外科医生和自动驾驶汽车。
项目练习鼓励你更加深入地了解所学的知识并研究本书没有涉及的技术。真正的项目通常规模更大,需要更多的网络搜索和实现代价。
在教师手册中,我们提供了许多练习的答案,包括第1~11章中核心的Python代码。答案仅对教师可见,详见后文中关于Pearson教师资源的介绍。但是我们没有提供项目和研究练习的答案。
我们鼓励你仔细观看示例和开源代码案例研究(详见GitHub网页),包括课程级别项目、学期级别项目、专业方向级别项目、毕业设计项目和毕业论文。
557道自我测验题及其答案
平均每节后有三道自我测验题。
自我测验题的类型包括填空、判断和讨论,能帮你测试是否理解了所学的内容。
IPython交互式自我测验题可帮助你不断尝试并强化所学的编程技术。
为快速掌握所学知识,自我测验题后面都跟有答案。
避免烦琐的数学语言,多用自然语言进行解释
数据科学的主题与数学高度相关。这本书将用作计算机科学和数据科学第一门课的教科书,学生可能没有深厚的数学知识背景,所以我们避免了烦琐的数学语言,把数学内容留在高层次的课程中。
在案例、练习和项目中,我们关注数学的概念而不是细节。我们使用statistics、NumPy、SciPy、pandas等Python库和其他的很多库来解决问题,从而隐藏了数学复杂性。所以,学生能够直接使用数学技术(如线性回归),而不需要知道背后的数学知识。在机器学习和深度学习的案例研究中,我们专注于创建在“幕后”做数学运算的对象—这是基于对象编程的关键之一。这个做法等同于安全地驾驶一辆汽车前往目的地时不需要知道引擎、变速箱、动力转向和防滑刹车系统背后的数学、工程和科学知识。
可视化
67张可视化结果图帮助你理解概念,包含二维或三维的、静态的、动态的、动画的和交互式的图表、图形、图片、动画等。
我们关注由Matplotlib、Seaborn、pandas和Folium(用于交互式地图)产生的高层可视化结果。
我们使用可视化作为教学工具。例如,我们使用动态掷骰子模拟和柱状图使大数定律“鲜活”起来。随着投掷次数的增加,你将看到每个面在投掷总数中所占的百分比逐渐接近16.667%(1/6),代表百分比的柱条也趋于一致。
你需要了解自己的数据。一种简单的办法是直接看原始数据。即使是少量的数据,你也可能很快迷失在细节当中。对于大数据而言,可视化对于数据探索和传递可复制的研究结果尤为重要,数据规模可能是百万级的、上亿级的甚至更为庞大。通常而言,一图胜千言—在大数据中,一个可视化结果能够比得上数据库中数亿甚至更多的个体。
有时候,你需要“飞到离数据40 000英尺高”才能在“大范围”看到它。描述性统计当然有帮助,但是也可能产生误导。你将在练习中研究Anscombe的四组数据,这个案例通过可视化直观地表明:差异显著的数据集可能产生几乎相同的描述性统计。
我们展示了可视化结果和动画代码以便你能够自己实现。我们也通过Jupyter Notebook的形式给出动画的源代码文件,便于你自定义代码和动画参数,进而重新执行动画,然后查看其带来的影响。
许多练习都要求你创建自己的可视化结果。
数据经验
“数据科学本科课程建议”中提出:“数据经验需要在所有课程中扮演核心角色。”
在本书的案例、练习和项目中,你将使用许多真实数据集和数据源。网上有各种免费的开源数据集供你实验。有些我们参考的网站列出很多数据集,我们鼓励你探索这些数据集。
我们收集了上百份教学大纲,追踪了教师的数据集偏好,并研究了最流行的监督机器学习、无监督机器学习和深度学习的数据集。你将会用到的许多库都附带用于实验的标准数据集。
你将学习如何进行数据获取和分析准备,学习使用多种技术进行数据分析、模型调整并有效交流结果,特别是通过可视化。
像开发者一样思考
你将以开发者为视角,使用像GitHub和StackOverflow一样的流行网站并且进行大量的互联网搜索。“数据科学入门”部分和第12~17章中的案例研究提供了丰富的数据经验。
GitHub为寻找开源代码提供了一个优秀的场所,你可以把代码合并到自己的项目中(并将你的代码贡献到开源社区中)。它是软件开发者版本控制工具库中的重要组成部分,这些工具帮助开发团队管理他们的开源(和私有)项目。
我们鼓励你学习GitHub等网站上发布的代码。
在为计算机科学和数据科学的职业生涯做准备的过程中,你将大量使用免费且开源的Python和数据科学库,来自政府、工业界和学术界的真实数据集,以及免费、免费试用或免费增值的软件和云服务。
动手实践云计算
很多大数据分析发生在云端。在云端动态地度量你的应用程序需要的硬件和软件规模是比较容易的。你将会使用各种各样的云服务(某些是直接的,某些是间接的),包括Twitter、Google翻译、IBM Watson、Microsoft Azure、OpenMapQuest、geopy、Dweet.io 和 PubNub。你将在练习和项目中了解更多。
我们鼓励你使用各种云服务供应商提供的免费、免费试用或免费增值的服务。我们更喜欢那些不需要信用卡的,因为谁都不想承担意外积攒巨额账单的风险。如果你决定使用需要信用卡的服务,请确保你使用的免费层不会自动跳转到支付层。
数据库、大数据和大数据基础设施
根据IBM(2016年11月)的数据,全球90%的数据是在过去的两年内产生的。有证据表明,数据产生的速度正在加快。
根据2016年3月Analytics Week的一篇文章,五年内将有超过500亿台设备连接到互联网,到2020年前,我们将每秒为地球上的每一个人产生1.7MB的新数据!
本书包含了对关系数据库和带有SQLite的SQL的探讨。
数据库是存储和操作你要处理的大量数据的关键性大数据基础设施。关系数据库处理结构化数据,它们不适用于大数据应用程序中的非结构化和半结构化数据。因此,随着大数据的发展,为了有效处理这些数据,NoSQL和NewSQL数据库应运而生。本书包含对NoSQL和NewSQL的概述,以及利用MongoDB JSON文件数据库的动手实践的案例研究。
第17章包含关于大数据硬件与软件基础设施的细致讨论。
人工智能案例研究
---作者简介---
保罗·戴特尔
(Paul Deitel)
Deitel&Associates公司首席执行官兼首席技术官,毕业于麻省理工学院,在计算机领域拥有38年的经验。他自1992年以来就为软件开发人员教授专业课程,为包括思科、IBM、西门子、戴尔、NASA、北电网络在内的全球企业客户提供了数百门编程课程。
哈维·戴特尔
(Harvey Deitel)
Deitel&Associates公司董事长兼首席战略官,在计算机领域拥有58年的经验。他在麻省理工学院获得理学学士学位和硕士学位,在波士顿大学获得博士学位。在1991年创立Deitel&Associates公司之前,他已经获得了波士顿大学的终身职位并担任计算机科学系主任。Deitel品牌的出版物赢得了国际上的广泛认可,并被翻译为日语、德语、汉语等100多种语言出版。
通过与Pearson/Prentice Hall 44年的合作,Deitel&Associates公司以印刷物和电子书的形式出版了前沿的编程教科书和专业书籍,发布了前沿的编程方面的LiveLessons视频课程、Safari-Live在线研讨会和Revel交互式多媒体课程。如果你需要联系Deitel&Associates公司和作者,或者希望给有讲师指导的现场培训课程提出建议,请发送电子邮件至deitel@deitel.com。希望了解更多关于Deitel现场企业培训的信息,请访问http://www.deitel.com/training。希望购买Deitel书籍的个人客户,请访问https://www.amazon.com/。公司、政府、军队和学术机构的大宗订单请直接与Pearson联系。希望了解更多信息,请访问https://www.informit.com/store/sales.aspx。
目 录
译者序
前言
阅读前的准备工作
第1章 计算机和Python简介1
1.1 简介1
1.2 硬件和软件2
1.2.1 摩尔定律3
1.2.2 计算机组成3
1.3 数据层级结构4
1.4 机器语言、汇编语言和高级语言7
1.5 对象技术简介8
1.6 操作系统10
1.7 Python13
1.8 库14
1.8.1 Python标准库15
1.8.2 数据科学库15
1.9 其他流行的编程语言16
1.10 实践练习:使用IPython和
Jupyter Notebook17
1.10.1 将IPython的交互式模式
当作计算器使用17
1.10.2 使用IPython解释器执行
Python程序19
1.10.3 在Jupyter Notebook中
编写和执行代码20
1.11 互联网和万维网24
1.11.1 互联网:网络的网络25
1.11.2 万维网:使互联网变得对
用户友好25
1.11.3 云计算25
1.11.4 物联网26
1.12 软件技术27
1.13 大数据有多大28
1.13.1 大数据分析32
1.13.2 数据科学和大数据正在
改变世界:用例33
1.14 案例研究:一个大数据移动
应用34
1.15 数据科学入门:人工智能—
计算机科学和数据科学的交叉
学科35
第2章 Python程序设计概述41
2.1 简介41
2.2 变量和赋值语句41
2.3 算术运算43
2.4 print函数、单引号字符串和
双引号字符串47
2.5 三引号字符串48
2.6 从用户处获得输入50
2.7 决策:if语句和比较操作符52
2.8 对象和动态类型56
2.9 数据科学入门:描述性统计学
基础知识58
2.10 小结60
第3章 控制语句和程序开发63
3.1 简介63
3.2 算法63
3.3 伪代码64
3.4 控制语句64
3.5 if语句66
3.6 if...else和if...elif...else
语句69
3.7 while语句73
3.8 for语句74
3.8.1 可迭代变量、列表和
迭代器75
3.8.2 内置range函数76
3.9 增广赋值76
3.10 程序开发:序列控制重复77
3.10.1 需求说明78
3.10.2 算法的伪代码形式78
3.10.3 Python中算法的编码79
3.10.4 格式化字符串79
3.11 程序开发:卫士控制重复80
3.12 程序开发:嵌套控制语句83
3.13 内置函数range:深入审视87
3.14 使用Decimal类型表达货币
总量88
3.15 break和continue语句91
3.16 布尔操作符and、or和not92
3.17 数据科学入门:趋中度量—
平均数、中位数、众数95
3.18 小结96
第4章 函数102
4.1 简介102
4.2 函数的定义102
4.3 多参数函数105
4.4 随机数生成106
4.5 案例研究:碰运气游戏109
4.6 Python标准库112
4.7 math模块函数113
4.8 IPython的Tab补全114
4.9 缺省形参值115
4.10 关键字实参116
4.11 任意实参表117
4.12 方法:属于对象的函数118
4.13 作用域规则118
4.14 import:深入审视120
4.15 函数的实参传递:深入讨论122
4.16 函数调用栈124
4.17 函数式程序设计126
4.18 数据科学入门:离中度量127
4.19 小结129
第5章 序列:列表和元组133
5.1 简介133
5.2 列表133
5.3 元组138
5.4 序列解包140
5.5 序列切片143
5.6 del语句146
5.7 给函数传递列表147
5.8 列表排序148
5.9 序列搜索150
5.10 其他列表方法152
5.11 用列表模拟栈154
5.12 列表解析155
5.13 生成器表达式157
5.14 过滤器、映射和化简158
5.15 其他序列处理函数160
5.16 二维列表162
5.17 数据科学入门:模拟和静态
可视化166
5.17.1 掷600、60 000和6 000 000
次骰子的简单图示166
5.17.2 掷骰实验的频数和百分比
的可视化167
5.18 小结174
第6章 字典和集合182
6.1 简介182
6.2 字典182
6.2.1 创建字典183
6.2.2 遍历字典184
6.2.3 基本字典操作184
6.2.4 字典方法keys和
values186
6.2.5 字典比较188
6.2.6 样例:学生成绩字典188
6.2.7 样例:词频统计189
6.2.8 字典方法update191
6.2.9 字典解析192
6.3 集合192
6.3.1 集合比较194
6.3.2 集合的数学操作196
6.3.3 集合的可变操作符和
方法197
6.3.4 集合解析199
6.4 数据科学入门:动态可视化199
6.4.1 了解动态可视化199
6.4.2 实现动态可视化202
6.5 小结204
第7章 使用NumPy进行面向
数组的编程208
7.1 简介208
7.2 从已有数据中创建array209
7.3 array属性210
7.4 用特定值填充array212
7.5 从值域中创建array212
7.6 列表和array的性能:引入
%timeit214
7.7 array操作符216
7.8 NumPy计算方法218
7.9 普适函数220
7.10 索引和切片221
7.11 视图:浅拷贝223
7.12 深拷贝225
7.13 重塑和转置226
7.14 数据科学入门:pandas Series
和DataFrame229
7.14.1 pandas Series229
7.14.2 DataFrame233
7.15 小结241
第8章 字符串:深入审视247
8.1 简介247
8.2 格式化字符串248
8.2.1 表示类型248
8.2.2 域宽和对齐249
8.2.3 数值格式化250
8.2.4 字符串的format
方法251
8.3 拼接和重复字符串252
8.4 删除字符串的空白符253
8.5 字符大小写转换254
8.6 字符串的比较操作符255
8.7 子串搜索255
8.8 子串替换257
8.9 字符串