Python模块与包

模块的定义

  • 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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值