第二部分 Python提高—模块化编程

模块化(module)程序设计理念

模块和包概念的进化史

在这里插入图片描述
1 Python程序由模块组成。一个模块对应python源文件,一般后缀名是: .py
2 模块由语句组成。运行Python程序时,按照模块中语句的顺序依次执行
3 语句是Python程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等

"量变引起质变”是哲学中一个重要的理论。量变为什么会引起质变呢?本质上理解,随着数量的增加,管理方式会发生本质的变化;旧的管理方式完全不适合,必须采用新的管理方式。

1 程序越来越复杂,语句多了,怎么管理?很自然的,我们会将实现同一个功能的语句封装到
函数中,统一管理和调用,于是函数诞生了。

2 程序更加复杂,函数和变量多了,怎么管理?同样的思路,“物以类聚”,我们将同一类型对
象的“数据和行为”,也就是“变量和函数”,放到一起统一管理和调用,于是“类和对象”诞生
了。

3 程序继续复杂,函数和类更加多了,怎么办?好,我们将实现类似功能的函数和类统统放到
一个模块中,于是“模块”诞生了。

4 程序还要复杂,模块多了,怎么办? 于是,我们将实现类似功能的模块放到一起,于是“包”
就诞生了。

标准库模块(standard library)

Python标准库提供了操作系统功能、网络通信、文本处理、文件处理、数学运算等基本的功能。比如:random(随机数)、math(数学运算)、time(时间处理)、file(文件处理)、os(和操作系统交互)、sys(和解释器交互)等。

另外,Python还提供了海量的第三方模块,使用方式和标准库类似。功能覆盖了我们能想象到的所有领域,比如:科学计算、WEB开发、大数据、人工智能、图形系统等。

为什么需要模块化编程

模块(module)对应于Python源代码文件(.py文件)。模块中可以定义变量、函数、类、普通语句。 这样,我们可以将一个Python程序分解成多个模块,便于后期的重复应用。

模块化编程(Modular Programming)将一个任务分解成多个模块。每个模块就像一个积木一样,便于后期的反复使用、反复搭建。

模块化编程有如下几个重要优势:
1 便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序
2 实现代码复用。一个模块实现后,可以被反复调用
3 可维护性增强

模块化编程的流程

1 设计API,进行功能描述。
2 编码实现API中描述的功能。
3 在模块中编写测试代码,并消除全局代码。
4 使用私有函数实现不被外部客户端调用的模块函数。

模块的API和功能描述要点

**API(Application Programming Interface 应用程序编程接口)**是用于描述模块中提供的函数和类的功能描述和使用方式描述。
模块化编程中,首先设计的就是模块的API(即要实现的功能描述),然后开始编码实现API中描述的功能。最后,在其他模块中导入本模块进行调用。

可以通过help(模块名)查看模块的API。一般使用时先导入模块 然后通过help函数查看。

模块的创建和测试代码

每个模块都有一个名称,通过特殊变量__name__ 可以获取模块的名称。在正常情况下,模块名字对应源文件名。 仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符),它的__name__ 的值为__main__ 。我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理。例如:

import math
print(math.__name__) #输出'math'

模块文档字符串和API设计

我们可以在模块的第一行增加一个文档字符串,用于描述模块的相关功能。然后,通过__doc__ 可以获得文档字符串的内容。

模块的导入

import语句导入

import 模块名 #导入一个模块
import 模块1,模块2#导入多个模块
import 模块名 as 模块别名 #导入模块并使用新名字

import 加载的模块分为四种类型:
1 使用python编写的代码.py文件
2 已被编译为共享库或DLL 的C或C++扩展
3 一组模块的包
4 使用C编写并链接到python解释器的内置模块

我们一般通过import 语句实现模块的导入和使用, import 本质上是使用了内置函数__import__()
当我们通过import 导入一个模块时,python解释器进行执行,最终会生成一个对象,这个对象就代表了被加载的模块。

import math
print(id(math))
print(type(math))
print(math.pi) #通过math.成员名来访问模块中的成员

2232645443136
<class ‘module’>
3.141592653589793

由上,我们可以看到math 模块被加载后,实际会生成一个module 类的对象,该对象被math变量引用。我们可以通过math 变量引用模块中所有的内容。
我们通过import 导入多个模块,本质上也是生成多个module 类的对象而已。
有时候,我们也需要给模块起个别名,本质上,这个别名仅仅是新创建一个变量引用加载的模块对象而已。

from…import导入

from 模块名 import 成员1,成员2,…
#如果希望导入一个模块中的所有成员,则可以采用如下方式:
from 模块名 import *

但是:
尽量避免from 模块名 import * 这种写法。* 它表示导入模块中所有的不是以下划线_ 开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。
而且可读性极其的差。一般生产环境中尽量避免使用,学习时没有关系。

import语句和from…import语句的区别

import 导入的是模块。from...import 导入的是模块中的函数/类。

如果进行类比的话, import 导入的是**“文件”**,我们要使用该“文件”下的内容,必须前面加“文件名称”。from...import 导入的是文件下的“内容”,我们直接使用这些“内容”即可,前面再也不需要加“文件名称”了。

将下面代码存为**calculate.py**

"""一个实现四则运算的计算器"""
def add(a,b):
return a+b
def minus(a,b):
return a-b
class MyNum():
def print123(self):
print(123)

再下面的代码中导入**calculate.py**

import calculator
a = calculator.add(30,40)
# add(100,200) #不加模块名无法识别
print(a)

from calculator import *
a = add(100,200) #无需模块名,可以直接引用里面的函数/类
print(a)
b = MyNum()
b.print123()

__import__() 动态导入

import 语句本质上就是调用内置函数__import__() ,我们可以通过它实现动态导入。给__import__() 动态传递不同的的参数值,就能导入不同的模块。
注意:一般不建议我们自行使用__import__() 导入,其行为在python2和python3中有差异,会导致意外错误。如果需要动态导入可以使用**importlib** 模块

import importlib
a = importlib.import_module("math")
print(a.pi)

模块的加载问题

当导入一个模块时, 模块中的代码都会被执行。不过,如果再次导入这个模块,则不会再次执行。
Python的设计者为什么这么设计?因为,导入模块更多的时候需要的是定义模块中的变量、函数、对象等。这些并不需要反复定义和执行。“只导入一次import-only-once ”就成了一种优化。

一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

重新加载有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload() 方法:

import test02
print("####")
import importlib
importlib.reload(test02)

包package的使用

当一个项目中有很多个模块时,需要再进行组织。我们将功能类似的模块放到一起,形成了“包”。本质上,“包”就是一个必须有__init__.py 的文件夹。典型结构如下:

在这里插入图片描述
包下面可以包含“模块(module)”,也可以再包含“子包(subpackage)”。就像文件夹下面可以有文件,也可以有子文件夹一样。
在这里插入图片描述
上图中, a 是上层的包,下面有一个子包: aa 。可以看到每个包里面都有__init__.py 文件。

导入包操作和本质

如我们需要导入module_AA.py 。方式如下:
1 import a.aa.module_AA 在使用时,必须加完整名称来引用,比如: a.aa.module_AA.fun_AA()
2 from a.aa import module_AA 在使用时,直接可以使用模块名。 比如: module_AA.fun_AA()
3 from a.aa.module_AA import fun_AA 直接导入函数在使用时,直接可以使用函数名。 比如: fun_AA()
注意:
1 from package import item 这种语法中, item 可以是包、模块,也可以是函数、类、变量。

2 import item1.item2 这种语法中, item 必须是包或模块,不能是其他。

导入包的本质其实是“导入了包的**init.py** ”文件。也就是说**, import pack1** 意味着执行了包pack1 下面的__init__.py 文件。 这样,可以在__init__.py 中批量导入我们需要的模块,而不再需要一个个导入。

init.py 的2个核心作用:

1 作为包的标识,不能删除。
2 导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及需要统一执行代码、批量导入

用* 导入包

**import *** 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。这可能会花长时间等。Python 解决方案是提供一个明确的包索引。

这个索引由 __init__.py 定义 __all__ 变量,该变量为一个列表,如上例 a包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"] 这意味着, from sound.effects import * 会从对应的包中导入以上两个子模块;

注意:
尽管提供import * 的方法,仍不建议在生产代码中使用这种写法。

库(Library)

标准库(Standard Library)

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。

Python标准库的主要功能有:

1文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
2 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
3操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志
(logging)等功能
4 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
5 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
6 W3C格式支持,包含HTML,SGML,XML的处理。
7 其它功能,包括国际化支持、数学运算、HASH、Tkinter等

第三方扩展库的介绍

强大的标准库奠定了python发展的基石,丰富和不断扩展的第三方库是python壮大的保证。我们可以进入PyPI官网(https://pypi.org)

可以看到发布的第三方库达到了十多万种,众多的开发者为Python 贡献了自己的力量。

常用第三方库大汇总

分类库名称说明
环境管理P非常简单的交互式 python版本管理工具
Pyenv简单的 Python 版本管理工具
Vex可以在虚拟环境中执行命令
Virtualenvvirtualenvwrapper创建独立 Python 环境的工具
包管理pipPython 包和依赖关系管理工具
pip-tools保证 Python 包依赖关系更新的一组工具
PipenvPython 官方推荐的新一代包管理工具
Poetry可完全取代 setup.py 的包管理工具
包仓库warehouse下一代 PyPI
DevpiPyPI 服务和打包/测试/分发工具
分发(打包为可执行文件以便分发)PyInstaller将 Python 程序转成独立的执行文件(跨平台)
Nuitka将脚本、模块、包编译成可执行文件或扩展模块
py2app将 Python 脚本变为独立软件包(Mac OS X)
py2exe将 Python 脚本变为独立软件包(Windows)
pynsist一个用来创建 Windows 安装程序的工具,可以在安装程序中打包Python 本身
构建工具(将源码编译成软件)Buildout构建系统,从多个组件来创建,组装和部署应用
BitBake针对嵌入式 Linux 的类似 make 的构建工具
Fabricate对任何语言自动找到依赖关系的构建工具
交互式 Python 解析器IPython功能丰富的工具,非常有效的使用交互式 Python
bpython界面丰富的 Python 解析器
Ptpython高级交互式 Python 解析器,构建于 python-prompt-toolkit 之上
文件管理Aiofiles基于 asyncio,提供文件异步操作
Imghdr(Python 标准库)检测图片类型
Mimetypes(Python 标准库)将文件名映射为MIME 类型
path.py对 os.path 进行封装的模块
Pathlib(Python3.4+ 标准库)跨平台的、面向对象的路径操作库
Unipath用面向对象的方式操作文件和目录
Watchdog管理文件系统事件的 API 和 shell 工具
日期和时间Arrow更好的 Python 日期时间操作类库
Chronyk解析手写格式的时间和日期
DateutilPython datetime 模块的扩展
PyTime一个简单易用的 Python 模块,用于通过字符串来操作日期/时间
when.py提供用户友好的函数来帮助用户进行常用的日期和时间操作
文本处理chardet字符编码检测器,兼容Python2 和 Python3
Difflib(Python 标准库)帮助我们进行差异化比较
Fuzzywuzzy模糊字符串匹配
Levenshtein快速计算编辑距离以及字符串的相似度
Pypinyin汉字拼音转换工具 Python 版
Shortuuid一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID
simplejsonPython 的 JSON 编码、解码器
UnidecodeUnicode 文本的 ASCII 转换形式
Xpinyin一个用于把汉字转换为拼音的库
Pygment通用语法高亮工具
Phonenumbers解析,格式化,储存,验证电话号码
Sqlparse一个无验证的 SQL 解析器
特殊文本格式处理Tablib一个用来处理中表格数据的模块
Pyexcel用来读写,操作 Excel 文件的库
python-docx读取,查询以及修改word文件
PDFMiner一个用于从 PDF 文档中抽取信息的工具
Python-Markdown2纯 Python 实现的 Markdown 解析器
Csvkit用于转换和操作 CSV 的工具
自然语言处理NLTK一个先进的平台,用以构建处理人类语言数据的Python 程序
Jieba中文分词工具
langid.py独立的语言识别系统
SnowNLP一个用来处理中文文本的库
Thulac清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包
下载器you-get一个YouTube/Youku/Niconico视频下载器
图像处理pillow最常用的图像处理库
imgSeek一个使用视觉相似性搜索一组图片集合的项目
face_recognition简单易用的 python 人脸识别
python-qrcode一个纯 Python 实现的二维码生成器
OCRPyocrTesseract 和 Cuneiform的一个封装(wrapper)
pytesseractGoogle Tesseract OCR 的另一个封装(wrapper)
音频处理AudiolazyPython 的数字信号处理包
Dejavu音频指纹提取和识别
id3reader一个用来读取 MP3 元数据的Python 模块
TimeSide开源 web 音频处理框架
Tinytag一个用来读取 MP3, OGG, FLAC 以及 Wave 文件音乐元数据的库
Mingus一个高级音乐理论和曲谱包,支持MIDI 文件和回放功能
视频和GIF处理Moviepy一个用来进行基于脚本的视频编辑模块,适用于多种格式,包括动图 GIFs
scikit-videoSciPy 视频处理常用程序
地理位置GeoDjango世界级地理图形 web 框架
GeoIPMaxMind GeoIP Legacy 数据库的Python API
GeopyPython 地址编码工具箱
HTTPrequests人性化的 HTTP 请求库
httplib2全面的 HTTP 客户端库
urllib3一个具有线程安全连接池,支持文件 post,清晰友好的 HTTP 库
Python实现的数据库pickleDB一个简单,轻量级键值储存数据库
PipelineDB 流式 SQL 数据库TinyDB一个微型的,面向文档型数据库
web框架DjangoPython 界最流行的 web框架
Flask一个 Python 微型框架
Tornado一个 web 框架和异步网络库
CMS内容管理系统odoo-cms一个开源的,企业级CMS,基于 odoo
djedi-cms一个轻量级但却非常强大的 DjangoCMS ,考虑到了插件,内联编辑以及性能
Opps一个为杂志,报纸网站以及大流量门户网站设计的 CMS 平台,基于Django
电子商务和支付系统django-oscar一个用于 Django 的开源的电子商务框架
django-shop一个基于 Django 的店铺系统
Shoop一个基于 Django 的开源电子商务平台
AlipayPython 支付宝 API
Merchant一个可以接收来自多种支付平台支付的 Django 应用
游戏开发Cocos2d用来开发 2D 游戏
Panda3D由迪士尼开发的 3D 游戏引擎,并由卡内基梅陇娱乐技术中心负责维护。使用 C++ 编写, 针对 Python 进行了完全的封装
PygamePygame 是一组 Python 模块,用来编写游戏
RenPy一个视觉小说(visual novel)引擎
计算机视觉库OpenCV开源
PyocrTesseract 和 Cuneiform 的包装库
SimpleCV一个用来创建计算机视觉应用的开源框架
机器学习人工智能TensorFlow谷歌开源的最受欢迎的深度学习框架
keras以 tensorflow/theano/CNTK 为后端的深度学习封装库,快速上手神经网络
HebelGPU 加速的深度学习库
Pytorch一个具有张量和动态神经网络,并有强大 GPU 加速能力的深度学习框架
scikit-learn基于 SciPy 构建的机器学习 Python模块
NuPIC智能计算 Numenta 平台
科学计算和数据分析NumPy使用 Python 进行科学计算的基础包
Pandas提供高性能,易用的数据结构和数据分析工具
SciPy用于数学,科学和工程的开源软件构成的生态系统
PyMC马尔科夫链蒙特卡洛采样工具代码分析和调试code2flow把你的 Python 和JavaScript 代码转换为流程图
Pycallgraph这个库可以把你的 Python 应用的流程(调用图)进行可视化
Pylint一个完全可定制的源码分析器
autopep8自动格式化 Python 代码,以使其符合 PEP8 规范
Wdb一个奇异的 web 调试器,通过WebSockets 工作
Lineprofiler逐行性能分析
Memory Profiler监控 Python 代码的内存使用
图形用户界面Pyglet一个 Python 的跨平台窗口及多媒体库
PyQt跨平台用户界面框架 Qt 的 Python绑定 ,支持 Qt v4 和 Qt v5
TkinterTkinter 是 Python GUI 的一个事实标准库
wxPythonwxPython 是 wxWidgets C++ 类库和 Python 语言混合的产物
网络爬虫和HTML分析Scrapy一个快速高级的屏幕爬取及网页采集框架
Cola一个分布式爬虫框架
Grab站点爬取框架
Pyspider一个强大的爬虫系统
html2text将 HTML 转换为 Markdown 格式文本
python-gooseHTML 内容/文章提取器
硬件编程Ino操作 Arduino 的命令行工具
PyroPython 机器人编程库
PyUserInput跨平台的,控制鼠标和键盘的模块
PingoPingo 为类似 Raspberry Pi,pcDuino, Intel Galileo 等设备提供统一的 API

PIP模块管理工具

pip 是一个现代的,通用的Python包管理工具。提供了对 Python包的查找、下载、安装、卸载的功能。
第一种方式:命令行下远程安装
pip更换数据源(由于访问国外网站慢,建议更换)。
家目录中,创建pip 目录,然后增加文件: pip.ini 内容拷贝下面的即可(不要加其他字符):

[global]
index-url =https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

在命令行提示符下输入:pip installpymysql 即可。安装第三方pymysql

第二种方式:Pycharm中直接安装到项目中

  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44006060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值