结构化程序设计

说到模块的概念,其实就必须要引入结构化程序设计的思想.
基础的结构化程序设计思想就是高内聚,低耦合.
具体来说就是一个程序必须要实现一系列的功能,这些功能应当由一系列子功能完成;每一个子功能对应的代码应当尽量少的与其他子功能代码产生联系;但子功能内部的各个组成元素如变量和代码等,互相联系非常紧密.这样就做到了高内聚低耦合.理想的程序设计就应该是用尽量少的数据在模块间互相通信以实现功能;修改模块内部的代码,不应当影响其他模块的工作.
结构化程序设计的思想在计算机科学的发展阶段以及现在软件工业中已经具体化成各种成熟的方法体系,一般称为软件设计模式.
软件设计的思想并不简单,可以参考代码大全2一书.

python的模块

教学博客地址
从程序设计广义的概念来讲,所有的能够实现一个功能的子程序都是模块module.
在python里,模块指的就是一个.py源程序文件.其实也可以
模块包含三种:

  • python标准库
  • 第三方模块
  • 应用程序自定义模块

模块和包以及命名空间

每个模块都有独立的命名空间,所以不同模块之间的标识符并不会冲突,只不过注意标识符还是不要和关键字以及内置函数冲突.
如果模块本身的名字冲突怎么办? python引入了包(package)的概念,也就是一个文件夹如果下边有__init__.py文件,这个文件夹就是一个包.包是模块的一种.
如果相同名字的模块放在不同名字的包里,就可以独立使用了,只要在使用的时候最前边加上包名就可以了.

使用模块

使用当前程序的外部模块,需要使用import关键字.

import module_name 引入模块,使用模块内的方法时需要用module_name.method
import module_name as new_name 引入method名称到当前命名空间并且将模块名命名为new_name,需要使用new_name.method来使用模块内方法
from module_name import method 引入method名称到当前命名空间,直接可以使用method名称.
from module_name import * 将module_name的所有方法引用到当前命名空间,直接可以使用方法名称

import的过程中发生了什么?
import等于将模块执行了一遍,其中定义的方法及其标识符被引入到当前空间来,其中的命令被执行.所以如果想让import模块里的语句不被执行,将其写在 if __name__ == ‘__main__’之后.这样当做模块被引入的时候,不会执行,单独运行的时候,则可以执行.
如果导入的是包,会将包内的__init__.py执行.
在何处导入包并执行,当前的工作目录也会被(临时)加到path里,所以如果自己的包里写了相对路径,很可能无法加载,如果确定要加载那个功能,可以只加载那个函数,否则一般加载包本身,或者将需要的路径添加到操作系统环境变量path中.
from 语句是可以加目录的,例如from my_module.cal import my_add 中后边的.cal 表示在my_module目录下边的cal.py文件.如果直接import my_module,用dir可以看到,my_module下边是没有cal对象的.

Python标准库

python除了解释器环境之外,安装了很多可以直接导入并使用的模块,这些模块(包)被叫做python标准库.python标准库是python的一部分,在需要实现内置功能以外的功能的时候,可以先看看python的标准库内是否有相关的处理方式,灵活使用标准库会让编程开发简单很多.
python标准库的组成部分:

  1. Built-in Functions 内置函数
  2. Built-in Constants 内置常量
  3. Built-in Types 内置数据类型
  4. Built-in Exceptions 内置异常
  5. 其他各种功能的模块

所有的python标准库只要安装完python就可以使用,标准库其实也是博大精深,涵盖面很广,后边先按照学习顺序,有时间自己总结一下各种库的使用方法.python帮助文档很有用.

编写python程序的组织架构

目前成熟的程序,比如打开pycharm的目录:

可以看到是以目录结构存放软件包的所有内容,一般执行文件放在bin下边,其他库放在lib下边,外部插件也单独存放,各种功能分开。
自行编写python程序也需要如此,通用的做法是程序入口文件叫做bin.py,放在bin目录下,然后程序运行时候自己编写的库放到软件目录下的lib目录。当然目录名称可以自定义,但是能够清晰的展现出软件结构。
不过这样有一个问题,就是在bin目录下边的程序需要引入自己定义的库要如何做呢,这就涉及到OS模块用相对路径,这样编写的程序无论安装到哪个目录之下,都可以正常调用自己软件包内的资源。
这里只是先提一下,后边OS模块有详细讲解。

导入模块的补充

使用import的时候,第一件事是找到文件,第二件事是在当前位置执行一遍.
import默认只会寻找PATH以及当前文件夹,import后边其实是默认有一个路径,就是当前程序的路径.
如果采用from xxx import zzz
前边的from也是给补完了一个路径,xxx可以是模块名,其实还可以是目录名.

自己编写的模块如果导入了其他模块,记住被导入的时候是在被执行的文件的路径,如果找不到会报错.
所以在模块里导入其他模块,一定要注意运行环境的路径和模块本身相对路径不同.
Pycharm在左侧导航窗口里选中文件可以直接复制路径,很快捷.