1.什么是模块?
- 在Python中一个后缀名为 .py 的Python文件就是一个模块
- 模块中可以定义函数、类等
- 模块也可以避免函数、类、变量等名称相冲突的问题
- 模块不仅提高了代码的可维护性,同时还提高了代码的可重用性
- 在给模块命名的时候要求全部使用小写字母,多个单次之间使用下划线进行分隔
- 如果自定义模块名称的与系统内置模块名称相同,那么在导入时会优先导入自定义的模块
(就和Java中导入一个类是一个概念)
1.1 自定义模块
新建 python 文件 my.info.py
name='Jarvis'
def info():
print(f'大家好我叫{name}')
这样一个自定义模块就定义好了
1.2 模块的导入
import my_info
print(my_info.name)
my_info.info()
模块起别名
import my_info as a
print(a.name)
a.info()
from…import 方式
from my_info import name # 导入的事一个具体的变量的名称
print(name)
from my_info import info # 导入的事一个具体的函数的名称
info()
通配符
from my_info import *
print(name)
info()
同时导入多个模块
import math,time,random
如果两个模块,具有相同的函数和变量?
那么后导入的模块会覆盖先导入的模块!!
我们来看测试:
再新建一个模块: introduce.py
name='zhangsan'
age=18
def info():
print(f'姓名:{name},年龄:{age}')
这里面的方法 info 、属性name 和 之前的 my_info 一样
from my_info import *
from introduce import *
#导入模块中具有同名的变量和函数,后导入的会将之间导入的进行覆盖
info()
运行结果:
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\示例10-4模块的导入.py
姓名:zhangsan,年龄:18
后导入的那个模块的内容,就覆盖掉了先导入的
如果不想覆盖,解决方案,可以使用 import
使用模块中的函数或变量时,模块名打点调用
import my_info
import introduce
# 使用模块中的函数或变量时,模块名打点调用
my_info.info()
introduce.info()
运行结果:
大家好我叫Jarvis
姓名:zhangsan,年龄:18
2.Python中的 包
悬停在目录,鼠标右键-—new----Python Package
新建一个 admin 的包,就会出现一个 初始化文件
可以在 这个初始化文件写东西,也可以不写。
但我写了点儿,可以把这个包的版权内容写在里面
print('版权:Jarivs')
print('Java Senior Development Engineer')
在这个 admin 包里新建文件 my_admin.py
def info():
print('大家好,我叫Jarvis,今年25岁')
name='zhangsan'
2.1 包的导入
包名.模块名
import admin.my_admin as a # 包名.模块名 admin是包名, my_admin 是模块名
a.info()
运行结果:
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\示例10-7包的导入.py
版权:Jarivs
Java Senior Development Engineer
大家好,我叫Jarvis,今年25岁
可以看到 初始化文件里面的内容 也打印输出了,
所以包被导入的时候, init.py 文件里面的代码会被自动被调用执行
from 包名 import模块 as 别名
from admin import my_admin as b # from 包名 import模块 as 别名
b.info() # __init__里面的方法就不会再执行了,只会执行一次
运行结果:
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\示例10-7包的导入.py
版权:Jarivs
Java Senior Development Engineer
大家好,我叫Jarvis,今年25岁
--------------------------------------------------------------------------------
大家好,我叫Jarvis,今年25岁
可以看到 init.py 文件里面的代码只会输出一次
from 包名.模块名 import 函数/变量
from admin.my_admin import info #from 包名.模块名 import 函数/变量 等
info()
运行结果:
大家好,我叫Jarvis,今年25岁
2.2 主程序运行
新建两个模块:
module_a:
print('welcome to Beijing')
name='Jarvis'
print(name)
新建 module_b,导入 module_a
# 导入的代码
import module_a
运行 module_b,可以看到直接就输出了 导入 module_a的内容
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\module_b.py
welcome to Beijing
Jarvis
如果不希望module_a 里面的内容不随着导入输出呢??
我们修改 module_a 里面的代码:
if __name__ == '__main__':
print('welcome to Beijing')
name = 'Jarvis'
print(name)
这个时候就发现 module_a 里面的代码不会随着 导入被运行
主程序运行的作用:能阻止全局变量的数据被输出执行
3.Python中常用的内置模块
这些模块在哪儿呢?我们可以找一下
去到我们Python解释器的安装位置的 目录:
右键打开文件位置
再鼠标悬停这个,再右键打开文件位置:
可以看到Lib目录
可以看到之前我们用到过的 random 模块
3.1 random模块
import random
# 设置随机数的种子
random.seed(10)
print(random.random()) # [0.0,1.0)
print(random.random()) #为什么多次运行,随机数结果是一样的呢?? 因为 种子 seed设置的值 相同
为什么多次运行,随机数结果是一样的呢?? 因为 种子 seed设置的值 相同!!
random.seed(10)
print(random.randint(1,100)) #[1,100]
print('-'*40)
for i in range(10): # [m,n) 步长为k, m-->start-->1 n-->stop-->10 k-->step -->
print(random.randrange(1,10,3)) #这行代码执行了 10 次
print('-'*40)
print(random.uniform(1,100)) #[a,b]随机小数
lst=[i for i in range(1,11)]
print(lst)
print(random.choice(lst)) # lst是列表,称为序列
print('-'*40)
#随机的排序
random.shuffle(lst)
print(lst)
3.2 time模块
import time
now = time.time()
print(now)
obj = time.localtime() # struct_time对象
print(obj)
obj2 = time.localtime(60) # 60秒 1970年,1月1日.8时.1分.0秒
print(obj2)
print(type(obj2)) # <class 'time.struct_time'>
print('年份:', obj2.tm_year)
print('月份:', obj2.tm_mon)
print('日期', obj2.tm_mday)
print('时:', obj2.tm_hour)
print('分:', obj2.tm_min)
print('秒', obj2.tm_sec)
print('星期', obj2.tm_wday) # [0,6] ,3 表示星期四,2表示的是星期三
print('今年的多少天', obj2.tm_yday)
print(time.ctime()) # 时间戳对应的易读的字符串 Tue Jan 16 10:04:01 2024
# 日期时间格式化
print(time.strftime('%Y-%m-%d', time.localtime())) # str -->字符串f -->format-->time时间
print(time.strftime('%H:%M:%S', time.localtime()))
print('%B月份的名称', time.strftime('%B', time.localtime()))
print('%A星期的名称', time.strftime('%A', time.localtime()))
# 字符串转成 struct_time
print(time.strptime('2008-08-08','%Y-%m-%d'))
time.sleep(10)
print('Hello World')
运行结果:
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\示例10-12time模块.py
1705384179.8378778
time.struct_time(tm_year=2024, tm_mon=1, tm_mday=16, tm_hour=13, tm_min=49, tm_sec=39, tm_wday=1, tm_yday=16, tm_isdst=0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=1, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
<class 'time.struct_time'>
年份: 1970
月份: 1
日期 1
时: 8
分: 1
秒 0
星期 3
今年的多少天 1
Tue Jan 16 13:49:39 2024
2024-01-16
13:49:39
%B月份的名称 January
%A星期的名称 Tuesday
time.struct_time(tm_year=2008, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=221, tm_isdst=-1)
3.3 datetime 模块
from datetime import datetime # 从datetime模块中 导入 datetime 类
dt=datetime.now()
print('当前的系统时间为',dt)
# datetime是一个类,手动创建这个类的对象
dt2=datetime(2008,8,8,20,8)
print('dt2的数据类型',type(dt2),'dt2表示的日期时间',dt2)
print('年:',dt2.year,'月:',dt2.month,'日:',dt2.day)
print('时:',dt2.hour,'分:',dt2.minute,'秒:',dt2.second)
# 比较两个 datetime类型对象的大小
labor_day=datetime(2028,5,1,0,0,0)
national_day=datetime(2028,10,1,0,0,0)
print('2028年5月1日比2028年10月1日早吗?',labor_day<national_day) # True
# datetime类型与字符串进行转换
nowdt=datetime.now()
nowdt_str=nowdt.strftime('%Y/%m/%d %H:%M:%S')
print('nowdt的数据类型:',type(nowdt),'nowdt表示的数据是什么?',nowdt)
print('nowdt_str:',type(nowdt_str),'nowdt_str表示的数据是什么?',nowdt_str)
# 字符串类型转成 datetime类型
str_datetime='2028年8月8日 20点8分'
dt3=datetime.strptime(str_datetime,'%Y年%m月%d日 %H点%M分')
print('str_datetime数据类型',type(str_datetime),'str_datetime表示的数据:',str_datetime)
print('dt3数据类型',type(dt3),'dt3表示的数据:',dt3)
运行结果:
D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap10\示例10-13datetime模块.py
当前的系统时间为 2024-01-16 13:53:45.963475
dt2的数据类型 <class 'datetime.datetime'> dt2表示的日期时间 2008-08-08 20:08:00
年: 2008 月: 8 日: 8
时: 20 分: 8 秒: 0
2028年5月1日比2028年10月1日早吗? True
nowdt的数据类型: <class 'datetime.datetime'> nowdt表示的数据是什么? 2024-01-16 13:53:45.963475
nowdt_str: <class 'str'> nowdt_str表示的数据是什么? 2024/01/16 13:53:45
str_datetime数据类型 <class 'str'> str_datetime表示的数据: 2028年8月8日 20点8分
dt3数据类型 <class 'datetime.datetime'> dt3表示的数据: 2028-08-08 20:08:00
timedelta类
from datetime import datetime
from datetime import timedelta
# 创建两个 datetime类型的对象
delta1=datetime(2028,10,1)-datetime(2028,5,1)
print('date1的数据类型:',type(delta1),'delta1所表示的数据',delta1)
print('2028年5月1日之后的153天是:',datetime(2028,5,1)+delta1)
# 通过传入参数的方式创建一个 timedelta对象
td1=timedelta(10)
print('创建一个10天的timedelta对象',td1)
td2=timedelta(10,11)
print('创建一个10天11秒的timedelta对象',td2)