python中用什么表示模块_Python模块是什么(超级详细)

我们之前介绍函数是完成特定功能的一段程序,是可复用程序的最小组成单位;类是包含一组数据及操作这些数据或传递消息的函数的集合。模块是在函数和类的基础上,将一系列相关代码组织到一起的集合体。在 Python 中,一个模块就是一个扩展名为 .py 的源程序文件。

为了方便调用将一些功能相近的模块组织在一起,或是将一个较为复杂的模块拆分为多个组成部分,可以将这些 .py 源程序文件放在同一个文件夹下,按照 Python 的规则进行管理,这样的文件夹和其中的文件就称为包,库则是功能相关联的包的集合。

例如,为了设计一套统一处理图片文件和数据的 Python 程序,可以考虑采用如下所示的包结构。

images/

__init__.py

formats/

__init__.py

jpg.py

png.py

bmp.pv

tif.pv

……

effects/

__init__.py

fade.py

fuzzy.py

其中,images 目录是顶层包名;__init__.py 用来声明该文件夹是一个 Python 包的源程序目录;formats 目录下存放对应不同文件格式的图片处理程序,格式名就是文件名;effects 目录下存放的是处理效果的模块。

在导入一个包时,Python 首先在当前包中查找模块,若找不到则在内置的 built-in 模块中查找,仍然找不到的话会根据 sys.path 中的目录来寻找这个包中包含的子目录。目录只有包含 __init__.py 文件时才会被认作是一个包,最简单的就是建立一个内容为空的文件并命名为 __init__.py。事实上 __init__.py 还应定义 __all__ 用来支持模糊导入。

可以使用以下语句查看当前系统的 Python 搜索路径:

import sys

sys.path

上述代码的运行结果如下所示:

>>> import sys

>>> sys.path

['', 'C:\\Programs\\Python\\Python37\\python37.zip', 'C:\\Programs\\Python37\\DLLs', 'C:\\Programs\\Python37\\lib', 'C:\\Programs\\Python37', 'C:\\Programs\\Python37\\lib\\site-packages']

需要注意的是,Python 安装目录下的 Lib 文件夹内存放了内置的标准库,如图 1 所示。

86941c920e13081df32e3ed1ec38d824.png

图 1:Python 内置标准库存放在Lib目录下

Lib/site-packages 目录下(有的 Linux 发行版是 lib/dist-packages)则存放了用户自行安装的第三方模块(库),如图 2 所示。

ed19d5c10db9cbe408415f784fe2a1e7.png

图 2:用户自行安装的第三方模块(库)存放在 Lib/site-packages 目录下

导入模块一般采用 import 语句,import 语句的语法如下:

import 模块1 [, 模块2[,..., 模块N]]

若只希望导入模块中指定的一部分,可以使用 from…import 语句,其语法如下:

from 包或模块名 import 包或类或函数名1 [, 包或类或函数名2 [, …包或类或函数名N]]

例如导入上面的 png.py 模块,可以执行:

from images.formats import png

模块除了方法定义,一般还可以包括用来初始化这个模块可执行的代码,它们只在第一次被导入时才会被执行。一个模块被另一个程序第一次引入时,其主程序将运行。若希望引入模块时其中的某些程序块不执行,可以借助 __name__ 属性使这些程序块仅在该模块自身运行时执行。

例如:

if __name__ == '__main__':

print('程序自身在运行')

else :

print('以模块方式运行')

上述代码的运行结果如下所示:

>>> if __name__ == '__main__':

...          print('程序自身在运行')

...      else :

...          print('以模块方式运行')

程序自身在运行

温馨提示:每个模块只会被导入一次。模块被导入一次之后即使再次执行 import 语句也不会重新导入,因此应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方。

当模块内容发生了改变时可以使用 reload( ) 函数重新加载该模块,例如:

import importlib, Chap11

importlib.reload(Chap11)

上述代码的运行结果如下所示:

>>> import importlib, Chap11

以模块方式运行

>>> importlib.reload(Chap11)

以模块方式运行

(module 'Chap11' from 'C\\Users\\Administrator\\.spyder-py3\\Chap11.py')

每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。可以使用 dir() 函数查看一个模块内定义的所有名称,例如使用以下代码查看 Chap11.py 内定义的所有名称:

import Chap11

dir(Chap11)

上述代码的运行结果如下所示:

>>> import  Chap11

以模块方式运行

>>> dir(Chap11)

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简易的发红包抢红包的Python程序,使用了`random`、`time`、`math`、`decimal`和`collections`这五个模块。 ```python import random import time import math import decimal import collections def send_red_packet(total_amount, num): """ 发红包函数,total_amount为总金额,num为红包个数 """ if total_amount < num * 0.01: raise ValueError('红包金额太少,无法分给这么多人') amount_list = [] remain_amount = total_amount remain_num = num for i in range(num - 1): min_amount = decimal.Decimal('0.01') max_amount = decimal.Decimal(remain_amount - remain_num * min_amount) amount = random.uniform(min_amount, max_amount) amount = round(amount, 2) amount_list.append(amount) remain_amount -= amount remain_num -= 1 amount_list.append(round(remain_amount, 2)) random.shuffle(amount_list) return amount_list def grab_red_packet(red_packet_list): """ 抢红包函数,red_packet_list为红包金额列表 """ if not red_packet_list: raise ValueError('红包已被抢完') red_packet = red_packet_list.pop(0) return red_packet if __name__ == '__main__': total_amount = decimal.Decimal('10') num = 5 red_packet_list = send_red_packet(total_amount, num) print('发出的红包金额为:', red_packet_list) red_packet_dict = collections.defaultdict(decimal.Decimal) for i in range(num): red_packet = grab_red_packet(red_packet_list) print('第{}个人抢到了{}元的红包'.format(i + 1, red_packet)) red_packet_dict[i + 1] += red_packet print('抢红包的结果为:', red_packet_dict) ``` 以上代码中,`send_red_packet`函数用于发红包,它接受两个参数:`total_amount`为总金额,`num`为红包个数。函数内部使用了随机数生成算法来随机生成每个红包的金额,保证每个红包的金额都在0.01元到剩余金额平均值的两倍之间。最后将生成的红包金额列表随机打乱后返回。 `grab_red_packet`函数用于抢红包,它接受一个参数:`red_packet_list`为红包金额列表。函数内部弹出红包金额列表中的第一个元素作为抢到的红包金额,并返回。 在主程序中,我们先使用`send_red_packet`函数生成红包金额列表,然后使用`grab_red_packet`函数模拟多个人抢红包的过程,最后将每个人抢到的红包金额统计起来输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值