第七章:python模块

第七章 python模块

一、模块是什么?

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

举个例子:

# my_modeule.py
def func(a,b):
    print(a,b)
func(1,9)

这就是一个简单的模块。

1.1 模块的四种形式

1、一个py文件就是一个模块
2、一个包含有__init__.py文件的文件夹也是一个模块,称之为包     
3、已被编译为共享库或DLL的C或C++扩展
4、使用C编写并链接到python解释器的内置模块

1.2 模块的三种来源

1、python自带的
2、第三方的
3、自定义

二、为何使用模块?

1、拿来主义,提升开发效率
2、把自己程序中各部分组件要重复使用的功能放到一个模块中,然后通过导入的方式使用可以达到减少代码冗余

三、如何使用模块?

下面用摄氏度和华氏度之间进行转换做一个演示。

3.1 方法一:import语句

案例一

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 19:43
# @Author:吴常文
# @File: temperature


def c2f(cel):
    fah = cel * 1.8 + 32
    return fah


def f2c(fah):
    cel = (fah - 32)/1.8
    return cel
# test.py
import temperature

print("32摄氏度 = %.2f华氏度" % temperature.c2f(32))
print("99华氏度 = %.2f摄氏度" % temperature.f2c(99))

案例二

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 12:02
# @Author:吴常文
# @File: test


import my_module    # 文件名叫my_module.py,模块名叫my_module

# 首次导入模块发生的事情
# 1、创建一个模块的名称空间
# 2、运行模块文件内的代码,然后将运行过程中产生的名字都丢到模块的名称空间中
# 3、在当前名称空间中产生一个名字spam,该名字指向模块的名称空间

# 注意:一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。之后的导入都是在直接引用内存中已经创造好的模块空间,不会重复执行文件、重复创建名称空间
import my_module
import my_module
import my_module
import my_module
import my_module

spam.py

# spam.py
print('from the spam.py')
__all__ = ['money', 'read1', 'read2']
money = 1000


def read1():
    print('spam模块read1:', money)


def read2():
    print('spam模块read2: ')
    read1()


def change():
    global money
    money = 0

test.py

import spam

money = 2000

print(money)
print(spam.money)
print(spam.read1)
print(spam.read2)
print(spam.change)

多行导入多个模块

import my_module
import spam
import os
import time
import sys

print(sys.path)
time.sleep(3)
print(os.path)

一行导入多个模块

import sys,time,os
print(sys.path)
time.sleep(3)
print(os.path)

为导入的模块起别名

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 12:01
# @Author:吴常文
# @File: my_module


def func(a,b):
    print(a,b)


func(1,9)
# test.py
import module1 as m1


print(m1.a)
print(m1.b)
print(m1.c)

# 注意:import导入的名字要作为前缀

3.2 方法二:from … import …

案例一

temperature.py

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 19:43
# @Author:吴常文
# @File: temperature


def c2f(cel):
    fah = cel * 1.8 + 32
    return fah


def f2c(fah):
    cel = (fah - 32)/1.8
    return cel

test.py

from temperature import c2f,f2c

print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))

3.3 import … as …

上面已经对起别名做了讲解,这里再提一下。

temperature.py

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 19:43
# @Author:吴常文
# @File: temperature


def c2f(cel):
    fah = cel * 1.8 + 32
    return fah


def f2c(fah):
    cel = (fah - 32)/1.8
    return cel

test.py

import temperature as tc

print("32摄氏度 = %.2f华氏度" % tc.c2f(32))
print("99华氏度 = %.2f摄氏度" % tc.f2c(99))

注意:当模块名比较长,调用比较麻烦,这时为模块名起别名可以提高写代码的效率。

四、循环导入

m1.py

print('正在导入m1')

def f1():
    from m2 import y,f2
    print(y)
    f2()

x='m1'

m2.py

print('正在导入m2')

def f2():
    from m1 import x
    print(x)
y='m2'

run.py

import m1

m1.f1()

五、区分一个py文件的两种用途

run.py

import spam

span.py

def f1():
    print('from f1')


def f2():
    print('from f2')


print(__name__)
if __name__ == "__main__":  # 被当做程序执行
    f1()
    f2()
else:  # 文件被当做模块导入要执行的代码
    pass


if __name__ == '__main__':
    pass

六、模块的搜索路径

6.1模块搜索路径的顺序

# 模块其实就是一个文件,如果要执行文件,首先就需要找到模块的路径(某个文件夹),如果模块的文件路径和执行文件不在同一个文件的目录下,我们就需要指定文件的路径。
# 模块的搜索路径指的是在导入模块时需要检索的文件夹。
# 导入模块时查找模块的顺序是:
# 1.先从内存中已经导入的模块中寻找
# 2.内置的模块
# 3.环境变量sys.path中查找

案例一

test.py

import sys
print(sys.path)  # 这里的第一个路径是当执行文件所在的文件夹
'''
D:\Python38\python.exe D:/new_llearn/test.py
['D:\\new_llearn',
 'D:\\new_llearn', 
 'D:\\PyCharm 2020.1\\plugins\\python\\helpers\\pycharm_display',
  'D:\\Python38\\python38.zip', 
'''

案例二

spam.py

#!/user/bin/python3
# --*--coding: utf-8 --*--
# @Time: 2021/2/14 20:41
# @Author:吴常文
# @File: spam

def f1():
    print('from f1')


def f2():
    print('from f2')


# print(__name__)
# if __name__ == "__main__":  # 被当做程序执行
#     f1()
#     f2()
# else:  # 文件被当做模块导入要执行的代码
#     pass


if __name__ == '__main__':
    pass

test.py

import spam
spam.f1()

import time
time.sleep(3)

import spam
spam.f1()

案例三

aaa/bbb/spam.py

def f1():
    print('from f1')


def f2():
    print('from f2')


print(__name__)
if __name__ == "__main__":  # 被当做程序执行
    f1()
    f2()
else:  # 文件被当做模块导入要执行的代码
    pass


if __name__ == '__main__':
    pass

test.py

import aaa.bbb.spam as abs
# aaa.bbb.spam.f1()
abs.f1()

from aaa.bbb import spam
spam.f1()

案例四

aaa/bbb/spam.py

def f1():
    print('from f1')


def f2():
    print('from f2')


print(__name__)
if __name__ == "__main__":  # 被当做程序执行
    f1()
    f2()
else:  # 文件被当做模块导入要执行的代码
    pass


if __name__ == '__main__':
    pass

test.py

import sys
sys.path.append(r"D:\new_llearn\aaa\bbb")
import spam
spam.f1()

sys.path.append(r"D:\new_llearn\aaa")
import bbb.spam
bbb.spam.f1()

from bbb import spam
spam.f1()

七、序列化模块

7.1 什么是序列化?

把内存中的数据类型转换成一个专门的格式

# 序列化
内存中的数据类型------------>json格式=============》json格式的字符串
内存中的数据类型------------>pickle格式格式========》pickle格式的bytes

# 反序列化
内存中的数据类型<------------<json格式=============<json格式的字符串
内存中的数据类型<-----------<pickle格式格式========<pickle格式的bytes


json  VS pickle
json格式能够被所有编程语言识别,不能序列化所有的python数据类型
pickle格式只能被python识别,但是它能序列化所有python数据类型

7.2 为什么要序列化?

1、数据的持久化=>存档
    json
    pickle

2、跨平台数据交互=》json

7.3 如何序列化?

序列化
    dumps
    dump

反序列化
    loads
    load

json

import json

# dumps和loads
# 序列化
dic = {
    
    'name':'wuchangwen','age':18.0,'sex':None,'is_ok':True}
res = json.dumps(dic)
print(res,type(res))   # {"name": "wuchangwen", "age": 18.0, "sex": null, "is_ok": true} <class 'str'>
# res1=json.dumps({1,2,3,45})  # json不识别集合类型
# print(res1,type(res1))

with open('a.json','wt',encoding='utf8') as f:
    f.write(res)

# 反序列化
with open('a.json','rt',encoding='utf8') as f:
    data_json = f.read()

    dic = json.loads(data_json)
    print(dic["name"])   # wuchangwen



# dump与load
# 序列化
dic={
    
    'name':'egon','age':23.0,'sex':None,'is_ok':True}

with open('a.json',mode='wt',encoding='utf-8') as f:
    json.dump(dic,f)

# 反序列化
with open('a.json',mode='rt',encoding='utf-8') as f:
    dic=json.load(f)
    print(dic,type(dic))

pickle

import pickle

# dumps和loads
# 序列化
dic = {
    
    'name':'wuchangwen','age':18.0,'sex':None,'is_ok':True}
res = pickle.dumps(dic)
# print(res,type(res))   # b'\x80\x04\x958\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\nwuchangwen\x94\x8c\x03age\x94G@2\x00\x00\x00\x00\x00\x00\x8c\x03sex\x94N\x8c\x05is_ok\x94\x88u.' <class 'bytes'>
# res1=pickle.dumps({1,2,3,45})  # pickle可以识别所有python类型
# print(res1,type(res1))   # b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K-\x90.' <class 'bytes'>

with open('a.pkl','wb') as f:
    f.write(res)

# 反序列化
with open('a.pkl','rb') as f:
    data_json = f.read()

    dic = pickle.loads(data_json)
    print(dic["name"])   # wuchangwen

了解

import ujson
import json

json.dumps=ujson.dumps
json.loads=ujson.loads

八、常用模块

常用模块点击链接 查看更多

作者:吴常文
出处:https://blog.csdn.net/qq_41405475
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

猜你喜欢

转载自blog.csdn.net/qq_41405475/article/details/113779599