python:序列与模块
一,序列化模块 什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。 序列化的目的 ;
![]() Json模块提供了四个功能:dumps、dump、loads、load 1)dumps和loads
dic = {1:,2:= json.dumps(dic)
dic_d = json.loads(str_d)
{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">def<span style="color: #000000"> change(): 模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入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"> 如果当前有重名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__必须与*连用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |