模块的定义
Python模块(Module),是一个Python文件,以.py结尾,模块可以定义类、函数、变量等,模块里可以包含可执行代码
模块的作用
Python中很多各种不同的模块
每个模块都可以帮我们实现特定功能,拿来即用不需要自己开发
我们可以自定义模块
模块的导入
导入的3种方式
import 模块名1[, 模块名2...] from 模块名 import 功能1[, 功能2, 功能3...] from 模块名 import *
import xxx
示例:
# 调用功能时使用:模块名.功能名()
# 导入math模块
import math
# 使用math模块中的功能求2的10次方的值
print(math.pow(2, 10))
# 求解9的平方根为多少
print(math.sqrt(9))
-
math模块的函数
函数名 | 含义 |
---|---|
pow(x, y) | 返回x**y(x的y次方)的值 |
sqrt(x) | 返回数值x的平方根 |
from xx import xx
示例:
from math import ceil, floor
# from math import ceil
# from math import floor
# 求解3.14的上入整数
print(ceil(3.14))
# 求解3.14的下舍整数
print(floor(3.14))
-
math模块的函数
函数名 | 含义 |
---|---|
ceil(x) | 向上取整,返回数值x的上入整数,如ceil(3.14)返回4 |
floor(x) | 向下取整,返回数值x的下舍整数,如floor(3.14)返回3 |
from xxx import *
示例:
from math import *
# 求解半径为5的圆周长
print((10 * pi))
# 打印e
print(e)
print("-" * 50 + "起别名的方式")
导入模块起别名
-
语法
import 模块名 as 别名 from 模块名 import 功能名 as 别名
示例:
import math as m
print(m.pow(2, 3))
from math import sqrt as sq
print(sq(9))
总结:
from可以省略,直接import即可
as别名可以省略
通过“.”来确定层级关系的
模块的导入一般写在代码文件的开头位置
自定义模块
定义与调用模块
每个Python文件都可以作为一个模块,模块的名字就是文件的名字. 也就是说自定义模块名必须要符合标识符命名规则
在Python中,模块主要分为三类:
-
自定义模块:定义后,直接使用
-
标准库:直接导入使用-- import random
-
扩展库(第三方库):需要先安装库,再导入使用 pip install 模块名
案例:
-
09-自定义模块并调用.py
-
# 新建一个Python文件,命名为mytool.py # 在模块mytool.py中定义一个add()函数用于求两数之和 # 再定义一个模块来导入mytool.py模块并调用其中的add()函数进行求和 # 导入要使用模块 import mytool # 调用模块中的函数 res = mytool.add(3, 5, 45) print(res)
-
mytool.py
def add(*args):
"""
用于计算多个数之和的函数
:param args: 待计算的数据
:return: 计算结果
"""
# 定义变量用于记录所有数累加的结果
num_sum = 0
# 遍历所有数进行累加
for n in args:
num_sum += n
return num_sum
总结:
当有一些功能会被频繁使用时,可以采用自定义模块的形式把频繁使用的功能封装,使用时导入自定义模块并调用
注意:自定义模块名不要与Python已有库名相同,否则会出错
自定义模块名必须要符合标识符命名规则和规范
__name__变量
每个模块中都有一个__name__变量:
-
当__name__在当前模块中输出时结果为:__main__
-
当在另外的模块中被调用执行输出时结果为:当前的模块名
通常我们会在自定义模块中,将测试代码写在如下判断中:
if __name__ == "__main__":
测试代码
示例:
def add(*args):
"""
用于计算多个数之和的函数
:param args: 待计算的数据
:return: 计算结果
"""
# 定义变量用于记录所有数累加的结果
num_sum = 0
# 遍历所有数进行累加
for n in args:
num_sum += n
return num_sum
print("自定义模块中__name__变量中的值为:", __name__)
if __name__ == '__main__':
print("测试的结果为:", add(1, 2, 3))
# 导入要使用模块
import mytool
print("主文件中__name__的值:", __name__)
if __name__ == '__main__':
# 调用模块中的函数
res = mytool.add(3, 5, 45)
print(res)
__all__变量
每一个模块文件中都__all__变量,当使用from xxx import *导入时,只能导入__all__中定义的元素
语法:
# 可以使用__all__来限定*的范围,当导入全部功能时可能比较消耗资源,有些功能是人家模块有特殊用处,反正不想给你用 __all__ = ["功能名1", "功能名2"....]
-
案例:
# 定义myutil.py模块,其中有四个函数,分别用于计算两数之和、差、积、商
# 再定义一个test.py模块,导入myutil.py模块并调用其中的四个函数方法
# 再定义一个test.py模块,导入myutil.py模块并调用其中的四个函数方法
from myutil import *
if __name__ == '__main__':
# 调用myutil中的函数
print(add(1, 3))
print(div(3, 0))
# 定义myutil.py模块,其中有四个函数,分别用于计算两数之和、差、积、商
__all__ = ["add", "sub", "mul"]
def add(a, b):
"""
求和
:param a:
:param b:
:return:
"""
return a + b
def sub(a, b):
"""
求差
:param a:
:param b:
:return:
"""
return a - b
def mul(a, b):
"""
求积
:param a:
:param b:
:return:
"""
return a * b
def div(a, b):
"""
求商
:param a:
:param b:
:return:
"""
return a / b
if __name__ == '__main__':
print(div(1, 3))
制作Python包
当文件下有一个__init__.py文件时,该文件夹就是Python包
Python包一般用于将一些有联系的模块放在一起进行管理
一般会在__init__.py模块中做一些初始化的操作,比如初始化MySQL数据库连接等
也可以使用__all__变量来限定import * 可以导入的模块范围
安装第三方包
在shell客户端中执行下面命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
综合案例
-
需求
创建一个自定义包,名称为:my_utils (我的工具) 在包内提供2个模块 str_util.py (字符串相关工具,内含:) 函数:str_reverse(s),接受传入字符串,将字符串反转返回 函数:substr(s, x, y),按照下标x和y,对字符串进行切片 file_util.py(文件处理相关工具,内含:) 函数:print_file_info(file_name),接收传入文件的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象 函数:append_to_file(file_name, data),接收文件路径以及传入数据,将数据追加写入到文件中 构建出包后,尝试着用一用自己编写的工具包。
-
代码示例
str_util.py
# 函数:str_reverse(s),接受传入字符串,将字符串反转返回
def str_reverse(s):
return s[::-1]
# 函数:substr(s, x, y),按照下标x和y,对字符串进行切片
def substr(s, x, y):
# 左闭右开
return s[x:y:]
file_util.py
# 函数:print_file_info(file_name),接收传入文件的路径,打印文件的全部内容,
# 如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象
def print_file_info(file_name):
f = None
try:
f = open(file_name, mode='r', encoding='utf8')
print(f.read())
except Exception as e:
print(f"发生了异常:{e}")
finally:
# 判断f变量中是否是None
if f:
print("关闭文件!!!")
f.close()
# 函数:append_to_file(file_name, data),接收文件路径以及传入数据,将数据追加写入到文件中
def append_to_file(file_name, data):
f = open(file_name, mode='a', encoding='utf8')
f.write(data)
f.close()
if __name__ == '__main__':
# 测试代码
print_file_info(file_name="../test.py")
append_to_file(file_name="./test.txt", data="hello world\n")
test2.py
from my_utils import *
if __name__ == '__main__':
# 调用函数并执行
print(str_util.str_reverse("itheima"))
print(str_util.substr('itheima', 1, 40))
file_util.print_file_info('./test2.py')
file_util.append_to_file('./test.txt', 'helloworld\n')