资讯专栏INFORMATION COLUMN

SICP Python 描述 第二章 使用对象构建抽象 2.1 引言

phoenixsky / 2104人阅读

摘要:对象表示信息,但是同时和它们所表示的抽象概念行为一致。通过绑定行为和信息,对象提供了可靠独立的日期抽象。名称来源于实数在中表示的方式浮点表示。另一方面,对象可以表示很大范围内的分数,但是不能表示所有有理数。

2.1 引言

来源:2.1 Introduction

译者:飞龙

协议:CC BY-NC-SA 4.0

在第一章中,我们专注于计算过程,以及程序设计中函数的作用。我们看到了如何使用原始数据(数值)和原始操作(算术运算),如何通过组合和控制来形成复合函数,以及如何通过给予过程名称来创建函数抽象。我们也看到了高阶函数通过操作通用计算方法来提升语言的威力。这是编程的本质。

这一章会专注于数据。数据允许我们通过使用已经获得的计算工具,表示和操作与世界有关的信息。脱离数据结构的编程可能会满足于探索数学特性,但是真实世界的情况,比如文档、关系、城市和气候模式,都拥有复杂的结构,它最好使用复合数据类型来表现。归功于互联网的高速发展,关于世界的大量结构信息可以免费从网上获得。

2.1.1 对象隐喻

在这门课的开始,我们区分了函数和数据:函数执行操作,而数据被操作。当我们在数据中包含函数值时,我们承认数据也拥有行为。函数可以像数据一样被操作,但是也可以被调用来执行计算。

在这门课中,对象作为我们对数据值的核心编程隐喻,它同样拥有行为。对象表示信息,但是同时和它们所表示的抽象概念行为一致。对象如何和其它对象交互的逻辑,和编码对象值的信息绑定在一起。在打印对象时,它知道如何以字母和数字把自己拼写出来。如果一个对象由几部分组成,它知道如何按照要求展示这些部分。对象既是信息也是过程,它们绑定在一起来展示复杂事物的属性、交互和行为。

Python 中所实现的对象隐喻具有特定的对象语法和相关的术语,我们会使用示例来介绍。日期(date)就是一种简单对象。

>>> from datetime import date

date的名字绑定到了一个类上面。类表示一类对象。独立的日期叫做这个类的实例,它们可以通过像函数那样在参数上调用这个类来构造,这些参数描述了实例。

>>> today = date(2011, 9, 12)

虽然today从原始数值中构造,它的行为就像日期那样。例如,将它与另一个日期相减会得到时间差,它可以通过调用str来展示为一行文本:

>>> str(date(2011, 12, 2) - today)
"81 days, 0:00:00"

对象拥有属性,它们是带有名字的值,也是对象的一部分。Python 中,我们使用点运算符来访问对象属性:

 . 

上面的求值为对象,是对象的某个属性名称。

不像我们之前见过的名称,这些属性名称在一般的环境中不可用。反之,属性名称是点运算符之前的对象实例的特定部分。

>>> today.year
2011

对象也拥有方法,它是值为函数的属性。在隐喻上,对象“知道”如何执行这些方法。方法从它们的参数和对象中计算出它们的结果。例如,todaystrftime方法接受一个指定如何展示日期的参数(例如%A表示星期几应该以全称拼写)。

>>> today.strftime("%A, %B %d")
"Monday, September 12"

计算strftime的返回值需要两个输入:描述输出格式的字符串,以及绑定到today的日期信息。这个方法使用日期特定的逻辑来产生结果。我们从不会说 2011 年九月十二日是星期一,但是知道一个人的工作日是日期的一部分。通过绑定行为和信息,Python 对象提供了可靠、独立的日期抽象。

点运算符在 Python 中提供了另一种组合表达式。点运算符拥有定义好的求值过程。但是,点运算符如何求值的精确解释,要等到我们引入面向对象编程的完整范式,在几节之后。

即使我们还不能精确描述对象如何工作,我们还是可以开始将数据看做对象,因为 Python 中万物皆对象。

2.1.2 原始数据类型

Python 中每个对象都拥有一个类型。type函数可以让我们查看对象的类型。

>>> type(today)

目前为止,我们学过的对象类型只有数值、函数、布尔值和现在的日期。我们也碰到了集合和字符串,但是需要更深入地学习它们。有许多其它的对象类型 -- 声音、图像、位置、数据连接等等 -- 它们的多数可以通过组合和抽象的手段来定义,我们在这一章会研究它们。Python 只有一小部分内建于语言的原始或原生数据类型。

原始数据类型具有以下特性:

原始表达式可以计算这些类型的对象,叫做字面值。

内建的函数、运算符和方法可以操作这些对象。

像我们看到的那样,数值是原始类型,数字字面值求值为数值,算术运算符操作数值对象:

>>> 12 + 3000000000000000000000000
3000000000000000000000012

实际上,Python 包含了三个原始数值类型:整数(int)、实数(float)和复数(complex)。

>>> type(2)

>>> type(1.5)

>>> type(1+1j)

名称float来源于实数在 Python 中表示的方式:“浮点”表示。虽然数值表示的细节不是这门课的话题,一些intfloat对象的高层差异仍然很重要。特别是,int对象只能表示整数,但是表示得更精确,不带有任何近似。另一方面,float对象可以表示很大范围内的分数,但是不能表示所有有理数。然而,浮点对象通常用于近似表示实数和有理数,舍入到某个有效数字的数值。

扩展阅读。下面的章节介绍了更多的 Python 原始数据类型,专注于它们在创建实用数据抽象中的作用。Dive Into Python 3 中的原始数据类型一章提供了所有 Python 数据类型的实用概览,以及如何高效使用它们,还包含了许多使用示例和实践提示。你现在并不需要阅读它,但是要考虑将它作为宝贵的参考。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45491.html

相关文章

  • SICP Python 描述 第三章 计算机程序的构造和解释 3.1 引言

    摘要:为通用语言设计解释器的想法可能令人畏惧。但是,典型的解释器拥有简洁的通用结构两个可变的递归函数,第一个求解环境中的表达式,第二个在参数上调用函数。这一章接下来的两节专注于递归函数和数据结构,它们是理解解释器设计的基础。 3.1 引言 来源:3.1 Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 第一章和第二章描述了编程的两个基本元素:数据和函数之间的...

    v1 评论0 收藏0
  • SICP Python描述 1.1 引言

    摘要:另一个赋值语句将名称关联到出现在莎士比亚剧本中的所有去重词汇的集合,总计个。表达式是一个复合表达式,计算出正序或倒序出现的莎士比亚词汇集合。在意图上并没有按照莎士比亚或者回文来设计,但是它极大的灵活性让我们用极少的代码处理大量文本。 1.1 引言 来源:1.1 Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 计算机科学是一个极其宽泛的学科。全球的分布...

    xumenger 评论0 收藏0
  • SICP Python 描述 2.2 数据抽象

    摘要:示例有理数的算术有理数可表示为整数的比值,并且它组成了实数的一个重要子类。有理数的值需要两部分来描述。这里的重要概念是,通过将有理数表示为整数的比值,我们能够完全避免近似问题。返回有理数的分子。 2.2 数据抽象 来源:2.2 Data Abstraction 译者:飞龙 协议:CC BY-NC-SA 4.0 由于我们希望在程序中表达世界中的大量事物,我们发现它们的大多数都具有...

    Joonas 评论0 收藏0
  • SICP Python 描述 1.2 编程元素

    摘要:程序用于在编程社群的成员之间交流这些想法。在编程中,我们处理两种元素函数和数据。在中,我们可以使用赋值语句来建立新的绑定,它包含左边的名称和右边的值。例如,它并不能处理赋值语句。这些图解的必要部分是函数的表示。 1.2 编程元素 来源:1.2 The Elements of Programming 译者:飞龙 协议:CC BY-NC-SA 4.0 编程语言是操作计算机来执行任务...

    CoorChice 评论0 收藏0
  • SICP Python 描述 2.3 序列

    摘要:序列不是特定的抽象数据类型,而是不同类型共有的一组行为。不像抽象数据类型,我们并没有阐述如何构造序列。这两个选择器和一个构造器,以及一个常量共同实现了抽象数据类型的递归列表。 2.3 序列 来源:2.3 Sequences 译者:飞龙 协议:CC BY-NC-SA 4.0 序列是数据值的顺序容器。不像偶对只有两个元素,序列可以拥有任意(但是有限)个有序元素。 序列在计算机科学中...

    AlexTuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<