一,模块的定义,导入
1,定义:
用来从逻辑上组织python代码(变量,函数,类。 逻辑:实现一个功能),本质就是以.py结尾的python文件;
包:用来从逻辑上组织模块的,本质就是一个目录(必须带一个__init__.py文件)
2,导入方法
①导入一个模块:import name1(模块名)
②导入多个模块:import name1,name2,name3…
③from module import * (将所有的模块都导入,但是一般不建议这样做)
④from module import name1 as name1_1(给name1改了个名字为name1_1)
3,import本质
①导入模块的本质就是把python文件解释一遍;
②导入包的本质就是执行该包下的__init__.py文件
4,
a,标准库
b,开源模块(第三方库)
c,自定义模块(哈哈哈)
说了这么多,有没有云里雾里的感觉,gogogo!!!咱们在代码中进一步理解。
首先呢,我在同目录下创建另一个python文件,名为module_hpl,里面的内容如下:
"""
this is a simple module I wrote myself!!!
"""
name = "hpl"
def say_hello():
print("welcome to \033[31;1m%s\033[0m!!!" % name)
def logger():
print("this is a logger function!!!")
def running():
print("this is a running function!!!")
def fly():
print("this is a fly function!!!")
这就相当于我自定义了一个模块(说实话python真的👍)
import module_hpl # 导入模块
print(module_hpl.name)
module_hpl.say_hello()
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
hpl
welcome to hpl!!! # 这行中的hpl应显示为红色(下同)
Process finished with exit code 0
简单吧!!!
那假如我想导入module_hpl中的全部函数呢?
# from module_hpl import say_hello, running, fly, logger
from module_hpl import * # 这两种方式都阔以,但是建议上一行的那种方式
say_hello()
running()
fly()
logger()
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
welcome to hpl!!!
this is a running function!!!
this is a fly function!!!
this is a logger function!!!
Process finished with exit code 0
再看改名字:
from module_hpl import fly as fly_1 # 给fly改了个名叫fly_1
fly_1()
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
this is a fly function!!!
Process finished with exit code 0
这就相当于,刚出生你老爸给你起了个名叫fly,后来感觉叫你不方便,给你改了个名叫fly_1,也就是说,以后喊你就不能再叫fly了(即fly()失效了)。
所以说,导入模块的本质是把python文件解释一遍!!!
咱们再在同目录下建一个包,(注意:包里面自带__init__.py文件),名字叫package_test,然后在__init__.py文件里写上print(“this is a package_test!!!”)
再返回原来的python文件,进行导包
import package_test
运行结果为
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
this is a package_test!!!
Process finished with exit code 0
即,导入包的本质就是执行该包下的__init__.py文件
假如一个模块没有和运行文件在同目录下,像上面那样的导入还阔以调用里面的函数吗?答案肯定是不阔以(O(∩_∩)O)该如何解决这个问题呢?
我的运行文件是module.py,然后我在同目录下建了个test文件夹,在test文件下建了个module_test.py文件,module_test.py里的内容为:
"""
modules in non peer directory
"""
def dog():
print("this is a dog function!!!")
def cat():
print("this is a cat function!!!")
def fish():
print("this is a fish function!!!")
其实很简单,咱们阔以这样导入
from self_taught.Week_5.test.module_test import cat
cat()
看个例子:
from self_taught.Week_5.test.module_test import cat, dog
def siri():
cat()
print("Siri is a robot!!!")
def youyuo():
dog()
print("i love youyuo!!!")
siri()
youyuo()
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
this is a cat function!!!
Siri is a robot!!!
this is a dog function!!!
i love youyuo!!!
Process finished with exit code 0
哈哈,看着代码理解就是很容易!!!
二,一些内置模块
1,时间模块(time,datatime)
①
import time
print(time.time()) # 时间戳(表示从1970年1月1日00:00:00到当前时间所经历的秒数)
# 在开源领域,很多时间戳都是从1970开始,这又称作Unix时间戳,因为在1970年,Unix操作系统正式投入使用。
print(time.localtime()) # 结果为当前UTC+8时区,即中国北京时间元组
x = time.localtime()
print(x.tm_year) # 获取时间元组其中的年份
time.sleep(1) # 睡眠几秒
print(time.gmtime()) # 结果为UTC时区(结果为时间元组)
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 以固定的格式输出当前时间
print(time.strptime("2020-11-21 16:19:13", "%Y-%m-%d %H:%M:%S")) # 根据指定的格式把一个时间字符串解析为时间元组
print(time.ctime()) # 若不写默认为当前的时间
print(time.ctime(1222222222)) # 若写就是一个时间戳,返回对应的时间
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
1606188196.8753152
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=24, tm_hour=11, tm_min=23, tm_sec=16, tm_wday=1, tm_yday=329, tm_isdst=0)
2020
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=24, tm_hour=3, tm_min=23, tm_sec=17, tm_wday=1, tm_yday=329, tm_isdst=0)
2020-11-24 11:23:17
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=21, tm_hour=16, tm_min=19, tm_sec=13, tm_wday=5, tm_yday=326, tm_isdst=-1)
Tue Nov 24 11:23:17 2020
Wed Sep 24 10:10:22 2008
Process finished with exit code 0
②
import datetime
print(datetime.datetime.now()) # 获取当前的时间
print(datetime.datetime.now()+datetime.timedelta(3)) # 将当前的时间提前三天
print(datetime.datetime.now()+datetime.timedelta(-3)) # 将当前的时间退后三天
print(datetime.datetime.now()+datetime.timedelta(hours=5)) # 将当前的时间提前五小时
print(datetime.datetime.now()+datetime.timedelta(hours=-5)) # 将当前的时间退后五小时
print(datetime.datetime.now()+datetime.timedelta(minutes=5)) # 将当前的时间提前五分钟
print(datetime.datetime.now()+datetime.timedelta(seconds=-10)) # 将当前的时间退后十秒
a = datetime.datetime.now()
print(a.replace(minute=3, hour=2, month=1)) # 时间更改
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
2020-11-24 11:29:38.925504
2020-11-27 11:29:38.925504
2020-11-21 11:29:38.925504
2020-11-24 16:29:38.925504
2020-11-24 06:29:38.925504
2020-11-24 11:34:38.925504
2020-11-24 11:29:28.925504
2020-01-24 02:03:38.925504
Process finished with exit code 0
2,random模块
import random
print(random.random()) # 随机获取[0.0,1.0)之间的浮点数(即包括0.0,不包括1.0)
print(random.random())
print(random.random())
print(random.randint(1, 10)) # 随机获取[1,10]之间的整数(包含1,10)
print(random.randint(1, 10))
print(random.randint(1, 10))
print(random.randrange(1, 5)) # 随机[1,5)之间的整数(包含1但不包含5)
print(random.randrange(1, 5))
print(random.randrange(1, 5))
print(random.choice("hello")) # 随机抽取一个
print(random.choice([1, 2, 3, 4]))
print(random.sample("hello", 3)) # 随机从前面定义的字符串中取三位,输出为列表
print(random.sample("hello", 3))
print(random.sample("hello", 3))
print(random.uniform(1, 3)) # 在random.random之上增加了一个区间功能
print(random.uniform(1, 3))
print(random.uniform(1, 3))
list1 = [1, 2, 3, 4, 5, 6, 7] # 洗牌,即重新以任意顺序组合
random.shuffle(list1)
print(list1)
在看一个好玩的游戏
# 生成随机的验证码(数字和小写字母组合6位)
import random
checkcode = ""
for i in range(6):
current = random.randint(1, 6)
if current == i:
tmp = chr(random.randint(97, 122)) # 对应ASCII码中的小写字母位置
else:
tmp = random.randint(0, 9)
checkcode += str(tmp)
print(checkcode)
哈哈哈,相当的有意思!!!
3,os模块
import os
print(os.getcwd()) # 获取当前的操作目录
os.chdir("G:\Project1") # 切换目录
print(os.getcwd())
print(os.curdir) # 返回当前目录
print(os.pardir) # 返回上一级目录
"""
os.makedirs(r"D:a\b\c\d") # 递归创建目录(r为转义)
os.removedirs(r"D:a\b\c\d") # 若目录为空,则删除,并递归到上一级目录,如果也为空,则删除,依次类推
os.mkdir(r"D:\a") # 生成单级目录,即如果a不存在,就无法创建b
os.rmdir(r"D:\a") # 删除单机目录,若目录不为空则无法删除
print(os.listdir("D:"))
os.rename("oldname", "newname") # 重命名
print(os.stat("D:")) # 获取目录/文件信息
print(os.sep) # 输出操作系统特定的分隔符
print(os.linesep) # 换行
print(os.pathsep) # 输出分割文件路径的分隔符
print(os.name) #显示系统平台
print(os.environ) # 查看当前系统的环境变量
os.system("dir")
"""
print("<<<<<<<<--------------->>>>>>>>>")
print(os.path.abspath("module.py")) # 获取文件的绝对路径
print(os.path.split(r"D:\a\b\c\d.txt")) # 将路径和文件分隔开
print(os.path.dirname(r"D:\a\b\c.txt")) # 只取路径
print(os.path.basename(r"D:\a\b\c.txt")) # 只取文件
print(os.path.exists(r"D:\a\b\c")) # 判断输入的路径是否存在
print(os.path.isabs(r"D:\file")) # 判断是不是绝对路径
print(os.path.isfile(r"D:")) # 判断是否为文件
print(os.path.isdir(r"D:")) # 判断是否为目录
print(os.path.join(r"D:", r"\a.txt")) # 将多个路径组合返回
print(os.path.getatime(r"D:\file")) # 返回时间戳,是文件或者目录最后存储时间
print(os.path.getmtime(r"D:\file")) # 返回时间戳,是文件或者目录最后的修改时间
运行结果为
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
G:\Project1\self_taught\Week_5
G:\Project1
.
..
<<<<<<<<--------------->>>>>>>>>
G:\Project1\module.py
('D:\\a\\b\\c', 'd.txt')
D:\a\b
c.txt
False
True
False
True
D:\a.txt
1606122553.3054633
1605937640.044932
Process finished with exit code 0
(注:中间部分被注释的代码,看客可自运行查看)
4,sys模块
import sys
print(sys.argv) # 以list输出,打印程序本身路径
# sys.exit(0) # 无错误退出
# sys.exit(1) # 有错误退出
print(sys.version) # 获取python解释程序的版本信息
print(sys.path) # 返回模块的搜索路径,初始化使用pythonpath环境变量的值
运行结果为
G:\Python38\python.exe G:/Project1/self_taught/Week_5/module.py
['G:/Project1/self_taught/Week_5/module.py']
3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)]
['G:\\Project1\\self_taught\\Week_5', 'G:\\Project1', 'G:\\Python38\\python38.zip', 'G:\\Python38\\DLLs', 'G:\\Python38\\lib', 'G:\\Python38', 'G:\\Python38\\lib\\site-packages']
Process finished with exit code 0
sys模块中还有两个有意思的方法,我这里单独拿出来
import sys
import time
for i in range(100):
sys.stdout.write("*")
# flush()方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要被动的等待输出缓冲区写入。
# 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用flush()方法。
sys.stdout.flush()
time.sleep(0.25)
这段代码在先前的基础三(1)中已写到,就不再赘述。
5,shutil模块
先在同目录下创建三个文本文件,我这里分别为test1,test2,test3,其中test1中的内容为
My eyes are painted red
我的双眼被描绘成红色
The canvas of my soul
是我灵魂的写照
Is slowly breaking down, again
心再一次被慢慢撕碎
Today I heard the news
今天,我听到这个消息
The stories getting old
不过是老调重弹
When will we see the end?
我们何时才能看到出口?
Of the days, we bleed, for what we need
这些日子,我们为了想要的而流血受伤
To forgive, forget, move on
原谅,去忘记……继续前行
Cause we've got…
因为我们有...
One life to live
只能活一次的生命
One love to give
只能付出一次的爱
One chance to keep from falling
只有一次远离堕落的机会
One heart to break
只能破碎一次的心
One soul to take us
一颗拯救我们的灵魂
Not forsake us
而不是抛弃我们的
Only One
仅此唯一
Only One
仅此唯一
The writing's on the wall
那墙上的文字
Those who came before
是昔日过往者的印记
Left pictures frozen still, in time
遗留下来的照片仍然被冻结着,终有一天
You say you want it all
你说你想要一切
But whose side you fighting for?
但是你在为谁而战?
I sit and wonder why
我坐在那困惑着这是为什么
There are nights, we sleep, while others they weep
那些夜晚,我们睡着,而另一些人却在哭泣
With regret, repent, be strong
戴着遗憾,后悔,坚强起来
Cause we've got…
因为我们有...
One life to live
只能活一次的生命
One love to give
只能付出一次的爱
One chance to keep from falling
只有一次远离堕落的机会
One heart to break
只能破碎一次的心
One soul to take us
一颗拯救我们的灵魂
Not forsake us
而不是抛弃我们的
Only One
仅此唯一……
Only One
仅此唯一……
Just you and I
只要你和我
Under one sky…
在同一片天空下...
One life to live
无法重来的生命
One love to give
无法重来的爱
One chance to keep from falling
一次远离堕落的机会
One heart to break
只能破碎一次的心
One soul to take us
一颗拯救我们的灵魂
Not forsake us
而不是抛弃我们的
Only One
仅此唯一……
Only One
仅此唯一……
to take us
拯救我们
Not forsake us
而不是抛弃我们
Only One
仅此唯一
import shutil
# f1 = open("test1", "r", encoding="utf-8")
# f2 = open("test2", "w", encoding="utf-8")
with open("test1", "r", encoding="utf-8") as f1:
with open("test2", "w", encoding="utf-8") as f2:
shutil.copyfileobj(f1, f2) # 复制功能
# f1.close()
# f2.close()
然后test1中的内容就被拷贝到了test2中(上面的两种方法都阔以),这就是复制功能
import shutil
shutil.copyfile("test2", "test3") # 复制文件(相对上一个来说,这个copy更easy)
shutil.copy("test2", "test3") # 复制文件及权限
shutil.copy2("test2", "test3") # 复制文件及状态信息
# 递归复制文件或目录
shutil.copytree("Old file or directory name", "New file or directory name")
# 递归删除文件
shutil.rmtree("a file or directory name")
shutil.move() # 移动文件
shutil.make_archive("package_test", "zip") # 压缩文件
shutil对压缩包的处理实际是在调用zipfile和tarfile两个模块来进行的
import zipfile
z = zipfile.ZipFile("hahah.zip", "w") # 前面为要压缩的文件名及要压缩为那种格式
z.write("test1") # 压缩
z.close()
tarfile和zipfile操作相似
6,shelve模块
# 写入
import datetime
import shelve
d = shelve.open("shelve_test") # 打开一个文件
info = {"age": 18, "job": "student"} # 添加字典
name = ["hpl", "rain", "test"] # 添加列表
d["info"] = info
d["name"] = name
d["date"] = datetime.datetime.now()
d.close()
然后运行后发现pycharm的左边同目录下多出了三个不明文件
得,这可能是shelve有一套自己的编码格式吧!但只需明白内容已经被写入就妥了
下面我们来将写入的内容再读出来
# 读出
import shelve
d = shelve.open("shelve_test") # 打开一个文件
# d.items() # 全部读出来
print(d.get("name"))
print(d.get("info"))
print(d.get("date"))
G:\Python38\python.exe G:/Project1/self_taught/Week_5/calculator.py
['hpl', 'rain', 'test']
{'age': 18, 'job': 'student'}
2020-11-24 20:29:33.896431
Process finished with exit code 0
look,是不是被一股劲的读出来了!!!
好了,这周的学习内容就到此为止,望各位看客大佬发现有不足或错误能留言相告,臣不胜感激!!!