模块

1.什么是模块

模块(Module)是一个扩展名为.py的Python文件,这个文件中包含许多功能函数或类,多个模块可以通过包组织。通过在当前.py文件中导入其他.py文件,可以使用被导入文件中定义的内容,如类、变量、函数等。

Python中的模块可以分为三类,分别是内置模块、第三方模块和自定义模块:

  • **内置模块:**Python内置标准库中的木块,也是Python的官方模块,可以直接导入程序供开发人员使用;
  • **第三方模块:**由非官方制作发布、供大众使用的Python模块,在使用之前需要开发人员先自行安装;
  • **自定义模块:**开发人员在程序编写过程中自行编写的、存放功能性代码的.py文件。

2.模块的导入方式

Python的模块导入分为import和from…import…导入两种:

2.1.import导入

使用import导入模块的格式如下:

import 模块1,模块2....

import支持一次导入多个模块,每个模块用逗号隔开:

import time			#  导入时间一个模块
import random, pygame				#  导入两个模块

导入模块后便可以使用"."来使用模块中的函数或类,语法格式为:

模块名.函数名()/类名
time.sleep(1)

如果在开发过程中,需要导入一些名称较长的模块,可使用as为这些模块起别名,语法格式为:

import 模块名 as 别名

2.2.from…import…导入

使用from…import…导入模块后,无需添加前缀,可以像使用当前程序中的内容一样使用模块中的内容,语法格式为:

from 模块名 import 函数/类/变量

这种导入方式也支持一次导入多个函数、类或变量,多个函数、类或变量之间用逗号隔开。

from time import sleep, time

当然也可以使用通配符来表示导入模块中的全部内容:

from 模块名 import *

同时还可以支持为模块或模块中的函数起别名:

from 模块名 import 函数名 as 别名
from time import sleep as s1
s1(1)        #  s1为函数sleep()的别名

3.常见的标准模块

Python中内置了许多标准模块,例如sys,os,random和time模块等。

3.1.sys模块

sys模块中提供了一系列与Python解释器交互的函数和变量,用于操控Python的运行环境。常见的变量和函数如下所示:

变量/函数

说明

sys.argv

获取命令行参数列表,第一个元素为程序自身的路径

sys.version

获取Python解释器的版本信息

sys.path

获取模块的搜索路径,该变量的初始值为环境变量PYTHONPATH的值

sys.platfrom

返回操作系统平台的名称

sys.exit()

退出当前程序,可为该函数传递参数,以设置返回值或退出信息,正常退出的返回值为0

import sys

print(sys.argv)  # ['D:/笔记/Python/SC2003/project/2048/demo01.py']
print(sys.version)  # 3.10.1
print(sys.path)  
print(sys.platform)  # win32
sys.exit("退出程序")
print(sys.argv)

3.2.os模块

os模块中提供了访问操作系统服务的功能,该模块常用函数如下所示:

函数

说明

os.getcwd()

获取当前工作路径,即当前Python脚本所在的路径

os.chdir()

改变当前脚本的工作路径

os.remove()

删除指定文件

os.exit()

终止Python程序

os.path.abspath(path)

返回path规范化的绝对路径

os.path.split(path)

将path分隔为(目录,文件名)的二元组并返回

os中的exit()与sys模块的exit()有所不同,执行os模块中的exit()后,程序会立即结束,之后的代码不会再执行;而执行sys模块中的exit()函数会引发一个SystemExit异常,如没有捕获该异常,后面的代码不会再执行,若捕获了则后续的代码仍然会执行。

import os

print(os.getcwd())  # D:\笔记\Python\SC2003\project\2048
print("执行exit()之前。。。")
try:
    os.exit(0)
    print("执行exit()之后。。。")
except:
    print("结束程序")

3.3.random模块

random模块为随机模块,该模块中定义了多个可产生各种随机数的函数。random模块中的常用函数如下所示:

函数

说明

random.random()

返回(0,1]之间的随机实数

random.randint(x, y)

返回[x, y]之间的随机整数

random.choice(seq)

从序列seq中随机返回一个元素

random.uniform(x, y)

返回[x,y]之间随机的浮点数

import random
print(random.randint(1, 100))
print(random.uniform(1, 100))
name = ["李刚", "李渊", "李世民", "李隆基", "李自成"]
print(random.choice(name))

3.4.time模块

time模块提供了一系列处理时间的函数,常用的函数说下所示:

函数

说明

time.time()

获取当前时间,单位为秒

time.sleep(secs)

进入休眠状态,时长由参数secs指定,单位为秒

time.strptime(string[,format])

将一个时间格式(如2022-03-01)的字符串解析为时间元组

time.localtime(secs)

以struct_time类型输出本地时间

time.asctime([tuple])

获取时间字符串,或将时间元组转换为字符串

time.mktime(tuple)

将时间元组转换成秒数

strftime(format[,tuple])

返回字符串表示的当地时间,格式由format决定

import time

before = time.time()
for i in range(10000):
    print("Hello World!")
after = time.time()
interval = after - before
print(f"输出10遍Hello World的运行时间为{interval}秒")
import random
import time

list1 = ["李刚", "李渊", "李世民", "李隆基", "李自成"]
list2 = []
for i in range(len(list1)):
    people = random.choice(list1)
    list1.remove(people)
    list2.append(people)
    time.sleep(2)  # 每隔2秒执行一次
    print(f"此时list2的成员有{list2}")
str_dt = "2022-03-01 12:59:59"
# 转换成数组
time_struct = time.strptime(str_dt, '%Y-%m-%d %H:%M:%S')
# 转换成时间戳
timestamp = time.mktime(time_struct)
print(time_struct)
print(timestamp)

4.自定义模块

一般在进行程序开发时,不会将所有的代码放到一个文件中,而是将耦合度较低的多个功能写入不同的文件中,制作成模块,并在其他文件中以导入模块的方式使用自定义模块中的内容。

Python中的每个文件都可以作为一个模块存在,文件名即为模块名。创建一个名为module01的Python文件,内容如下:

print("模块1。。。")

def fun01():
    print("模块1的fun01()函数")

class MyClass01:
    def fun02(self):
        print("MyClass01.fun02()")

module01文件即可视为一个模块,该模块中定义的类、函数、变量都可以在导入该模块的程序中使用,创建demo01使用module01中的资源,在导入前需要在它们上层同一目录下右键选择Mark Directory as–Source Root,使它们能在同一资源目录下:

import demo01
demo01.fun01()
mClass01 = demo01.MyClass01()
mClass01.fun02()

python模块 ctypes python模块分为哪三类_pygame

5.模块变量

依据模块的导入特性,将这些特性用模块的变量来表示,常用变量有:

  • all变量:定义可以导出的成员,仅对from xx import *有效;
  • **__doc__变量:**文档字符串;
  • **file😗*模块对应的文件路径名;
  • **__name__变量:**模块自身名字,可以判断是否为主模块,当此模块作为主模块(第一个运行的模块)运行时,name__绑定__main,不是主模块,而是被其他模块导入时,存储模块名;
  • **_😗*当模块中的内容以单下划线定义时,表示为该模块的隐藏内容。

较大型项目中,一个项目通常由多名开发人员共同开发,为保证各模块整合后的正常运行,Python中提供了__name__属性,它与if条件语句配合使用,若当前模块是启动模块,则其__name__的值为__main__,若该模块被其他模块导入,则__name__的值为文件名。

定义demo03,内容如下:

# 定义当前模块哪些成员可以被导入
__all__ = ["fun01", "_fun02", "MyClass"]
print("模块3.。。")
def fun01():
    print("模块3中的fun01()...")
# 只在模块内部使用的成员可以用_开头
def _fun02():
    print("模块3中的fun02()...")
class MyClass:
    @staticmethod
    def fun03():
        print("MyClass的fun03()...")

定义demo04调用demo03中的内容:

from demo03 import *
from demo03 import _fun02
fun01()
# 隐藏成员不能通过from 模块 import *导入
# _fun02()
# 可以通过from demo03 import _fun02形式调用
_fun02()
MyClass.fun03()

# 打印注释等文档字符串,可以通过该属性查看文档
print(__doc__)
# 打印当前模块的绝对路径
print(__file__)
print(__name__)


python模块 ctypes python模块分为哪三类_pygame_02

Python中的包

1.包结构

为了更好的组织Python代码,开发人员通常会根据不同的业务将模块进行分类,并将功能相近的模块划分到同一目录下,如果要想导入这个模块,就得先导入这个模块的包。Python中的包是一个包含__init__.py文件的目录,该目录下还包含一些模块和子包。一个包的结构大致如下:

python模块 ctypes python模块分为哪三类_开发语言_03

其中__init__.py的作用有两个,第一个是标识当前目录是一个Python包;第二便是模糊导入。如果__init__.py文件中没有声明__all__属性,那么使用"from…import…"导入的内容为空。

2.包的导入

包的导入和模块的导入大致相同,也是通过import或from…import…来实现。

在当前工程下新增package,取名Package01,并在包中创建模块mudule_a.py,并定义函数:

def fun01():
    print("1包中的fun01()")

再在package01包下创建package02,并创建模块module_b.py,调用mudule_a.py中的函数fun01():

def fun02():
    print("2包中的fun02()")

在当前的根目录下创建demo.py和package01同一级,完成package01和package02下模块函数的调用:

# from 包.模块 import 成员
from package01.module_a import fun01
fun01()

from package01.package02.module_b import fun02
fun02()

3.练习

在如下结构中自定义方法,完成如下调用:

  1. 在main.py中调用skill_deployer.py;
  2. 在skill_deployer.py中调用skill_manager.py
  3. 在skill_manager中调用double_list_helper.py
  4. 在list_helper.py中调用main.py。

python模块 ctypes python模块分为哪三类_开发语言_04

生成6位随机验证码:

"""
验证码

"""
"""
随机生成6位的验证码(字母数字随机组合,包含大小写)
chr()函数返回值是当前整数对应的ascii字符。
"""
import random


def verifycode():
    code_list = ''
    # 每一位验证码都有三种可能(大写字母,小写字母,数字)
    for i in range(6):  # 控制验证码生成的位数
        state = random.randint(1, 3)
        if state == 1:
            # ASCII编码集中大写字母A-Z对应65-90位
            first_kind = random.randint(65, 90)  # 大写字母
            random_uppercase = chr(first_kind)
            code_list = code_list + random_uppercase

        elif state == 2:
            # ASCII编码集中小写字母a-z对应97-122位
            second_kinds = random.randint(97, 122)  # 小写字母
            random_lowercase = chr(second_kinds)
            code_list = code_list + random_lowercase
        elif state == 3:
            third_kinds = random.randint(0, 9)
            code_list = code_list + str(third_kinds)
    return code_list


if __name__ == '__main__':
    verifycode = verifycode()
    print(verifycode)