模块学习
什么是模块:
打开Python解释器,定义了data = 1, 然后去访问data是可以访问到的;关闭Python解释器,再打开,再去访问data,访问不到了。
假设我有1000行的代码,在python解释器中写了,关闭了之后,那意味着我这1000行代码就消失了。
出现了一个脚本的东西,或者认为使用一个文件来记录你写的代码。因为文件是保存在磁盘中,打开或者关闭,文件它依然存在,所以里边的内容也依然存在。
在Python中指的就是一个.py文件, 来记录你写的代码,你把代码放入文件中,他就不会消失了。
模块的定义: 一个Python文件就是一个模块。
如果你的模块内容过多,你可以把这个模块(.py)分割成若干模块。
重要的点:
(1)什么是模块: 一个python文件(.py)就是一个模块
(2)如果一个模块里边的代码过长,可以将这个模块按照一定的规则划分成若干模块,一般的规则,就是按功能划分
(3)如果在其他模块想要使用另一个的功能(变量,函数,类),可以去导入模块,导入模块的好处就是避免代码的重复
如何去导入模块:
import module_name
# 这种形式:导入这个module_name的全部内容
from module_name import 局部内容(变量, 函数, 类)
# 这种形式:导入的是Module_name的局部内容
from test_module import data, data2
# 导入多个局部内容时使用逗号分隔
你的被导入模块和你需要导入的模块,必须位于同一个级别,同一个级别你可以把他想象成同一级别的目录
重命名:as
from module_name import 局部内容 as newname
# 示例
from test_module import data as d
#就是将导入的局部内容进行改名
from module_name import *: * 代表的是所有的意思
这种方式会导入所有不以下划线(_)开头的名称,注意:大多数情况下,不要用这个功能
模块中的内容:
模块包含可执行语句及函数定义,导入模块的时候:其实就是去执行我们test_module.py中的代码,你在哪里导入就在哪里执行, 所以一般模块导入的位置,就放在.py文件的顶部
如何去调用模块中变量,函数,类:
1、将整个文件引入
import 文件名
文件名.函数名()/文件名.类名
通过这种方法可以运行另外一个文件里的函数
2、只引入某个文件中的一个类/函数/变量
需要从某个文件中引入多个函数或变量是,用逗号隔开即可
from 文件名 import 函数名,类名,变量名
代码示例:
test_module.py文件
data = 1
data2 = 2
print("This is test_module")
# 我在运行test_module.py的时候他也等于
# __name__ == __main__
print("test_module: __name__=", __name__)
if __name__ == '__main__':
print("only test_module is main")
test.py文件
import test_module
print(test_module.data)
print(test_module.data2)
data3 = "module_learning"
print("This is my module")
print(data3)
from test_module import data as d, data2 as d2
print(d)
print(d2)
运行结果:
调用test_module.py,就是直接把test_module.py运行一遍
__name__:是python解释器内置的一个变量,可以直接去使用,如果当前的模块是主模块(你自己运行的模块:python.exe 模块名.py),就是__name__ == __main__,如果不是主模块的话,就是__name__ == 模块名
例: 在module_learning导入了test_module模块
(1)在test_module中打印了__name__
(2)在module_learning中也打印了__name__
(3)然后去运行module_learning,也意味着我们的module_learning为主模块
(4)在test_module中打印出来__name__ == test_module
(5)在module_learning中打印了__name__ == __main__
常用的模块:
print()
id()
input()
# 上面的几个方法不需要导入任何模块,可以直接去使用,这些东西存在builtins.py这个文件(模块),
builitins.py:
Built-in functions, exceptions, and other objects.:内建了函数, 异常和一些其他的对象,有些是python内置提前预设的,不需要我们导入。
包:
什么是包?
新建一个包之后:包中包含了一个__init__.py的一个文件,新建一个文件夹:是不包含__init__.py的,Python 只把含 __init__.py 文件的目录当成包
__init__.py的作用:init -> initial:是初始化的意思,最简情况下,__init__.py 只是一个空文件,该文件也可以执行包的初始化代码,或设置 __all__ 变量
包的功能:提高检索模块的效率,让我们的模块层次化分类显示,提高可读性
包的概念:
包是一种用“点式模块名”构造 Python 模块命名空间的方法,针对模块来说的: 管理模块的命名空间 -> 包(package)
命名空间:
在python中,一个命名空间是一个容器,容器内的元素是能映射到对象的名称。多个命名空间相互独立,允许不同命名空间有相同的名称。
有了命名空间之后如何去访问模块呢?
命名空间.模块名
导入:
import 命名空间.module_name
from 命名空间 import Module_name
from 命名空间.module_name import 局部内容
import package(包).module_name
from package(包) import Module_name
from package(包).module_name import 局部内容
# from test_package.package_module1 import data
# from test_package import package_module1
import test_package.package_module1
print(test_package.package_module1.data)
常用的模块:
sys:python解释器相关
os:operation system 和操作系统相关的
random:随机数
time:时间
json:和json数据格式相关的
import sys
# 带v的意思: variable: 变量
print(sys.platform) #系统所在的平台是win32
print(sys.version) # python解释器的版本
print(sys.modules) # 当前有哪些模块
sys.path: 里面存放的是搜索模块的路径:
假设你导入 spam 模块时,解释器首先查找名为 spam 的内置模块;如果没找到,解释器再从 sys.path 变量中的目录列表里查找 spam.py 文件。
sys.path 初始化时包含以下位置:
输入脚本的目录(或未指定文件时的当前目录)。
PYTHONPATH (目录列表,与 shell 变量 PATH 的语法一样)。
The installation-dependent default
['D:\\lwz_data\\openlab\\20211010Python_code',
'E:\\learningSoftware\\pythonSoftware\\python_interpreter\\python39.zip',
'E:\\learningSoftware\\pythonSoftware\\python_interpreter\\DLLs',
'E:\\learningSoftware\\pythonSoftware\\python_interpreter\\lib',
'E:\\learningSoftware\\pythonSoftware\\python_interpreter',
'E:\\learningSoftware\\pythonSoftware\\python_interpreter\\lib\\site-packages'
, 'E:\\learningSoftware\\pythonSoftware\\PyCharm
2018.3.7\\helpers\\pycharm_matplotlib_backend']
print(sys.path) # python模块的搜索路径: 先后顺序的
print(sys.api_version) #1013
D:\>python sys_test.py 111 222
['sys_test.py', '111', '222']
sys_test.py 111 222
传入了三个参数: 第一个参数其实就是我们.py文件名,第二个参数是111, 第三个参数是222,我们将语句放在linux上去执行的时候,你就可以使用sys来判断你传入的参数
print(sys.argv) # 代表使用python.exe usual_module.py的时候传入的参数
# 是一个列表
sys.exit(0) # 退出
# 退出码是0: 执行成功
# 退出码是1: 执行的时候遇到了错误
# 退出码是-1: 手动停止程序
random:随机数
import random
随机小数---random():
x in the interval [0, 1): 代表随机的数字在 0 =< x < 1
如果想输出其他随机小数是,要乘以倍数
random.random()*10
随机整数---randint(a, b):
Return random integer in range [a, b]: 返回一个随机整数:[a, b]
choice(seq):
Choose a random element from a non-empty sequence.
# 从不为空的序列中选择一个随机的元素
choices(self, population, weights=None, *, cum_weights=None, k=1)
Return a k sized list of population elements chosen with replacement
# 返回一个k大小的列表
# weights: 权重, 权重大的选中的几率高一些
# cum_weights: 累加权重
取样:def sample(self, population, k, *, counts=None):
Chooses k unique random elements from a population sequence or set
选择k个唯一的随机元素从取样的序列或者集合中
sample(['red', 'blue'], counts=[4, 2], k=5)==sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
def randrange(self, start, stop=None, step=1):
Choose a random item from range(start, stop[, step])
# 选择一个随机的条目从range()
代码示例:
import random
print(random.random())
print(random.random()*10)
print(random.randint(0, 100))
print(random.choice([4, 5, 6]))
print(random.choices([4, 5, 6, 7, 8], cum_weights=[1, 2, 3, 4, 5], k=2))
print(random.sample([4, 5, 6, 7, 8], k=2))
print(random.randrange(1, 10))
# for i in range(1, 10)
输出结果:
json:一种数据格式
现在在web中比较流行一种传输数据的方式
示例:在编程中,别人给你提供了一个接口:get_students_by_classno(classno),我们可以根据班级编号来获取学生信息,数据格式就可以是我们json格式,和我们字典比较像,分为两种:
第一种:将python对象,转换成json格式的数据
第二种:将json格式的数据,转换成python对象
代码示例:
import json
dict_data = {1: 2, 2: 3}
# json.loads()
data = json.dumps(dict_data)
# 把一个字典转换成一个json格式的字符串
print(data, type(data))
# 把一个json格式的字符串转换成一个python中的字典对象
dict_data2 = json.loads(data)
print(dict_data, type(dict_data))
输出结果:
time:和时间相关的
一个关于时间的模块,可以用于格式化时间
代码示例:
import time
print(time.localtime())
print(time.gmtime())
#1635564740.366917
data = time.time()
print(data)
time.sleep(2)
print(time.time() - data)
# 睡眠: 单位是秒
# time.sleep()
# time.gmtime()
print(time.timezone) # 东八区, UTC + 8
#-28800 =》 28800是一个秒数 =》 小时是8
# 指定一个时间格式然后去输出
# strftime(format[, tuple]) -> string
# 输入的是一个a time tuple
print(time.strftime("%Y-%m-%d, %H:%M:%S, %j, %W, %w, %Z, %z", time.localtime()))
# time.asctime()
# 默认展示当前时间的格式:Sat Oct 30 11:43:32 2021
print(time.ctime())
# time.mktime()
输出结果:
OS
主要是和操作系统进行交互,访问目录以及文件的操作
import os
# 输出当前系统的操作系统类型
print(os.name)
# 输出当前目录
print(os.curdir)
# 列出所有的文件和目录, 默认是输出当前工作路径下的所有文件
print(os.listdir())
#查看环境变量
print(os.environ)
#查看当前目录
print(os.getcwd())
#打印系统目录下的内容
print(os.system("dir"))
print(os.mkdir()) #创建目录
print(os.rmdir()) #删除目录
# 最常用的os模块中接口: 类似windows中的资源管理器: 创建文件,查看,删除
# 应用场景:列出某个目录下所有的文件
#查看命令帮助
help(os.listdir)
#输出当前工作目录
print(os.getcwd())
os.chdir("C:\\test")
print(os.getcwd())
print(os.listdir())
print(os.listdir("C:\\test"))
print(os.cpu_count())
# print(os.path)
# current directory: 当前的目录
print("*" * 80)
print(os.path.curdir)
# split: 分割: 分割前边的路径和最后一个文件或目录
print(os.path.split("C:\\test\\test2"))
# 合并两个路径 d: test => d:\test
print(os.path.join("C:\\test", "sys_test.py"))
# 判断你给的这个路径是否是一个目录
print(os.path.isdir("C:\\test\sys_test.py"))
# 判断你给定的路径是否是一个文件
print(os.path.isfile("C:\\test\sys_test.py"))
# absolute path: 绝对路径
print(os.path.abspath("."))
# 给定的路径是否存在
print(os.path.exists("C:\\20211010"))
# 目录名
print(os.path.dirname("C:\\test\sys_test.py"))
# 获取文件大小 4096B 单位一定是字节
print(os.path.getsize("C:\网络拓扑图"))
输出结果:
我这里没有utf-8编码导致一些乱码