返回介绍

2.1 基本数据类型

发布于 2024-01-27 21:43:11 字数 4985 浏览 0 评论 0 收藏 0

本节将学习 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文