python自学之《21天学通Python》(5)

news2025/1/26 15:24:29

第8章 复杂程序组织

当一个应用程序简单时,将程序代码写入一个文件即可。但随着应用程序或项目复杂度增加时,如果将所有代码都写入同一个文件中时,会出现文件过长或过大,即不方便代码浏览,也不方便代码的管理、使用与维护。此时,很自然地会将同一个应用程序或项目内容按照功能或其他标准,分别放入不同的文件。不同的代码文件就是不同的模块,换句话说,每个“.py”文件都是一个模块。

以模块方式组织代码能够方便地管理和维护代码,如果项目的复杂度进一步增加,则模块可能也不能胜任了。于是,将项目中不同功能的代码放入不同的文件夹中,它们可以相互引用,这就是包。模块和包都是复杂程序组织的一种方式,一般来说,复杂度较低的使用模块来管理即可,而复杂度较高的还要用到包来管理代码。

8.1 模块 Python中的模块实际上就是包含函数或者类的Python程序,对于一个大型的程序经常将功能细化,将实现不同功能的代码放在不同的程序中实现,在其他的程序中以模块的形式使用细化的功能,这样便于程序的维护和重用。

8.1.1 模块概述

模块是包含函数和其他语句的Python脚本文件,它以“.py”为后缀名,也就是Python程序的后缀名。用作模块的Python程序与其他的程序并没有什么区别。使用模块中的代码,也很简单,那就是通过导入模块,然后使用模块中提供的函数或者数据。在Python中可以使用以下三种方法导入模块或者模块中的函数。

import 模块名 import 模块名as新名字 from 模块名import函数名

其中使用import是将整个模块导入,而使用from则是将模块中某一个函数或者名字导入,而不是整个模块。

(1) 使用import和from导入模块还有一个不同:使用import的导入模块,要使用模块中的函数则必须以模块名加“.”,然后是函数名的形式调用函数;

(2) 而使用from导入模块中的某个函数,则可以直接使用函数名调用,不用在前面加上模块名称。此外,使用from导入时,函数名处可以只用一个“*”来表示导入该模块中所有代码。但要注意导入的模块中不要与此文件中的代码重复。

(3) 使用“import模块名as新名字”用来在导入模块时给模块重新命一个名字,可能是因为防止名称重复,也可能是为了重新命一个简洁的名字,方便书写。导入一个模块时,会创建新的命名空间,就可以使用命名空间来调用其中的代码;同时,还会在新创建的命名空间中执行模块中包含的代码,如果有输出也可以在控制台看到。

在这里插入图片描述
在这里插入图片描述
8.1.2 自己编写模块
自己编写模块其实和平常写Python程序是相同的,它既可以是一个解决某个问题的独立程序,也可以是几个函数构成。而模块的名称就是代码保存的文件名。


在这里插入图片描述
在这里插入图片描述

8.1.3 模块位置

编写好的模块只有被Python找到才能被导入。上一节中编写的模块和调用模块的程序位于同一个目录中,因此不需要进行设置就能被Python找到并导入。如果在该目录中新建一个module目录,并且把module_test.py转移到module目录中。再次在Windows的命令窗口中运行a8_2.py,会引发ImportError错误,即找不到要导入的模块。

ImportError错误表示:Python解释器没有找到module_test模块。在导入模块时,Python解释器首先在当前目录中查找要导入的模。如果未找到模块,Python解释器会从sys模块中的path变量指定的目录查找导入模块。如果在以上所有目录中未找到导入的模块,则会引发ImportError错误。

一般来说,Python解释器在运行程序前将当前目录添加到sys.path路径列表中,所以导入模块时首先查找的路径是当前目录下的模块。在Windows系统下,其他的默认模块查找路径为Python的安装目录及几个子目录,如lib、lib\site-packages、dlls等。在linux下默认模块查找路径为/usr/lib、/usr/lib64及其它们的几个几子目录下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意 添加模块查找路径时使用绝对路径。


8.1.4 pycache__目录
在上一节的例子中,运行完usemodule.py会发现moudle目录中除了mymodule.py文件以外还多了一个目录__pycache
,目录下有一个module_test.cpython-34.pyc文件。其中module_test.cpython-34.pyc就是
Python将module_test.4.py编译成字节码的文件。虽然Python是脚本语言,但Python可以将程序编译成字节码的形式。对于模块,Python总是在第一次调用后将其编译成字节码的形式,以提高程序的启动速度。
Python在导入模块时会查找模块的字节码文件,如果存在则将编译版后的模块的修改时间同模块的修改时间相比较。如果两者的修改时间不相符,那么Python将重新编译模块,以保证两者内容相符。被编译的程序也是可以直接运行的。当然,没有必要去刻意编译Python程序。不过,由于Python是脚本,如果不想将源文件发布,可以将发布编译后的程序,这样可以起到一定的保护源文件的作用。
在这里插入图片描述
在这里插入图片描述
8.1.5 具有独立运行能力的模块
每个Python程序在运行时都有一个__name__属性(name前后均是两条下画线)。在程序中通过对__name__属性值的判断,可以让程序在作为导入模块和独立运行时都可以正确运行。
在Python中,如果程序作为模块被导入,则其__name__属性被设置为模块名。如果程序独立运行,则其__name__属性被设置为"__main__"。因此可以通过__name__属性来判断程序的运行状态。
如对实例8-2代码进行修改,它既可以独立运行,又可以作为模块被其他程序导入使用,修改后代码如下:
在这里插入图片描述
8.2 包
Python中的模块实际上就是包含函数或者类的Python程序。对于一个大型的程序经常要将功能细化,把实现不同功能的代码放在不同的程序中实现,在其他的程序中以模块的形式使用细化的功能,这样便于程序的维护和重用。
8.2.1 包概述
当应用程序或项目具有较多的功能模块时,如果把它们都放在同一个文件夹下,就显得不合理了。这时,可以使用Python中提供的包来管理较多的功能模块。使用包的好处在于可以有效避免名字冲突,便于包的维护管理。
包其实就是一个文件夹或目录,但其中必须包含一个名为“__init__.py”(init的前后均是两条下画线)的文件。“__init__.py”可以是一个空文件,仅用于表示该目录是一个包。此外,包还可以嵌套,即把子包放在某个包中。包可以看作处于同一目录中的模块。在Python中首先使用目录名,然后再使用模块名导入所需要的模块。要导入子包必须依照包顺序(目录顺序)以点分隔使用import进行导入。
例如,对于一个web项目可能的包组织结构如下:
在这里插入图片描述
8.2.2 包详解
上一节中所述的包目录中所属的__init__.py文件是一个空文件,只不过是作为包的一个标志。实际上在第一次导入包中的任何部分,就会执行“__init__.py”文件中的代码,其中的变量和函数等也会自动导入。 “__init__.py”文件中也可以包含可执行包的初始化工作的代码和设置“__all__”变量。对于在from中使用“*”通配符导入包内所有名字时,在“__init__.py”中设置“__all__”变量可以保证名字的正确导入。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3 Python常用标准库简介

Python语言中内置的标准库包含200左右的包和模块,提供了广泛的功能,涵盖数据处理、压缩和散列、数据持久化、数据库操作、文件及文件系统处理、日志系统、网络通信、Internet协议、数据编码与转换、多进程与多线程等库和模块。除此以外,Python还有大量的第三方库可以使用。本节简单介绍几个常用的标准库,还有一些标准库将会在本书后面章节加以详细介绍。

8.3.1 数学类模块
此类常用的标准库有math、random。

math中有大量的常见数学计算函数,比如三角函数(sin(),cos(),tan())、反三角函数(asin(),acos(),atn())、对数函数(log(),log10(),log2()),还包括数学中的常量,如e、pi(圆周率)。 random中包含了常见的随机数生成函数,如random、randint,还包括一些按概率生成随机数的函数如gauss等。此外还有像shuffle(乱序列表)、choice()(从序列中随机取元素)等随机函数。

在交互式环境下使用random模块示例代码如下:

>>> import random
>>> random.random()
0.9358315255495109
>>> random.randint(0,10)
0
>>> random.randint(0,10)
4
>>> random.choice((1,2,3,4))
1
>>> alst=[1,2,3,4,5,6]
>>> random.shuffle(alst)
>>> alst
[3, 5, 2, 6, 4, 1]
>>> 

8.3.2 日期与时间类
在这里插入图片描述


>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2022, 12, 20, 19, 38, 14, 366602)
>>> import time
>>> time.time()
1671536307.426266
>>> t1 = datetime.datetime(2015, 3, 7, 23, 14, 56, 139627)
>>> t1
datetime.datetime(2015, 3, 7, 23, 14, 56, 139627)
>>> t2 = datatime.datatime.now()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'datatime' is not defined
>>> t2 = datetime.datetime.now()
>>> t2
datetime.datetime(2022, 12, 20, 19, 47, 37, 930659)
>>> sub = t2-t1
>>> sub.seconds
73961
>>> t2.year,t2.month,t2.day,t2.hour,t2.minute,t2.second
(2022, 12, 20, 19, 47, 37)
>>> 

8.4 小结
本章主要介绍了Python语言中组织复杂程序或代码的基本方法。对于功能单元不多,而且功能单元中的代码少的小型应用,使用模块就可以管理好代码了。而对于功能单元多的中型应用程序或项目,应该用包和模块来组织代码。通过本章学习你应掌握用包和模块来组织代码的方法,并了解如何探查包或模块的结构。
8.5 本章习题
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能人才缺口暴增,想转行的你赶紧把Python学起来...

当前AI人才极度紧缺&#xff0c;据《中国ICT人才生态白皮书》研究分析&#xff0c;到2018年底&#xff0c;我国人工智能人才缺口将突破100万&#xff0c;到2020年&#xff0c;这一数字将攀升到226万。 在过去的几年中&#xff0c;Python已经成为现代软件开发&#xff0c;基础设…

Web测试的各个测试点,居然这么全!(文末送web测试方法大全一份)

1 什么是Web测试&#xff1f; Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 UI测试功能测试数据库测试性能测试兼容性测试安全测试自动化测试 2 WEB测试主要测试场景 1.UI测试 界面是否美观&#xff0c;风格、字体、样式是否…

初识: 对象的属性特征

1. 前言 2. 什么是对象的属性特征 3. 灵活控制对象的属性特征 4. configurable: false 是单向设置的 1. 前言 众所周知&#xff0c;默认情况下我们可以任意对自己定义的对象进行增删改的。但是&#xff0c;在某些情况下&#xff0c;我们不能让别人去随便修改我们定义的对象的…

《数据结构》二叉数

学习目录树型结构概念树的重要概念树的表示形式二叉数概念特殊的二叉树二叉树的性质练习题树型结构 概念 树是一种非线性的数据结构&#xff0c;由 n 个有限节点组成一个有层次关系的集合 它具有以下的特点&#xff1a; 有一个特殊的结点&#xff0c;称为根结点&#xff0c;…

【 Threejs 】- Shader 着色器实例渲染教程

着色器在threejs中是一个难点&#xff0c;话不多说&#xff0c;先来看看着色器是什么&#xff1f; 如果您已经有使用计算机绘图的经验&#xff0c;您就会知道在这个过程中您先画一个圆&#xff0c;然后画一个矩形、一条线、一些三角形&#xff0c;直到您组成您想要的图像。这个…

面试真题 | 什么是 Redis ? Redis缓存应用场景有哪些?

面试官问题 redis击穿、穿透有什么区别&#xff1f;如何设计用例及测试 Redis 的基本概念 在没有添加 Redis 的时候&#xff0c;后端的查询流程是&#xff1a; 用户访问页面。请求后端服务。经过逻辑处理后&#xff0c;去数据库查询信息。 在添加 Redis 的之后&#xff0c;…

MySQL 服务端口大全

介绍 MySQL默认服务端口3306/TCP都不会陌生&#xff0c;但MySQL提供服务只有单纯的这个端口吗。在8.0版本默认启动的时候会发现&#xff0c;出现新的端口。 可以说MySQL使用的端口数量取决于所启用的特性、所使用的组件、应用程序连接的方式以及环境的其他方面。 按照官方说…

转速传感器信号隔离变送器正弦波输入方波信号输出

特点 转速传感器信号直接输入&#xff0c;方波信号输出正弦波、锯齿波信号输入&#xff0c;方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率&#xff0c;响应速度快电源、信号&#xff1a;输入/输出 3000VDC三隔离辅助电源&#xff1a;5V、12V、15V或24V直流单电源…

Huffman编码

目录背景Huffman编码代码部分背景 在数据传输&#xff0c;保存的时候&#xff0c;特别是在数据量特别大的时候传输&#xff0c;保存数据是一件特别麻烦的事。比如逛淘宝的时候&#xff0c;首页会有很多商家展示自己产品的高清图片&#xff0c;如果不对图片进行压缩服务端保存图…

经历百度、美团两次被裁后,我能在小公司躺平吗?

百度裁员后我进入体制内&#xff0c;专心学习自动化 百度被裁后&#xff0c;我意识到自学效果不佳&#xff0c;跟不上职场的所需&#xff0c;于是有了系统学习的想法。 这时的新工作是在体制内&#xff0c;工作强度不大&#xff0c;时间上也比较自由&#xff0c;便正式成为了…

非零基础自学Golang 第12章 接口与类型 12.5 类型断言

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.5 类型断言12.5.1 ok-pattern12.5.2 switch-type第12章 接口与类型 12.5 类型断言 类型断言是使用在接口变量上的操作。 简单来说&#xff0c;接口类型向普通类型的转换就是类型断言。 类型断言的语法是…

【关于时间序列的ML】项目 1 :使用 Python 进行 Covid-19 病例 预测

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

rk3568 | 瑞芯微平台GPIO引脚驱动编写

最近在玩瑞芯微平台的产品&#xff0c;移植了几个设备的驱动&#xff0c;遇到了一些问题&#xff0c;总结后发现大部分问题都出在了GPIO配置的问题上&#xff0c;写下本篇文章&#xff0c;用来分享一下调试的心得。 有喜欢瑞芯微的朋友&#xff0c;可以加我好友&#xff0c;拉…

JVM的作用,结构

源文件经过编译&#xff0c;生成字节码文件 JVM执行字节码文件&#xff08;实际上就是将字节码解释成具体平台上的机器指令&#xff09; jdk&#xff0c;jre&#xff0c;jvm三者的关系&#xff1a; jvm的组成&#xff1a; (1)类加载器子系统:负责将.class文件加载到JVM中 (2)…

初学编程,我们应该怎么做,十年老鸟带你入门。

问问自己学编程的真正目的&#xff0c;仅仅是想应付考试考证&#xff0c;还是真心想从事编程方面的工作。仅仅处于功利性而不是真心喜欢&#xff0c;人生苦短&#xff0c;劝不要来浪费时间&#xff0c;找其它真心喜欢的事情。不是社会喜欢的&#xff0c;不是父母喜欢的&#xf…

这6个微信隐藏功能你真的知道吗?学到就是赚到

我们常用的软件——微信&#xff0c;它有着许多隐藏功能&#xff0c;这些功能其实是很好用的&#xff0c;但是一直被我们忽略掉&#xff0c;现在我整理出来了&#xff0c;一起来看看吧。1.登录设备管理 我们平常在其它设备登录&#xff0c;第一次登录需要二次验证才能成功&…

jdk11新特性——新的Epsilon垃圾收集器

目录一、Epsilon垃圾收集器概述二、Epsilon垃圾收集器用法三、Epsilon垃圾收集器代码示例四、使用Epsilon垃圾收集器的原因五、使用Epsilon垃圾收集器的主要用途一、Epsilon垃圾收集器概述 A NoOp Garbage CollectorJDK上对这个特性的描述是: 开发一个处理内存分配但不实现任何…

【Flink】Flink GET operation failed: Server side error 从blobserver下载错误

文章目录 1.概述2.服务器端1.概述 flink 报错 Flink GET operation failed: Server side error 从blobserver下载错误 java.io.IOException: GET operation failed: Server side error: /tmp/hadoop-www/nm-lo

技术栈入门-------Redis

使用redis的准备工作 1、在虚拟机上安装redis&#xff08;前提是安装了docker容器&#xff09; 上面使用到的命令 docker pull redis mkdir -p /mydata/redis/confdocker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \ -v /mydata/redis/conf/redis.conf:/et…

Python相关软件下载教程

前言 想要在电脑端运行python程序&#xff0c;需要先下载三个软件&#xff1a;Python解释器&#xff0c;编辑器&#xff08;使用Visual Studio Code&#xff0c;简称VS Code&#xff09;&#xff0c;python软件包管理系统&#xff08;简称pip&#xff09;。 一、MacOS系统安装…