- 本书赞誉
- 前言
- 目标读者
- 不适合阅读本书的读者
- 本书结构
- 什么是数据处理
- 遇到困难怎么办
- 排版约定
- 使用代码示例
- 致谢
- 第 1 章 Python 简介
- 第 2 章 Python 基础
- 第 3 章 供机器读取的数据
- 第 4 章 处理 Excel 文件
- 第 5 章 处理 PDF 文件 以及用 Python 解决问题
- 第 6 章 数据获取与存储
- 第 7 章 数据清洗:研究、匹配与格式化
- 第 8 章 数据清洗:标准化和脚本化
- 第 9 章 数据探索和分析
- 第 10 章 展示数据
- 第 11 章 网页抓取:获取并存储网络数据
- 第 12 章 高级网页抓取:屏幕抓取器与爬虫
- 第 13 章 应用编程接口
- 第 14 章 自动化和规模化
- 第 15 章 结论
- 附录 A 编程语言对比
- 附录 B 初学者的 Python 学习资源
- 附录 C 学习命令行
- 附录 D 高级 Python 设置
- 附录 E Python 陷阱
- 附录 F IPython 指南
- 附录 G 使用亚马逊网络服务
- 关于作者
- 关于封面
2.1 基本数据类型
本节将学习 Python 中的简单数据类型。这些数据类型都在 Python 的信息处理过程中发挥重要作用。我们要学习的数据类型包括字符串型、整型、浮点型和其他非整数类型。
2.1.1 字符串
我们要学习的第一个数据类型是字符串型。你之前可能没有在这种语境下听过“字符串”这个词,但字符串实际上就是用引号标记的文本。字符串里可以包含数字、字母和符号。
下面都是字符串的例子:
'cat' 'This is a string.' '5' 'walking' '$GOObarBaz340 '
将上面任一字符串输入到 Python 解释器里,解释器会返回相同的内容。程序仿佛在说:“嘿,我听到你了。你说的是 'cat'(或任何你输入的内容)。”
只要字符串位于成对的引号(单引号或双引号都可以)之间,其内容无关紧要。字符串的首尾必须用相同的引号(单双均可):
'cat' "cat"
上面两个例子在 Python 中的含义是相同的。两种情况下,Python 都会返回单引号的 'cat'。有些人习惯于在代码中使用单引号,另一些人更喜欢用双引号。无论你用哪种引号,重要的是前后风格要保持一致。本书的两位作者更喜欢用单引号,因为输入双引号需要按住 Shift 键。输入单引号可以偷懒。
2.1.2 整数和浮点数
我们要学习的第二种和第三种数据类型是整型和浮点型,这是 Python 中处理数字的方法。首先来看整型。
01. 整数
你可能还记得数学课上学过的整数,但如果你忘记了,整数是指整数(an integer is a whole number)。下面是一些整数的例子:
10 1 0 -1 -10
将上面的整数输入到 Python 解释器里,解释器会返回相同的内容。
注意,上一节的字符串例子中有一个是 '5'。如果输入的数字是在引号中,Python 会将其看作字符串。在下面的例子中,第一个值和第二个值并不相等:
5 '5'
想测试二者是否相等,可以在解释器中输入:
5 == '5'
== 符号是用来测试两个值是否相等。测试的返回值是真(True)或假(False)。返回值是另一种 Python 数据类型,叫作布尔型。后面会讲到布尔型,这里先简单学习一下。布尔型可以判断语句是真还是假。在上面的语句中,我们问 Python:整数 5 与字符串 '5' 是否相等?Python 返回了什么?怎样才能让语句的返回值为 True ?(提示:试一下两个都是整数或两个都是字符串的情况!)
你可能想知道,为什么有人会把数字当作字符串来存储。有时是因为使用不当——例如,代码将数字存储成 '5',而实际上应该存储成 5,没有引号。再举一个例子,字段内容是人工填写的,里面可能既包含字符串又包含数字(例如,调查中人们可能输入“五”“5”或“V”)。它们都是数字,但是数字的不同表示方式。在这种情况下,你可能会先把它们存储成字符串,后面再进行处理。
将数字存储为字符串,最常见的原因之一是故意这么做,例如美国邮政编码的存储。美国的邮编共包含五位数字。在新英格兰地区和东北部的其他地方,邮编是以 0 开头的。在 Python 解释器中试着输入波士顿的一个邮编,一次作为字符串输入,一次作为整数输入。出现了什么情况?
'02108' 02108
在第二个例子中,Python 会抛出一个语法错误[SyntaxError,报错信息为无效的标记(invalid token),并且有一个箭头指向开头的 0]。在 Python 以及许多其他语言中,“标记”(token)是指特殊的单词、符号和标识符。在上面的例子中,Python 不知道如何处理以 0 开头的数(非八进制的数),这意味着它是一个无效的标记。
02. 浮点数、小数和其他非整数类型
Python 处理非整数的运算有许多种方法。如果你不了解每一种非整数数据类型的运算方法,这些方法可能会令人感到困惑,而且似乎引入了舍入误差。
在 Python 中使用非整数时,Python 默认将其转换成浮点数。浮点数的表示方法采用的是各版本 Python 内置的浮点数据类型。也就是说,Python 存储的是该数值的近似值——仅反映特定精度水平的近似值。
在 Python 解释器中输入下面这两个数字,注意二者之间的不同:
2 2.0
第一个是整数。第二个是浮点数。我们做点计算,进一步了解这些数字的运算规则,以及 Python 如何对它们进行求值。在 Python 解释器中输入:
2/3
发生了什么?你得到的返回值是 0,但你可能本来以为会是 0.6666666666666666、0.6666666666666667 或类似的数字。问题在于,这些数字都是整型,整型无法完成分数运算。我们试着把其中一个数字变成浮点数:
2.0/3
现在我们得到了更精确的答案:0.6666666666666666。如果输入的数字中有一个是浮点数,计算的结果也是浮点数。
如前文所述,Python 中的浮点数可能会引起精度问题(https://docs.python.org/2/tutorial/floatingpoint.html)。浮点数的运算速度很快,但正是因为这一点,浮点数不够精确。
从原理上来说,Python 与你和计算器对待数字的方式都不同。在 Python 解释器中试试下面这两个例子:
0.3 0.1 + 0.2
对于第一行代码,Python 返回 0.3。对于第二行代码,你本来希望返回 0.3,但实际上你得到的返回值是 0.30000000000000004。0.3 和 0.30000000000000004 这两个值并不相等。如果对其中的细微差别感兴趣,可查阅 Python 文档(https://docs.python.org/2/tutorial/floatingpoint.html#tut-fp-issues)了解更多内容。
在本书中,需要考虑精度问题时,我们将使用 decimal 模块(或库,https://docs.python.org/2/library/decimal.html)。模块是可导入使用的代码段或代码库。decimal 模块可以让数字(整数或浮点数)的运算结果符合预期(与你在数学课上学到的概念一致)。
在下面的例子中,第一行代码从 decimal 模块中导入了 getcontext 和 Decimal,这样我们就可以在解释器环境中使用它们。接下来的两行代码利用 getcontext 和 Decimal 来做之前用浮点数做过的数学运算:
from decimal import getcontext, Decimal getcontext().prec = 1 Decimal(0.1) + Decimal(0.2)
运行上面的代码,Python 会返回 Decimal('0.3')。现在你输入 print Decimal(0.3),Python 会返回 0.3,这也正是我们本来希望看到的值(而不是 0.30000000000000004)。
我们来一行一行地阅读这三行代码:
from decimal import getcontext, Decimal ➊ getcontext().prec = 1 ➋ Decimal(0.1) + Decimal(0.2) ➌
❶ 从 decimal 模块中导入 getcontext 和 Decimal。
❷ 将舍入精度设定为一位小数。decimal 模块将大部分的舍入和精度设置保存在默认的上下文(context)中。本行代码将上下文的精度改成只保留一位小数。
❸ 对两个小数(一个值为 0.1,一个值为 0.2)求和。
如果修改 getcontext().prec 的值会怎么样?动手试一下,然后重新运行最后一行代码。你应该会看到不一样的结果,这取决于你设置的是保留几位小数。
如前文所述,在数据处理过程中你会遇到许多数学上的细节问题。你可能需要完成的数学运算也有许多不同的方法,但在用到非整数时,使用小数型数据可以使计算精度更高。
Python 中的数字
Python 中的数字类型有不同的精度水平,这是 Python 语言的缺点之一。随着对数据处理的深入学习,我们将在本书中学到更多 Python 中与数字和数学相关的库。要是你现在就想知道,并且打算做一些不那么基础的数学运算,下面是一些你需要熟悉的 Python 库。
· decimal(https://docs.python.org/2/library/decimal.html),用于定点运算和浮点运算。
· math(https://docs.python.org/2/library/math.html),可以使用 C 语言标准所定义的数学函数。
· numpy(http://docs.scipy.org/doc/numpy/reference/routines.math.html),Python 科学计算的基础包。
· sympy(http://docs.sympy.org/latest/index.html),用于符号数学的P ython 库。
· mpmath(http://mpmath.org/)用于任意精度实数和复数浮点运算的 Python 库。
我们已经学过了字符串型、整型和浮点型 / 小数型。下面以这些基本数据类型为基础,创建更复杂的数据类型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论