模块:
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

使用模块有什么好处?
最大的好处是大大提高了代码的可维护性。
其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

模块一共三种:
python标准库
第三方模块
应用程序自定义模块

#模块
calculate :
print('ok')
x=9
def add(x,y):
return x+y

def sub(x,y):
return x-y

# import sys
# import calculate #解释器通过搜索路径找到calculate.py 后将calculate.py里面所有的代码解释一遍
# #print(calculate.add(1,2))
#
# #搜索路径:sys.path
# print(sys.path)
# print(calculate.x)
#
# from calculate import add,sub #调用某一个函数
# print(add(8,9))
# print(sub(8,2))
# print(calculate.x)
#
# from calculate import * #所有的方法和变量都引入,如果本地和引入的模块函数重名,则应#看执行顺序
# def add(x,y):
# return x+y+1
# print(add(1,5)) #7
#
# from calculate import as plus #更改名字

#包 package 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
#包是组织模块的,模块是组织函数的
#import web.logger 不正确的调用方式
#logger.logger() name 'logger' is not defined
#from web import logger 错

# from web import logger #正确
# logger.logger()

# from web.web2 import logger #import 后面是一个模块
# logger.logger() #正确的

# from web.web2.logger import logger
# logger() #正确

# import web.web2.logger name 'logger' is not defined
# logger() #错误

#总结:包与包之间的调用,from package import module或者from module import functiom

引入一个包执行代码时是执行_init_文件,这个包中其他的文件无法执行
# import web #执行了_init_文件
# print(web.main.x) #报错
引入包中的文件才可以调用
from web import main
print(main.x)
===============================================================================
if __name__=='__main__': #加了这句测试代码就不再执行
只有在本代码中执行print(__name__)才会打印__main__,在其他代码中引入该模块会打印那个模块的名称。

eval

  功能:将字符串str当成有效的表达式来求值并返回计算结果。
================================================================================
json和pickle及shelve:

dic=str({'name':'lili'})
f=open('filename','w')
f.write(dic)

f=open('filename','r')
data=f.read()
#print(data['name']) #用eval()来转换为字典
print(eval(data)['name'])

#序列化:把对象(变量)从内存中变成可存储或传输的过程称之为序列化
#json 不能序列化函数和类
import json
dic={'name':'alex','age':'29'}
data=json.dumps(dic)
f=open('jsontest','w')
f.write(data)
f.close()
#将原来的类型转换回来
f=open('jsontest','r')
data=f.read()
data=json.loads(data)
print(data['name'])
f.close()

def foo():
print('ok')

#data=json.dumps(foo) #Object of type 'function' is not JSON serializable

#pickle 支持的数据类型更多,可以序列化一个函数
import pickle
def foo():
print('ok')
data=pickle.dumps(foo)
f=open('pickle','wb')
f.write(data)
f.close()

f=open('pickle','rb')
data=f.read()
data=pickle.loads(data)
data()
f.close()

#dump和load
import json
dic={'name':'alex','age':'29'}
f=open('jsontest','w')
# data=json.dumps(dic)
# f.write(data)
# 两行代码相当于下面一句
json.dump(dic,f)
f.close()

f=open('jsontest','r')
# data=f.read()
# data=json.loads(data)
# 两行代码相当于下面一句
data=json.load(f)
print(data['name'])
f.close()

#pickle 的dump和load也和json功能相同

#============================================================
# shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,
# 可读可写;key必须为字符串,而值可以是python所支持的数据类型
import shelve
f=shelve.open('shelve')
f['info']={'name':'alex','age':'16'}
f['shopping']={'name':'alex','price':'16'}
data=f.get('info')
data1=f.get('shopping')
print(data,data1)

#get() 方法
d={'name':'alex','age':'16'}
d['name']='abc'
print(d.get('name'))

print(d.get('sex','male')) #没有默认值,返回None,有值会返回存在的值