#什么是模块 # #模块的导入方法# #包和模块的区别#
严格来说,Python中没有库(library)的概念,模块(module)和包(package)才是Python语法中有的概念。这个库的概念是从其他编程语言引进来的,库的概念是具有相关功能模块的集合,只是一个通俗的说法。平时说的库既可以是一个模块,也可以是一个包。
1.模块和包
1.1 模块和包的概念与区别
- 模块:python模块(Module), 是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数、类和变量,模块也能包含可执行的代码。
- 包:包(package)将有联系的模块(Module)组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字 为 init.py 文件,那么这个文件夹就称之为包。
1.2 模块的导入方法
- import 模块名
- from 模块名 import 功能名
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
1.3 导入模块的注意事项
1.3.1 同名功能导入顺序
- ⾃⼰的⽂件名不要和已有模块名重复,否则导致模块功能用法使用
- 如果使用 from … import … 或 from … import * 导入多个模块的时候,且模块内有同名功能。当调 ⽤这个同名功能的时候,调用到的是后导入的模块的功能。
1.3.2 模块的搜索顺序
模块搜索路径存储在system模块的sys.path变量中。变量包含当前目录、PYTHONPATH和由安装过程决定的默认目录。当导入一个模块,Python解析器对模块位置的搜索顺序是:
- 当前目录
- 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径⼀般为/usr/local/lib/python/
1.3.3 __all__变量
如果⼀个模块⽂件中有 __all__ 变量,当使⽤ from xxx import * 导⼊时,只能导⼊这个列表中的元素。否则,会报错。
# 文件命名test1
__all__ = ['testA']
def testA():
print('testA')
def testB():
print('testB')
# 此为test2文件
from test1 import *
testA()
testB()
执行结果
1.4 制作模块
在Python中,每个Python⽂件都可以作为⼀个模块,模块的名字就是⽂件的名字。也就是说⾃定义模块名必须要符合标识符命名规则——模块推荐使用小写字母命名;尽量不要使用下划线,除非有很多字母。
新建一个python文件,命名为test1,并在里面写一个函数,在test2.py中去调用test1
# -*- coding:utf-8 -*-
# 文件命名test1
def func(a,b):
print(a+b)
class Func(object):
def __init__(self,a,b):
self.a = a
self.b = b
def func_demo(self):
print(self.a+self.b)
# -*- coding:utf-8 -*-
# 文件命名test2
import test1
test1.func(2,3)
test1.Func(1,3).func_demo()
test2.py执行结果
1.5 制作包
[New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会自动创建 init.py 文件,这个文件控制着包的导入。
1.6 导入包的方法
1.6.1 方法一
导入包: import 包名.模块名
调用方法:包名.模块名.⽬标
1.6.2 方法二
注意:必须在 __init__.py ⽂件中添加 __all__ = [] ,控制允许导⼊的模块列表。
导入包: from 包名 import *
调用方法:模块名.⽬标
2.常用的python内置方法
2.1 时间模块
- time()浮点数的时间戳方式
- localtime()获取当前时间,从返回浮点数的时间戳方式向时间元组转换,只要将浮点数传递给如localtime之类的函数
- asctime()获取格式化的时间
- strftime()格式化日期,格式化形式为:2022-09-70 时:分:秒
- sleep()程序睡眠,单位s
注:python中时间日期格式化符号
年 | - %y 两位数的年份表示(00-99) - %Y 四位数的年份表示(0000-9999) |
月 | - %m 月份(01-12) |
日 | - %d 月内中的一天(0-31) |
时 | - %H 24小时制小时数(0-23) - %I 12小时制小时数(01-12) |
分 | - %M 分钟数(00-59) |
秒 | - %S 秒(00-59) |
import time
now_time0 = time.time()
now_time1 = time.localtime(time.time())
now_time2 = time.asctime(time.localtime(time.time()))
now_time3 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(now_time0)
print(now_time1)
print(now_time2)
print(now_time3)
time.sleep(5) # 等待5s
now_time4 = time.time()
now_time5 = time.localtime(now_time4)
now_time6 = time.asctime(now_time5)
now_time7 = time.strftime(now_time6)
print(now_time4)
print(now_time5)
print(now_time6)
print(now_time7)
执行结果
2.2 深浅拷贝
- 等号拷贝:相当于对于电脑中某个文件夹新建了一个快捷图标,快捷图标永远和原文件是一致的。
- copy()浅拷贝:相当于对于电脑中某个文件夹内部的所有子文件夹新建了快捷图标,放到新的文件夹中,所以内部子文件夹内数据会跟着原来文件的改变而改变。
- deepcopy()深拷贝:相当于对于电脑中某个文件夹用u盘拷贝了一个备份。所以原来电脑中文件夹内文件改变时,u盘的文件是不会变化的。
# 等号拷贝
print("等号拷贝---------------------------------------------")
list1 = ["张三", "李四", "王五", "赵六"]
list2 = list1
print(id(list1))
print(id(list2))
list1[1] = "麻花"
print(list1)
print(list2)
# copy浅拷贝
print("copy浅拷贝--------------------------------------------")
list1 = [1, 2, 3, 4, ['a', 'b', 'c']]
list2 = list1.copy()
print("列表1的ID:", id(list1))
print("列表2的ID:", id(list2))
print("修改元素之前:", list1)
print("修改元素之前:", list2)
print("列表1当中元素ID:", id(list1[4][0]))
print("列表2当中元素ID:", id(list2[4][0]))
list1[4][0] = "麻花"
print("修改元素之后:", list1)
print("修改元素之后:", list2)
# deepcopy深拷贝
from copy import deepcopy
print("deepcopy深拷贝--------------------------------------------")
list1 = ["张三", "李四", "王五", "赵六"]
list2 = deepcopy(list1)
print(id(list1))
print(id(list2))
print("列表1当中元素ID:", id(list1[1]))
print("列表2当中元素ID:", id(list2[1]))
list1[1] = "麻花"
print(list1)
print(list2)
执行结果