Python函数(11自定义模块&第三方模块&内置模块)

Python基础语法文章导航:

  1. Python基础(01初识数据类型&变量)

  2. Python基础(02条件&循环语句)

  3. Python基础(03字符串格式化&运算符&进制&编码)

  4. Python基础(04 基础练习题)

  5. Python数据类型(day05整型&布尔类型&字符串类型)

  6. Python数据类型(06列表&元组)

  7. Python数据类型(07集合&字典&浮点型&None)

  8. Python文件操作01(自动化测试文件相关操作)

  9. Python函数入门(08函数定义&参数&返回值)

  10. Python文件操作02(自动化测试文件相关操作)

  11. Python函数(10生成器&内置函数&推导式)

目录

前言

一.自定义模块

1.模块和包

2.导入

(1)导入的本质

[(2)导入方法一,import xxxx:](#(2)导入方法一,import xxxx:)

[(3)导入方法二,from xxxx import xxx:](#(3)导入方法二,from xxxx import xxx:)

3.相对导入,需要有包名称

4.导入别名,as

5.主文件

二.第三方模块

三.内置模块

1.os

2.shutil

3.sys

4.random

5.hashlib

6.configparser

7.xml

8.json

(1)JSON格式的作用

(2)Python数据类型与json格式的相互转换:

[(a)数据类型 -> json ,一般称为:序列化](#(a)数据类型 -> json ,一般称为:序列化)

[(b)json格式 -> 数据类型,一般称为:反序列化](#(b)json格式 -> 数据类型,一般称为:反序列化)

(3)类型要求

(4)其他功能

总结:


前言

本文主要是讲解函数模块的一些知识。

一.自定义模块

1.模块和包

在开发简单的程序时,使用一个py文件就可以搞定,如果程序比较庞大,为了代码结构清晰,开发人员之间的分工,会将功能按照某种规则拆分到不同的py文件中,使用时再进行导入即可。或者,当其他的项目需要导入该项目的某些功能模块的时候,也可以进行导入,这样就极大的减少了代码的重复性,增加了可复用性。

在Python中一般对文件和文件的称呼(很多开发者的平时开发中也有人都称为模块)

  • 一个py文件,模块(module)。

  • 含多个py文件的文件夹,包(package)。

注意:在包(文件夹)中有一个默认内容为空的__init__.py的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。

  • py2必须有,如果没有导入包就会失败。

  • py3可有可无。

2.导入

(1)导入的本质

将某个文件中的内容先加载到内存中,然后再去内存中拿过来使用。

(2)导入方法一,import xxxx:

import xxxx(一般多用于导入sys.path目录下的一个py文件),例如文件(模块)级别如下,如何在run.py文件中导入各py模块文件:

文件级别,导入文件的路径到最后一层文件::

├── commons

│ ├── init.py

│ ├── convert.py

│ ├── page.py

│ ├── tencent

│ │ ├── init.py

│ │ ├── sms.py

│ │ └── wechat.py

│ └── utils.py

├── many.py

└── run.py

包级别,导入包的路径到最后一层包文件:

├── commons

│ ├── init.py

│ ├── convert.py

│ ├── page.py

│ └── utils.py

├── third

│ ├── init.py

│ ├── ali

│ │ └── oss.py

│ └── tencent

│ ├── init.py

│ ├── pycache

│ ├── sms.py

│ └── wechat.py

└── run.py

(3)导入方法二,from xxxx import xxx:

from xxxx import xxx【常用】,一般适用于多层嵌套和导入模块中某个成员的情况。

成员级别, from 导入文件路径到模块级别(py) import 该py文件里面的函数**:**

|── commons
│ ├── init.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
├── many.py
└── run.py

提示:基于from模式也可以支持 from many import *,即:导入一个模块中所有的成员(可能会重名,所以用的少)。

模块级别, from 导入文件路径到包级别 import 对应py文件名字**:**

├── commons
│ ├── init.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
├── many.py
└── run.py

包级别, from 外层包名 import 最里一层包名**::**

├── commons

│ ├── init.py

│ ├── convert.py

│ ├── page.py

│ ├── tencent

│ │ ├── init.py

│ │ ├── sms.py

│ │ └── wechat.py

│ └── utils.py

├── many.py

└── run.py

3.相对导入,需要有包名称

from xxxx import xxx也支持相对导入:from 同文件目录下模块名py文件或上级文件目录下模块名py文件 import 模块中的方法,示例如下

相对导入只能用在包中的py文件中(即:嵌套在文件中的py文件才可以使用,项目根目录下无法使用)。

4.导入别名,as

如果项目中导入 成员/模块/包 有重名,那么后导入的会覆盖之前导入,为了避免这种情况的发生,Python支持重命名,即:

python 复制代码
from xxx.xxx import xx as xo
import x1.x2 as pg

有了as的存在,让import xx.xxx.xxxx在调用执行时,会变得更加简单

原来:

python 复制代码
import commons.page
v1=commons.page.pagination()

现在:

python 复制代码
import commons.page as pg
v1 = pg.pagination()

5.主文件

主文件,其实就是在程序执行的入口文件,例如:

├── commons

│ ├── init.py

│ ├── convert.py

│ ├── page.py

│ ├── tencent

│ │ ├── init.py

│ │ ├── sms.py

│ │ └── wechat.py

│ └── utils.py

├── many.py

└── run.py

通常是执行 run.py 去运行程序,其他的py文件都是一些功能代码。当我们去执行一个文件时,文件内部的 __name__变量的值为 __main__,所以,主文件经常会看到:

python 复制代码
import many
from commons import page
from commons import utils
def start():
    v1 = many.show()
    v2 = page.pagination()
    v3 = utils.encrypt()

if __name__ == '__main__':
    start()

只有是以主文件的形式运行此脚本时start函数才会执行,被导入时则不会被执行。

二.第三方模块

第三方模块(用别人写好并开源出来的py代码 )必须要先安装才可以使用。

1.只需要在自己终端执行: pip3 install 模块名称

2.如要指定版本则可以通过:pip3 install 模块名称==版本

3.pip想要升级为最新的版本例如:..../Versions/3.9/bin/python3.9 -m pip install --upgrade pip

4.pip默认是去 https://pypi.org 去下载第三方模块(本质上就是别人写好的py代码),国外的网站速度会比较慢,为了加速可以使用国内的豆瓣源。

一次性使用:pip3.9 install 模块名称 -i https://pypi.douban.com/simple/

永久使用:

配置:

python 复制代码
# 在终端执行如下命令
pip3.9 config set global.index-url https://pypi.douban.com/simple/

# 执行完成后,提示在我的本地文件中写入了豆瓣源,以后再通过pip去安装第三方模块时,就会默认使用豆瓣源了。
# 自己以后也可以打开文件直接修改源地址。
Writing to /Users/wupeiqi/.config/pip/pip.conf


#再进行下载
pip3.9 install 模块名称

5.也可以有其他的下载源进行使用:

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/

清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/

中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/

三.内置模块

1.os

python 复制代码
import os

# 1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(abs_path)
"""

# 2. 获取当前文件的上级目录
"""
base_path = os.path.dirname( os.path.dirname(路径))
print(base_path)
"""

# 3. 路径拼接
"""
p1 = os.path.join(base_path, 'xx')
print(p1)

p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(p2)
"""

# 4. 判断路径是否存在
"""
exists = os.path.exists(p1)
print(exists)
"""

# 5. 创建文件夹
"""
os.makedirs(路径)
"""
"""
path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
    os.makedirs(path)
"""

# 6. 是否是文件夹
"""
file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')
is_dir = os.path.isdir(file_path)
print(is_dir) # False

folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True

"""

# 7. 删除文件或文件夹
"""
os.remove("文件路径")
"""
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""
  • listdir,查看目录下所有的文件

  • walk,查看目录下所有的文件(含子孙文件)

    python 复制代码
    import os
    
    """
    data = os.listdir("/Users/wupeiqi/PycharmProjects/luffyCourse/day14/commons")
    print(data)
    # ['convert.py', '__init__.py', 'page.py', '__pycache__', 'utils.py', 'tencent']
    """
    
    """
    要遍历一个文件夹下的所有文件,例如:遍历文件夹下的所有mp4文件
    """
    data = os.walk("/Users/wupeiqi/Documents/视频教程/路飞Python/mp4")
    for path, folder_list, file_list in data:
        for file_name in file_list:
            file_abs_path = os.path.join(path, file_name)
            ext = file_abs_path.rsplit(".",1)[-1]
            if ext == "mp4":
                print(file_abs_path)

2.shutil

python 复制代码
import shutil

# 1. 删除文件夹
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""

# 2. 拷贝文件夹
"""
shutil.copytree("/Users/wupeiqi/Desktop/图/csdn/","/Users/wupeiqi/PycharmProjects/CodeRepository/files")
"""

# 3.拷贝文件
"""
shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/")
shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/x.png")
"""

# 4.文件或文件夹重命名
"""
shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/xxxx.png")
shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/files","/Users/wupeiqi/PycharmProjects/CodeRepository/images")
"""

# 5. 压缩文件
"""
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
"""
# shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')


# 6. 解压文件
"""
# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
"""
# shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')

3.sys

python 复制代码
import sys

# 1. 获取解释器版本
"""
print(sys.version)
print(sys.version_info)
print(sys.version_info.major, sys.version_info.minor, sys.version_info.micro)
"""

# 2. 导入模块路径
"""
print(sys.path)
"""
  • argv,执行脚本时,python解释器后面传入的参数
python 复制代码
import sys

print(sys.argv)


# [
#       '/Users/wupeiqi/PycharmProjects/luffyCourse/day14/2.接受执行脚本的参数.py'
# ]

# [
#     "2.接受执行脚本的参数.py"
# ]

# ['2.接受执行脚本的参数.py', '127', '999', '666', 'wupeiqi']

# 例如,请实现下载图片的一个工具。

def download_image(url):
    print("下载图片", url)


def run():
    # 接受用户传入的参数
    url_list = sys.argv[1:]
    for url in url_list:
        download_image(url)


if __name__ == '__main__':
    run()

4.random

python 复制代码
import random

# 1. 获取范围内的随机整数
v = random.randint(10, 20)
print(v)

# 2. 获取范围内的随机小数
v = random.uniform(1, 10)
print(v)

# 3. 随机抽取一个元素
v = random.choice([11, 22, 33, 44, 55])
print(v)

# 4. 随机抽取多个元素
v = random.sample([11, 22, 33, 44, 55], 3)
print(v)

# 5. 打乱顺序
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(data)
print(data)

5.hashlib

hashlib 是 Python 标准库中的一个模块,用于提供各种安全哈希和消息摘要算法。这个模块可以用来创建哈希对象,通过这些对象可以生成文件或数据块的哈希值,常用于数据的完整性验证和密码学应用。

python 复制代码
import hashlib
#hashlib.md5()、hashlib.sha256() 创建了 MD5 和 SHA-256 的哈希对象
hash_object = hashlib.md5()
hash_object.update("武沛齐".encode('utf-8'))
result = hash_object.hexdigest()
print(result)
#17351012472429d52d0c0d23d468173d
python 复制代码
import hashlib

hash_object = hashlib.md5("iajfsdunjaksdjfasdfasdf".encode('utf-8'))
hash_object.update("武沛齐".encode('utf-8'))
result = hash_object.hexdigest()
print(result)
#ff533a063c4ae507be583841e6576829

6.configparser

Python文件操作02(自动化测试文件相关操作)Python文件操作01(自动化测试文件相关操作)Python文件操作02(自动化测试文件相关操作)中的XML内容

7.xml

Python文件操作02(自动化测试文件相关操作)中的XML内容

8.json

json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。

json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)

python 复制代码
# Python中的数据类型的格式
data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
    ('wupeiqi',123),
]

# JSON格式
value = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18},["wupeiqi",123]]'

(1)JSON格式的作用

跨语言数据传输,例如:

A系统用Python开发,有列表类型和字典类型等。

B系统用Java开发,有数组、map等的类型。

语言不同,基础数据类型格式都不同。

为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。

(2)Python数据类型与json格式的相互转换:

(a)数据类型 -> json ,一般称为:序列化

python 复制代码
import json
data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
]
res = json.dumps(data)
print(res) # '[{"id": 1, "name": "\u6b66\u6c9b\u9f50", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
res = json.dumps(data, ensure_ascii=False)
print(res) # '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'

(b)json格式 -> 数据类型,一般称为:反序列化

python 复制代码
import json
data_string = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
data_list = json.loads(data_string)
print(data_list)

#[{'id': 1, 'name': '武沛齐', 'age': 18}, {'id': 2, 'name': 'alex', 'age': 18}]

(3)类型要求

python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:

python 复制代码
data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
]

其他类型如果想要支持,需要自定义JSONEncoder 才能实现,例如:

python 复制代码
import json
from decimal import Decimal
from datetime import datetime
data = [
    {"id": 1, "name": "武沛齐", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
    {"id": 2, "name": "alex", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},
]
class MyJSONEncoder(json.JSONEncoder):
    def default(self, o):
        if type(o) == Decimal:
            return str(o)
        elif type(o) == datetime:
            return o.strftime("%Y-%M-%d")
        return super().default(o)
res = json.dumps(data, cls=MyJSONEncoder,ensure_ascii=False)
print(res)
#[{"id": 1, "name": "武沛齐", "age": 18, "size": "18.99", "ctime": "2024-39-27"}, {"id": 2, "name": "alex", "age": 18, "size": "9.99", "ctime": "2024-39-27"}]

(4)其他功能

json模块中常用的是:

  • json.dumps,序列化生成一个字符串。

  • json.loads,发序列化生成python数据类型。

  • json.dump,将数据序列化并写入文件(不常用)

python 复制代码
import json
data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
]
file_object = open('xxx.json', mode='w', encoding='utf-8')
json_data=json.dump(data, file_object)
print(json_data)
file_object.close()
#None
  • json.load,读取文件中的数据并反序列化为python的数据类型(不常用)

    python 复制代码
    import json
    file_object = open('xxx.json', mode='r', encoding='utf-8')
    data = json.load(file_object)
    print(data)
    file_object.close()
    #[{'id': 1, 'name': '武沛齐', 'age': 18}, {'id': 2, 'name': 'alex', 'age': 18}]

    总结:

    能够深入理解,在项目编码中能够运用本章知识即可。

相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar10 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805110 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_10 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机17 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i18 小时前
drf初步梳理
python·django
每日AI新事件18 小时前
python的异步函数
python