内容正文:
1.3认识数据抽象
高中信息技术/教科版/选择性必修1
目录
1.情景导入
2.新知讲授
3.拓展练习
4.课堂小结
1.情境导入
大多数人家里都有电视机,那么有谁知道电视机接收节目、显示画面的原理?如果不知道这些原理,是否影响我们使用电视机来收看节目?
本节我们将通过“电视机的抽象”“程序化电视机”等活动了解电视机的运行原理,建立抽象的概念。
2.新知讲授
什么是抽象
在计算机科学中,抽象 (abstraction)是一种抛弃局部“物理的”细节,从整体“逻辑的”角度来看待事物的方式。
所谓“逻辑的”,一般指事物的性质、功能、相互关联等,而“物理的”,则是事物的具体构成、实现细节和运作方式等。
抽象关注“能做什么”,而不涉及“怎么做”,具有更大的灵活性和可扩展性。抽象也是相对的,可以在不同层次上进行抽象。
任务一 电视机中的抽象 活动1 了解用户眼中的电视机
每家每户的电视机在外观、尺寸、内部结构和节目接收方式上会有很多不同,但在收看节目方面,许多人都能够在短时间里熟悉一台电视机的操作方式,熟练地收看节目。
无论电视机是什么品牌、多大尺寸,只要功能相同,都可以通过相同的操作界面来使用电视机收看节目。
如果电视机遥控器丢失,可以购买“万能遥控器”来操作电视,这说明了什么问题?
说明电视机的基本功能都相同,甚至遥控器与电视机通信的方式也基本相同。
从抽象的角度来看,用户看到的是电视机逻辑的一面。用户使用的是电视机设计者提供的一系列能够收看和切换电视节目的功能,这些功能会通过遥控器上的按钮来提供,电视机身上也有-些按钮,这些按钮也可以被称为操作界面或接口 (interface)。
序号 电视机的功能 操作按钮
1 开机/关机 电源开关
2 根据号码选择频道 数字键盘
3 切换节目源
4 切换频道
5 调节音量
填一填
“节目源”按钮
“频道”上下箭头按钮
“音量”上下箭头按钮
任务一 电视机中的抽象 活动1 了解用户眼中的电视机
抽象和接口
通过抽象方法,我们可以专注于问题解决方案的顶层逻辑功能设计,从问题的整体和全局出发,定义一系列接口,让用户可以通过调用接口来执行逻辑功能,而无须关心接口的具体物理实现细节。这样,对于用户来说,问题的复杂程度就大大简化了。
采用抽象方式来处理问题及其解决方案,能够自顶向下层层分解复杂度,更加有条理地解决复杂问题,并通过同一逻辑方案的不同物理实现(implementation),使得问题解决方案具有灵活性和可扩展性。
任务一 电视机中的抽象 活动1 了解用户眼中的电视机
你知道电视机机壳内的秘密吗?
任务一 电视机中的抽象 活动2 了解机壳之内的物理实现
同样是一台电视机,观众只需要一台遥控器就可以观看电视节目,无需关心电视机运行的原理。而对于家电维修员,不仅要知道如何使用电视机,而且需要知道保证电视机功能正常的物理实现细节。他需要理解节目画面如何被显示、遥控器信号如何被接收、如何连接内部的音箱等。
成像模块是电视机画面输出的核心部件,虽然各种电视机的操作界面相似,但形成画面的成像模块却可能差别甚大,阅读下表的内容,了解不同成像方式实现的一些细节,试着查找资料,填写表中的空白部分。
类型/特性 成像模块 画面尺寸 显示分辨率
显像管电视机 阴极射线管(CRT) 较小 较低
平板电视机
投影电视机
填一填
较高
液晶显示屏
较大
光源透射投影
大
中等
不同成像方式电视机的技术实现对比表
任务一 电视机中的抽象 活动2 了解机壳之内的物理实现
计算机程序是如何抽象的呢?
程序中的抽象
编写程序的时候,也常常需要抽象。Python 提供了很多内置函数库,我们可以直接调用这些函数,而无须关心或者了解这些函数功能具体是如何实现的。
例如,要计算某个数的平方根,可以在导入Python的math标准模块之后,直接调用math.sqrt()函数来求值,而不用了解这个函数是如何对整数或者浮点数开平方的。
如果我们把电视机的逻辑功能接口写成Python 函数的形式,那么用户收看一次节目的过程就可以写成一段程序了。下表是电视机功能接口的定义表。
接口 功能定义
TVSet.powerOn() 开启电源
TVSet.shift(source) 切换节目源,可选“TV”“AV”“HDMI”“USB
TVSet.channelUp() 直接切换频道,n为数字
TVSet.channel(n) 频道号加一切换
TVSet.channelDow() 频道号减一切换
TVSet.volumeUp() 音量增强
TVSet.volumeDow() 音量减弱
TVSet.powerOff() 关闭电源
任务二 程序化的电视机 活动1 收看虚拟的电视机
任务二 程序化的电视机 活动1 收看虚拟的电视机
补充完整下列程序,完成一次节目收看,并在计算机上运行和验证程序。
01.#导入电视机模块
02. import tv
03. myTV=tv.TVSet( )
04.myTV.powerOn( )
05.
07.
08.
06.
09.
10.
11.
12.
#新建一个电视机对象
#开启电源
#切换到“TV”节目源
#收看6频道
#看下一个频道
#看下一个频道
#看下一个频道
#看上一个频道
#调小音量
#关闭电源
myTV.shift(“Tv”)
myTV.channel(6)
myTV.channelUp( )
myTV.channelUp( )
myTV.channelUp( )
myTV.channelDown( )
myTV.volumeDown( )
myTV.powerOff( )
过程抽象和数据抽象
过程抽象
调用求平方根函数就是一个过程抽象(proceduralabstraction)的例子,我们不需要知道求平方根是怎么运算的,只需要知道这个函数叫什么、如何使用。如果按照说明正确调用函数,那么这个函数就能实现它所声称的功能,而实现细节则被隐藏起来,或者说被抽象了。
过程抽象和数据抽象
数据抽象
如果把现实世界中的事物抽象成一类数据对象,就可以只从其逻辑功能来描述这些数据对象的性质、功能和它们之间的关联,而不涉及这些数据对象的具体实现细节。这就是跟过程抽象相似的数据抽象(data abstraction)
实现
操作
接口
用户
实际上,在编写电视收看程序的时候,已经用到了电视机的数据抽象。利用 Python 语言的面向对象机制,我们在电视机模块tv中定义了一个电视机类TVSet。请从教科书配套资源中找到tv.py文件,查看其中电视机类TVSet的每一个方法说明,了解电视机类TVSet的使用方法,并将每个方法的名称摘抄在下表中。
序号 方法名称 功能描述
1
2
3
3
任务二 程序化的电视机 活动2 了解电视机类TVSet的使用说明
powerOn
电视机开机、屏播放音乐、显示信息
shift
检查节目有效性、切换节目源,显示信息
channel
切换频道,显示信息,切换画面
volumeUp
音量增强,设置音量,显示画面,显示信息
请从教科书配套资源中找到虚拟现实头盔模块vrhmd,修改前面的电视收看程序,完成全景影像节目收看。
任务二 程序化的电视机 活动3 了解虚拟现实头盔
01.#导人虚拟现实头盔模块
02. import vrhmd
03.myTV=vrhmd.TVSet( )
04.myTV.powerOn( )
05.
07.
08.
06.
09.
10.
11.
12.
#切换到“VR”节目源
#收看6频道
#看下一个频道
#看下一个频道
#看下一个频道
#看上一个频道
#调小音量
#关闭电源
myTV.shift(“VR”)
myTV.channel(6)
myTV.channelUp( )
myTV.channelUp( )
myTV.channelUp( )
myTV.channelDown( )
myTV.volumeDown( )
myTV.powerOff( )
数据封装
数据抽象实现了数据封装(encapsulation),其优势不仅在于能够把逻辑功能和实现细节分离,分解问题的复杂度,而且还使得数据对象的可扩展性大大增强,在更换逻辑功能的具体实现方案后,只要接口的功能和定义不变,就无须修改上层程序代码。
利用抽象方法,可以将一个高复杂度的问题分解为若干层次。这种层层抽象的细分结构,既有效限制了每个层次上的问题复杂度,又有利于问题解决方案的重复利用,可以做到下层实现细节的变动不影响上层的逻辑功能,具有强大的灵活性和可扩展性。
抽象数据类型
抽象数据类型(Abstract Data Type,ADT)是抽象概念在数据结构上的具体应用。将数据对象分析的结果,以逻辑功能接口的形式固定下来,就成为抽象数据类型。抽象数据类型实现了数据对象的封装,并不涉及数据对象的实现细节,而是通过接口的形式描述了数据的组成和对数据的各种操作。
抽象数据类型并不受特定实现和编程语言的约束,可以通过调整实现方法来应对应用需求的变化。抽象数据类型概念的引入,降低了大型软件系统的复杂度,提高了程序的可读性与可维护性,使软件系统的各部分相对隔离,在一定程度上解决了软件可靠性、生产率等方面的问题。
3.拓展练习
利用所学的物理学知识,编程实现平抛运动 (Horizontal Projectile Motion,HPM)类HPMotion,该类提供下列接口:
class HPMotion:
def __init__(self, h, vx): #初始化接口,参数为高度h和水平速度vx
#指定时刻t的速度,返回元组 (vx,vy ) 分别是水平、竖直方向的速度值
def velocity(self, t):
#指定时刻t的位移,返回元组 ( dx,dy ) 分别是水平、竖直方向的位移
def displacement(self, t):
运行程序,通过调用HPMotion类的接口,无须了解内部计算公式,就能够得到指定时刻t的速度和位移值,深入体验数据抽象的概念及其带来的便利。
class HPMotion:
def__init__(self,h,vx)
self.g=9.8
self.h=h
self.vx=vx
def velocity(self,t):
vy=self.g*t
return self.vx,vy
def displacement(self,t):
dx=self.vx*t
dy=0.5*self.g*t*t
return dx,dy
hpm=HPMotion(10,60)
import turtle
tut=turtle.Turtle()
turtle.setworldcoordinates(0,1000,1000,0)
turtle.title("平抛运动")
for t in range(20):
print("时间s",t,"速度vx/vy",hpm.velocity(t),"位移dx/dy",hpm.displacement(t))
tut.goto(hpm.displacement(t))
tut.dot(10,"blue")
4.课堂小结
本节的主要学习内容是数据抽象的概念。通过常见的电视机案例,展现了数据抽象中“逻辑”“物理”“接口”“实现”等概念,通过程序实例说明了抽象方法的优势,引出抽象数据类型的概念。
下节课见!
$$