加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python:序列与模块

发布时间:2020-12-17 00:00:50 所属栏目:Python 来源:网络整理
导读:一,序列化模块 什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做 序列化 。 序列化的目的 ; 1,json模块 Json模块提供了四个功能:dumps、dump、loads、load 1)dumps和loads dic = {1: ,2: = json.dumps(dic) dic_d = json.loads(st

一,序列化模块

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

序列化的目的

1,json模块

Json模块提供了四个功能:dumps、dump、loads、load

1)dumps和loads

dic = {1:,2:= json.dumps(dic) dic_d = json.loads(str_d) {1: 'a',2: 'b'} {"1": "a","2": "b"} {'1': 'a','2': 'b'}

2)dump与load

dic = {1:,2:= open(,,encoding== open(= {'2': 'b','1': 'a'}

3)dumps、loads与dump、load的区别

?

4)ensure_ascii关键字参数

= open(,:= json.dumps({:+:},f,ensure_ascii== json.dumps({:},ensure_ascii=+

5)json格式化输出

= {:[,],:,:16= json.dumps(data,sort_keys=True,indent=2,separators=(,),ensure_ascii=(json_dic2)

2,pickle

? ? #所有的python中的数据类型都可以转化成字符串形式
? ? #pickle序列化的内容只有python能理解
? ? #且部分反序列化依赖python代码
? ? #可以分步dump和分步load
pickle模块提供了四个功能:dumps、dump、loads、load
1)pickle 的dumps和loads
= {:,:,:=(str_dic) =(dic2)

2)分步dump与load

dump和load必须用wb和rb打开

= time.localtime(1000000000= time.localtime(2000000000= open(,= open(,==

3,shelve

? ? #序列化句柄
? ? #使用句柄直接操作,非常方便
shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些
shelve,open方法获取一个文件句柄,操作和字典类似。是用key来访问的,使用起来和字典类似。
= shelve.open(] = {:10,:9.5,:} f.close()
= shelve.open(= f1[] (existing)

二、模块

1,什么是模块?

一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

2,import加载的模块分为四个通用类别:

  1 使用python编写的代码(.py文件)

  2 已被编译为共享库或DLL的C或C++扩展

  3 包好一组模块的包

  4 使用C编写并链接到python解释器的内置模块

3,import

(money=1000

<span style="color: #0000ff">def<span style="color: #000000"> read1():
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">my_module->read1->money<span style="color: #800000">'<span style="color: #000000">,money)

<span style="color: #0000ff">def<span style="color: #000000"> read2():
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">my_module->read2 calling read1<span style="color: #800000">'<span style="color: #000000">)
read1()

<span style="color: #0000ff">def<span style="color: #000000"> change():
<span style="color: #0000ff">global<span style="color: #000000"> money
money=0

模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

my_module <span style="color: #800000">'''<span style="color: #800000">
执行结果:
from the my_module.py
<span style="color: #800000">'''

<span style="color: #008000">#
<span style="color: #008000">调用了多次但是只打印了一个结果

我们可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

2)每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

=10 <span style="color: #800000">'''<span style="color: #800000">
执行结果:
from the my_module.py
<span style="color: #800000">'''

3)测试二:read1与my_module.read1不冲突

# ((<span style="color: #800000">'''<span style="color: #800000">
执行结果:
from the my_module.py
my_module->read1->money 1000
<span style="color: #800000">'''

4)测试三:执行my_module.change()操作的全局变量money仍然是my_module中的

=1<span style="color: #800000">'''<span style="color: #800000">
执行结果:
from the my_module.py
<span style="color: #800000">'''

5)

总结:首次导入模块my_module时会做三件事:

1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

2.在新创建的命名空间中执行模块中包含的代码,见初始导入import?my_module

事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放入模块全局名称空间表,用globals()可以查看

3.创建名字my_module来引用该命名空间

1 这个名字和变量名没什么区别,都是‘第一类的’,且使用my_module.名字的方式可以访问my_module.py文件中定义的名字,my_module.名字与test.py中的名字来自两个完全不同的地方。

6)为模块名起别名,相当于m1=1;m2=m1

(sm.money)

示范用法一:

有两中sql模块mysql和oracle,根据用户的输入,选择不同的sql功能

( (<span style="color: #008000">#<span style="color: #008000">test.py
db_type=input(<span style="color: #800000">'
<span style="color: #800000">>>:
<span style="color: #800000">'
<span style="color: #000000">)
<span style="color: #0000ff">if
db_type == <span style="color: #800000">'
<span style="color: #800000">mysql
<span style="color: #800000">'
<span style="color: #000000">:
<span style="color: #0000ff">import
<span style="color: #000000"> mysql as db
<span style="color: #0000ff">elif
db_type == <span style="color: #800000">'
<span style="color: #800000">oracle
<span style="color: #800000">'
<span style="color: #000000">:
<span style="color: #0000ff">import<span style="color: #000000"> oracle as db

db.sqlparse()
复制代码

4,from ... import...

my_module read1,read2这样在当前位置直接使用read1和read2就好了,执行时,仍然以my_module.py文件全局名称空间
demo = 200
my_module =1000read1->money 1000

<span style="color: #008000">#<span style="color: #008000">测试二:导入的函数read2,执行时需要调用read1(),仍然回到my_module.py中找read1()<span style="color: #008000">

<span style="color: #008000">demo.py

<span style="color: #0000ff">from my_module <span style="color: #0000ff">import<span style="color: #000000"> read2
<span style="color: #0000ff">def<span style="color: #000000"> read1():
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">==========<span style="color: #800000">'<span style="color: #000000">)
read2()

<span style="color: #800000">'''<span style="color: #800000">
执行结果:
from the my_module.py
my_module->read2 calling read1
my_module->read1->money 1000
<span style="color: #800000">'''

如果当前有重名read1或者read2,那么会有覆盖效果

my_module (

需要特别强调的一点是:python中的变量赋值不是一种存储操作,而只是一种绑定关系,如下:

my_module =100 (money) read1()

<span style="color: #800000">'''<span style="color: #800000">
from the my_module.py
my_module->read1->money 1000
<span style="color: #800000">'''

1)as

也支持as

my_module read1 as read

2)也支持多行输入

my_module

我们可以通过模块的全局变量__name__来查看模块名:当做脚本运行:__name__ 等于'__main__'

当做模块导入:__name__=?模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑if __name__ == '__main__':

= 0,1 b <(b,end= = b,a+<span style="color: #0000ff">if <span style="color: #800080">name == <span style="color: #800000">"<span style="color: #800000">main<span style="color: #800000">"<span style="color: #000000">:
<span style="color: #0000ff">print
(<span style="color: #800080">name
<span style="color: #000000">)
num
= input(<span style="color: #800000">'
<span style="color: #800000">num :<span style="color: #800000">'<span style="color: #000000">)
fib(int(num))

python解释器在启动时会自动加载一些模块,可以使用sys.modules查看

在第一次导入某个模块时(比如my_module),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用

如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。

所以总结模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。

模块总结:

1,import和from import都支持as重命名,都支持多名字的导入

2,一个模块被import导入之后,并不会再次被导入。因为sys.mouldes记录了所有被导入的模块

3,sys.path记录了导入模块的时候寻找的所有路径

?4,模块就是一个py文件

?5,__all__必须与*连用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读