在 Python 语言中,所有事物都是程序可以访问的对象, 其中包括保存整数的简单类型,以及您编写的实际代码和这些代码在 Python 解释器中的表示。对于熟悉其他编程语言的人来说,此行为可能导致某些混乱。但是,在实践中,不会出现这种情况。Python 有一个良好定义的类型(或对象)层次结构。该层次结构在概念上可以划分为四种类别:简单类型、容器类型、代码类型 和内部类型。这四种类别和简单类型本身在本系列的第一篇文章“探索 Python(1): Python 的内置数值类型”中作了介绍。本文将再次查看可以在 Python 中使用的那些简单的内置数据类型,这次着重介绍这些类型的对象属性。然后,我们将介绍容器 类型的概念,并且将 Python tuple
类作为此类型的第一个示例,进行重点介绍。
内置到 Python 编程语言中的简单数据类型包括:
bool
int
float
complex
支持简单数据类型不是 Python 独有的功能,因为多数现代编程语言都具有完整类型补充。例如 Java™ 语言甚至有一组更丰富的原始数据类型:
byte
short
int
long
float
double
char
boolean
但是,在 Python 中,简单数据类型并不是原始数据类型,而是完善的对象,它们有自已的方法和类。另外,这些简单的内置类型是不可改变的,这意味着:创建对象之后,您无法更改对象的值。如果需要新值,则必须创建新的对象。Python 简单数据类型的不可改变特性与其他多数流行语言(如 Java 语言)处理简单原始类型的方式不同。但是,当您对这些简单数据类型的对象属性有了更多的了解之后,就很容易理解这种差异。
所以,整数如何能够拥有一些方法?它仅仅是一个数字吗?不是的,至少在 Python 中答案是否定的。您自已可以对它进行检验:仅借助内置的help
方法,就可以向 Python 解释器咨询关于 int
对象的信息(参见清单 1 )。
123456789101112131415161718192021222324 | rb% pythonPython 2.4 (#1, Mar 29 2005, 12:05:39) [GCC 3.3 20030304ppp(Apple Computer, Inc. build 1495)] on darwinType \”help\”, \”copyright\”, \”credits\” or \”license\” for more information.>>> help(int)Help on class int in module __builtin__:class int(object) | int(x[, base]) -> integer | | Convert a string or number to an integer, if possible. A floating point | argument will be truncated towards zero (this does not include a string | representation of a floating point number!) When converting a string, use | the optional base. It is an error to supply a base when converting a | non–string. If the argument is outside the integer range a long object | will be returned instead. | | Methods defined here: | | __abs__(...) | x.__abs__() <==> abs(x) | | __add__(...) | x.__add__(y) <==> x+y... |
这具体说明了什么?只有一个事情,那就是可以方便地从 Python 解释器中得到帮助,但是从后面部分可以获得更多帮助。第一行告诉您正在查看 int
类的帮助页面,它是一个内置的数据类型。如果您对面向对象的编程的概念不太熟悉,那么可以将类 想像成只是一个用于构建特殊事物并与之交互的蓝图。好比房子的设计蓝图,不仅显示如何构建房子,还显示房子完工之后,如何更好地使用房子。例如,设计图会显示不同房间的位置、在房间之间的移动方式以及出入房子的通道情况。
第一行的下面是对实际 int
类的详细说明。在这一点上,您可能不熟悉如何在 Python 中创建类,因为显示的语法类似于外语。没关系,我将在另一篇文章中对此进行全面介绍。现在,您只需要知道:int
对象是从 object
类中继承而来,它是 Python 中许多内容的一个基类。
后面的几行介绍 int
类的构造函数。构造函数 只是创建特定类实例(或对象) 的特殊方法。构造函数方法好比建筑承包人,它利用房子的设计图建房子。在 Python 中,构造函数的名称与其创建的类的名称相同。类可以有不同的构造函数方法,这些方法是通过类名称后的圆括号内附带的不同属性进行区分。类可以有不同构造函数方法的较好的一个例子就是 int
类, 实际上,您可以用多种方法调用它,具体采用哪种方法取决于圆括号中放置的参数(参见清单 2)。
int
类构造函数12345678 | >>> int()0>>> int(100) # Create an integer with the value of 100>>> int(\”100\”, 10) # Create an integer with the value of 100 in base 10100100>>> int(\”100\”, 8) # Create an integer with the value of 100 in base 864 |
这四个构造函数调用创建了四个不同的整数。第一个构造函数创建了一个整数对象,其值为 0,在没有值提供给 int
类构造函数的情况下,该值是所使用的默认值。第二个构造函数根据规定创建了一个值为 100 的整数。第三个构造函数采用了字符串“100”并创建了以 10 为基数的整数值(常见的十进制系统)。最后一个构造函数也采用了字符串“100”—— 但是它使用基数 8 来创建整数值,通常称为 八进制。不过,该值在输出时会被转换成十进制数值,这就是该数字显示为 64 的原因。
您可能想知道如果省略了构造函数调用中的圆括号将会发生什么。在这种情况下,您可以向该变量分配一个实际的类名称,有效地为原先的类创建一个别名(参见清单 3)。
int
类型1234567 | >>> it = int # Create an alias to the integer class>>> it(100)100>>> type(it) # We created a new type<type \’type\’>>>> type(it(100)) # Our new type just makes integers<type \’int\’> |
真是太棒了!您立即可以创建一个由内置 int
类定义的新数据类型。但请注意不好的一面,不要滥用这一新功能。优秀的程序员除了使代码具有良好性能外,还应努力使代码清淅。这类编码技巧的确有其使用价值,但它们并不常见。
使用 Python 解释器可以使新的 Python 程序员简化学习过程,少走弯路。如果您想详细了解 Python 内的 help
工具,只需在 Python 解释器中的命令提示符下键入 help()
,就可以访问交互式的帮助工具(参见清单 4)。
| representation of a floating point number!) When converting a string, use | the optional base. It is an error to supply a base when converting a | non–string. If the argument is outside the integer range a long object | will be returned instead. | | Methods defined here: | | __abs__(...) | x.__abs__() <==> abs(x) | | __add__(...) | x.__add__(y) <==> x+y...
这具体说明了什么?只有一个事情,那就是可以方便地从 Python 解释器中得到帮助,但是从后面部分可以获得更多帮助。第一行告诉您正在查看 int
类的帮助页面,它是一个内置的数据类型。如果您对面向对象的编程的概念不太熟悉,那么可以将类 想像成只是一个用于构建特殊事物并与之交互的蓝图。好比房子的设计蓝图,不仅显示如何构建房子,还显示房子完工之后,如何更好地使用房子。例如,设计图会显示不同房间的位置、在房间之间的移动方式以及出入房子的通道情况。
第一行的下面是对实际 int
类的详细说明。在这一点上,您可能不熟悉如何在 Python 中创建类,因为显示的语法类似于外语。没关系,我将在另一篇文章中对此进行全面介绍。现在,您只需要知道:int
对象是从 object
类中继承而来,它是 Python 中许多内容的一个基类。
后面的几行介绍 int
类的构造函数。构造函数 只是创建特定类实例(或对象) 的特殊方法。构造函数方法好比建筑承包人,它利用房子的设计图建房子。在 Python 中,构造函数的名称与其创建的类的名称相同。类可以有不同的构造函数方法,这些方法是通过类名称后的圆括号内附带的不同属性进行区分。类可以有不同构造函数方法的较好的一个例子就是 int
类, 实际上,您可以用多种方法调用它,具体采用哪种方法取决于圆括号中放置的参数(参见清单 2)。
int
类构造函数12345678 | >>> int()0>>> int(100) # Create an integer with the value of 100>>> int(\”100\”, 10) # Create an integer with the value of 100 in base 10100100>>> int(\”100\”, 8) # Create an integer with the value of 100 in base 864 |
这四个构造函数调用创建了四个不同的整数。第一个构造函数创建了一个整数对象,其值为 0,在没有值提供给 int
类构造函数的情况下,该值是所使用的默认值。第二个构造函数根据规定创建了一个值为 100 的整数。第三个构造函数采用了字符串“100”并创建了以 10 为基数的整数值(常见的十进制系统)。最后一个构造函数也采用了字符串“100”—— 但是它使用基数 8 来创建整数值,通常称为 八进制。不过,该值在输出时会被转换成十进制数值,这就是该数字显示为 64 的原因。
您可能想知道如果省略了构造函数调用中的圆括号将会发生什么。在这种情况下,您可以向该变量分配一个实际的类名称,有效地为原先的类创建一个别名(参见清单 3)。
int
类型1234567 | >>> it = int # Create an alias to the integer class>>> it(100)100>>> type(it) # We created a new type<type \’type\’>>>> type(it(100)) # Our new type just makes integers<type \’int\’> |
真是太棒了!您立即可以创建一个由内置 int
类定义的新数据类型。但请注意不好的一面,不要滥用这一新功能。优秀的程序员除了使代码具有良好性能外,还应努力使代码清淅。这类编码技巧的确有其使用价值,但它们并不常见。
使用 Python 解释器可以使新的 Python 程序员简化学习过程,少走弯路。如果您想详细了解 Python 内的 help
工具,只需在 Python 解释器中的命令提示符下键入 help()
,就可以访问交互式的帮助工具(参见清单 4)。
123456789101112 | >>> help()Welcome to Python 2.4! This is the online help utility.If this is your first time using Python, you should definitely check outthe tutorial on the Internet at http://www.python.org/doc/tut/.Enter the name of any module, keyword, or topic to get help on writingPython programs and using Python modules. To quit this help utility and1e253b443073125-7\”>return to the interpreter, just type \”quit\”.To get a list of available modules, keywords, or topics, type \”modules\”,\”keywords\”, or \”topics\”. Each module also comes with a one–line summaryof what it does; to list the modules whose summaries contain a given wordsuch as \”spam\”, type \”modules spam\”.help> |
您可能已经对此有所了解,但在 help>
提示符处输入 int
可以显示那些为以前的 int
类显示的类描述。
到目前为止,已经谈论了许多 Python 语言中使用的简单类型。但是多数程序并不简单,它们涉及通常由简单类型组成的复杂数据。因此,现在的问题就成了“如何在 Python 中处理复杂数据?”
如果您熟悉面向对象的语言,如 Java 或 C#,那么您可能认为该问题的答案很简单:只需创建一个新类来处理复杂的数据即可。该方法也适用于 Python,原因是 Python 支持通过类创建新类型。但是,在多数情况下,Python 还可以提供更为简单的方法。当您的程序需要一次处理多个对象时,就可以利用 Python 容器类:
tuple
string
unicode
list
set
frozenset
dictionary
这些容器类型提供了两种功能。前六个类型是有序的,最后一个类型 dictionary
则是一个映射。有序类型与映射类型的区别较为简单。有序类型 仅仅是指对象的顺序。所有的有序类型(除 set
和 frozenset
类型外)都支持访问给定顺序的对象。相比之下,映射容器 则用于保存那些对顺序不是很敏感的对象;通过提供可以找到关系值的密钥,就可以从容器中提取值。
容器类型间的另一个不同点来自于它们所持有的数据的特性,下面四种容器类型的顺序是不可变的:
tuple
string
unicode
frozenset
这意味着在您创建了这些容器类型之一后,所存储的数据就不可更改。如果出于某种原因需要更改数据,则需要创建一个新容器来保存新的数据。
后三种容器类型(list
、set
和 dictionary
)都是可变容器,因此,它们可以根据需要更改保存的任何数据(但在 dictionary 中所使用的密钥是不可变的,就像您房间的钥匙)。虽然可变容器非常灵活,但它们的动态特性会对性能造成影响。例如,tuple
类型,尽管它是不可变的,灵活性较差,但在同一环境中使用时,它们通常比 list
类型快得多。
这些容器类提供了强大的功能,它们通常是多数 Python 程序的核心。本文的其余部分讨论了 tuple
类型,它用于引入许多与创建和使用 Python 中的容器类型有关的基本概念。其余的类型将在以后的文章中讨论。