21.模块

设置不生成字节码文件

字节码文件作用

  • Python解释器将源码转换为字节码 (.pyc文件), 然后再由解释器来执行这些字节码;
  • 下次执行时,如果没有变化,则优先执行生成好的字节码文件

方式一:设置环境变量(最常用的)

export PYTHONDONTWRITEBYTECODE=1

方式二:使用 -B参数

$ python -B test.py

方式三:在导入的地方写

import sys

sys.dont_write_bytecode = True

Python 的模块

Python 模块(module),是一个Python文件,以.py结尾

模块能定义函数,类和变量,模块里也能包含可执行的代码

模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们快速实现一些功能

比如实现和时间相关的功能就可以使用time模块

可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能

模块就是一个Python文件,里面有类、函数、变量等,我们可以直接导入模块去使用

模块的导入方式

[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]

常用的组合形式:

  • import 模块名
  • from 模块名 import 类、变量、方法等
  • from 模块名 import *
  • import 模块名 as 别名
  • from 模块名 import 功能名 as 别名

基本语法:

import 模块名

import 模块名1, 模块名2

使用导入的模块: 模块名.功能名()

注意:

  • from 可以省略,直接import即可
  • as 别名可以省略
  • 通过"."来确定层级关系
  • 模块的导入一般写在代码文件的开头位置
import time   # 导入time 模块 ctrl键+鼠标点击time查看 time模块的源代码
time.sleep(1)
from time import sleep  # 导入时间模块中的sleep方法
sleep(1)

time.localtime()
time.struct_time(tm_year=2024, tm_mon=2, tm_mday=1, tm_hour=18, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=32, tm_isdst=0)
from time import *  # 导入时间模块中所有的功能
sleep(1)
from time import sleep as sp
sp(1)

import time as t
t.sleep(1)

制作自定义模块

注意:

  • 每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名必须符合标识符命名规则
  • 当导入多个模块的时候,且模块内有同名功能,当调用这个同名功能的时候,调用到的是后面导入的模块的功能
import my_package.my_module
print(my_package.my_module.test(1, 3))
my_package.my_module.test2(2, 3)
4
5

测试模块

Py文件经常会写一些测试信息,此时,无论是当前文件,还是其他导入了该模块的文件,在运行的时候都会自动执行测试代码的调用

解决方案:

if __name__ == '__main__': # 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行test2函数的调用

  test2(2, 3)

from my_package.my_module import test2     # if __name__ == '__main__': 可以不运行测试模块的代码

__all__

如果一个模块文件中有'__all__'变量,当使用'from xxx import *'导入时,只能导入这个列表中的元素

from my_package.my_module import *
print(test(1, 3))
test2(2, 3)  # __all__ = ['test'] NameError: name 'test2' is not defined
4
5

Python包

什么是Python包

从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py文件,该文件夹可用于包含多个模块文件

从逻辑上看,包的本质依然是模块

包的作用:当我们的模块文件越来越多时,包可以帮助我们管理这些模块,包的作用就是包含多个模块,但包的本质依然是模块

创建包的步骤举例:

  • 创建自定义文件夹 my_package
  • 文件夹内创建文件 __init.py__
  • my_package 创建自定义模块 my_module.py

包的导入: import 包名.模块名 使用: 包名.模块名.目标

__init.py__ 通过 __all__ = ['my_module'] 配置import * 能导入的模块

from my_package.my_module import *
print(my_package.my_module.test(2, 6))
my_package.my_module.test2(2, 7)

from my_package import my_module
print(test(1, 5))

from my_package.my_module import test2
test2(3, 6)
8
9
6
9

Python第三方包

Pythone常用非Python官方的包,可以极大帮助我们提高开发效率:

  • 科学计算中常用的:numpy
  • 数据分析中常用的:pandas
  • 大数据计算中学用的:pyspark、apache-flink
  • 图形可视化常用的:matplotlib、pyecharts
  • 人工智能常用的:tensorflow

安装第三方包: pip install 包的名称

pip install numpy

import numpy

综合案例

# 自定义模块,字符串工具substr对传入的字符串进行切片,str_reverse 将传入的字符串反转返回
import my_package.str_util
my_package.str_util.substr("adgsdg dasdfgsdg  dfdad", 5, 10)
my_package.str_util.str_reverse("adgsdg dasdfgsdg  dfdad")
'dadfd  gdsgfdsad gdsgda'
# 接收文件路径以及传入数据,将数据追加写入到文件中
from my_package import file_util
file_util.print_file_info("write.txt")
I Love Pythonhello worldhello world hello world hello world
hello world hello world
hello world
hello world hello world
hello world hello world
hello worlditheima itcast python
itheima itcast python
itheima python itcast
itheima itcast python
itheima python itcast
测试数据写入

调用append_to_file工具测试写入
调用append_to_file工具测试写入
import my_package.file_util
my_package.file_util.append_to_file("write.txt", "调用append_to_file工具测试写入")