《计算思维导论:程序设计思想与方法》——第4章:模块化编程

在控制结构这个层次上考虑程序设计,必然因两个方面的复杂性二导致编程困难:一是在广度上有成千上万的代码,二是在深度上有多层嵌套的控制结构。

4.1 模块化编程基本概念
4.1.1 模块化设计概述
  1. 模块是指提供特定功能的相对独立的单元。模块一般具有如下特征:
  • 标准化:模块是具有标准尺寸和标准接口的预制功能单元,这是组装、互换等特征的基础。
  • 可组装:多个模块可以方便、灵活地组合、配置,以构造不同大小、不同形状、不同功能地系统。
  • 可替换:通过用一个模块去更换另一个模块,可以改变系统的局部功能而不影响系统的其他部分。
  • 可维护:可以对模块进行局部修改或设置,以满足用户的需求。另外可以在现有的系统中增加新模块,以扩展系统功能。
4.1.2 模块化编程
  1. 模块化编程是一种软件设计技术,它将软件分解为若干独立的、可替换的、具有预定功能的模块,每个模块实现一个功能,各模块通过接口(输入输出部分)组合在一起,形成最终程序。
  2. 模块化编程具有以下优点:
  • 易设计:较大的复杂问题分解为若干较小的简单问题;
  • 易实现:模块化设计适合团队开发,因为每个团队成员不需要了解系统全貌,只需关注所分配地小任务。
  • 易测试:每个模块不但可以独立开发,也可以独立测试,最后组装时再进行联合测试。
  • 易维护:如果需要修改系统或扩展功能,只需针对特定模块进行修改或者添加新模块。
  • 可重用:很多模块的代码都可以不加修改地用于其他程序的开发。
  1. 模块化编程实际上时一条抽象设计原则的具体体现,即分离关注点(Separation of Concerns,缩写SoC)原则。
4.1.3 编程语言对模块化编程的支持
  1. 子程序是指程序中的一段代码,它执行特定任务,并且与同一程序中的其他部分是相对独立的。
  2. 子程序构造一般涉及以下一些内容:
  • 子程序的创建:定义子程序的名字和代码(程序体)
  • 子程序的调用和返回:调用就是要求执行子程序,而子程序执行完毕应当将控制返回给调用者。
  • 参数:相当于子程序所需的输入数据,一般需要预先声明参数的类型和个数,并在调用时提供具体的参数值。
  • 返回值:相当于子程序的输出数据,一般需要预先声明返回值的类型。
  • 局部变量:子程序定义的变量在子程序外部是不可见的,亦即子程序构成了一个私有名字空间。这是子程序独立性的一种表现。
  • 全局变量:子程序外部定义的变量如果被声明为全局变量,那么所有子程序都可以共享使用、操作该变量。
4.2 Python语言中的函数
4.2.1 用函数减少重复代码
4.2.2 用函数改善程序结构
4.2.3 用函数增强程序的通用性
4.2.4 小结:函数的定义与调用

在这里插入图片描述
函数掉用的语法:
在这里插入图片描述

  1. 当Python遇到一个函数调用时,将通过四个步骤来处理这个调用。
  • (1)调用者P在调用点暂停执行(术语称为P挂起);
  • (2)函数f的形式参数被赋予实际参数a的值;
  • (3)执行f的函数体;
  • (4)f执行完毕后,控制返回到P中调用点的下一条语句。
  1. 关键字参数
    函数调用时的参数传递通常采用上述“按位置匹配”的方式,但Python还提供另一种参数传递方式——关键字参数。关键字参数形如“<形参名>==<实参值>”。
  2. 如果一个函数有很多参数,但是调用时只想为个别参数传递值,而其他参数采用缺省值,这时采用关键字参数就是必然的选择。
4.2.5 变量的作用域
  • 局部变量:
    在一个函数中定义的变量称为局部变量(local variable),因为它们的作用域局限于该函数的函数体,在函数外部是没有定义的。
    函数的形参也可以看作是函数的局部变量,即只能在函数体内访问。
  • 全局变量
    函数体中包含一条声明全局变量的语句:global x
    意为函数中所使用的x是在函数外部定义的全局变量。
4.2.6 函数的返回值
  1. 函数输出的计算结果为函数的返回值(returned value)
4.3 自顶向下设计
  1. 自顶向下设计称为逐步求精(stepwise refinement),是将一个系统逐层分解为子系统的设计过程。
  2. 自顶向下设计具有两个特征:第一,要求设计者一开始就对整个系统有清楚的理解,否则第一步的分解就无法进行;第二,任何子系统在足够细化之前无法开始编码实现,因而必须等到所有子系统都足够细化,才能够对系统编码实现及测试。
4.3.1 顶层设计
4.3.2 第二层设计
4.3.3 第三层设计
4.3.4 第四层设计
4.3.5 自底向上实现域单元测试
  1. 自顶向下设计是创建层次化的模块结构的过程。从结构图的底层开始实现每个函数,然后上一层模块自然得到实现。
  2. 在模块化编程中,测试程序最适合采用单元测试技术,即先分别测试每一个模块,然后再逐步测试较大的模块,直至最后测试完整程序。
4.3.5 开发过程小结
  1. 自顶向下设计过程可以概括为以下四个步骤:
  • (1)将问题分解为若干个子问题;
  • (2)为每个子问题设计一个函数接口
  • (3)将原问题的算法用各子问题对应的函数接口来表达;
  • (4)对每个子问题重复(1)~(3)的过程。
4.4 Python模块
4.4.1 模块的创建和使用
  1. 模块作为程序的结构单元,至少有三个作用:
  • (1)代码重用
  • (2) 名字空间
  • (3)实现共享
  1. Python模块很容易创建,只要使用任意的文本编辑器,键入一些Python语句并保存为.py文件,就得到一个Python模块。
  2. 为了使用Python模块中定义的对象,必须用import或from语句导入模块。
4.4.2 Python程序架构

在这里插入图片描述

4.4.3 标准库模块
  1. 标准库并不是Python语言本身的一部分,而是专业程序员预先编好并随语言提供给用户使用的。
  2. Python的标准安装都会自动安装标准库。
  3. 在Python解释器提示符下键入help(),可以进入联机帮助环境。
4.4.4 模块的有条件执行
  1. 有些Python模块是可以直接执行的,称为程序或脚本。
  2. 如果是用import导入模块,Python会将该模块的一个特殊变量__name__的值设置为模块的名字。但是如果直接执行模块,Python则将模块的特殊变量__name__设置为字符串’main’。因此可以通过特殊变量__name__的值来判断模块是被导入的还是直接执行的。
  3. 将程序文件的最后一行写为:
    if name==‘main’:
    main()
    就能确保当程序是直接执行时,main能启动;被导入时忽略main。
4.5 练习

书籍下载地址:https://download.csdn.net/download/qq_37590544/10959608

猜你喜欢

转载自blog.csdn.net/qq_37590544/article/details/87715263
今日推荐