python 模块

1. 什么是模块
模块就是一系列功能的集合体

模块分为四个通用的类别:
  1 使用python编写的.py文件(*****)

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

  3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)(*****)

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

模块有三种来源:
1. 内置模块
2. 第三方模块
3. 自定义模块

2. 为何要用模块
1. 使用内置的或者第三方的模块的好处是:拿来主义,极大提升开发效率
2. 使用自定义的模块的好吃是:将程序各部分组件共用的功能提取取出放到一个模块里,其他的组件通过导入的方式使用该模块,该模块即自定义的模块,好处是可以减少代码冗余
3. 如何用模块
import spam
首次导入模块会发生三件事
1.会产生一个模块的名称空间
2.执行spam.py文件的内容,将产生的名字丢到模块的名称空间
3.在当前执行文件中拿到一个名字spam,该名字指向模块的名称空间

# 使用
# print(money)

# print(spam.money)
# print(spam.read1)
# print(spam.read2)
# print(spam.change)
# 补充:重命名模块名
# import spam as sm
# print(sm.money)

 from spam import money,read1,read2,change
首次导入模块会发生三件事
1. 会产生一个模块的名称空间
2. 执行spam.py文件的内容,将产生的名字丢到模块的名称空间里
3. 在当前执行文件中拿到名字read1,该名字指向模块的名称空间中的read1的值的地址
#import总结
#优点:指名道姓地问某一个名称空间要名字,不会与当前执行文件名称空间中的名字冲突
#缺点:引用模块中的名字必须加前缀(模块名.),使用不够简洁

#from...import总结
#优点:引用模块中的名字不用加前缀(模块名.),使用更为简洁
#缺点:容易与当前执行文件名称空间中的名字冲突

查找模块路径的优先级
1.内存
2.内置模块
3.sys.path(是以执行文件为准的)

如何区分python文件的两种用途
def f1():
    print('f1')

def f2():
    print('f2')

if __name__ == '__main__':
    f1()
    f2()

# print(__name__)
# 当文件被当作执行文件执行时__name__的值为__main__
# 当文件被当作模块导入时__name__的值为模块名mmm


json 与 pickle模块
1. 什么是序列化
序列化就是将内存中的数据类型转成另外一种格式

即:
字典---------序列化--------->其他的格式--------------->存到硬盘
硬盘---读取---->其他格式----------反序列化-------->字典

2. 为什么要序列化
1. 持久保存程序的运行状态
2. 数据的跨平台交互



3. 如何序列化
json:
优点: 这种格式是一种通用的格式,所有编程语言都能识别
缺点: 不能识别所有python类型
强调:json格式不能识别单引号

pickle
优点: 能识别所有python类型
缺点: 只能被python这门编程语言识别
dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊',}
###json
import json
##序列化
dic_json=json.dumps(dic)
print(dic_json,type(dic_json))
##持久化
with open('a.json','wt',encoding='utf8') as f:
    f.write(dic_json)
##序列化+持久化
with open ('a.json',mode='wt',encoding='utf-8') as f:
    json.dump(dic,f)
##从文件中读取json格式化的字符
with open ('a.json','rt',encoding='utf8') as f:
    dic_json=f.read()
#反序列化
dic=json.loads(dic_json)
print(dic,dic['k1'])
#读取文件内容+反序列化
dic=json.loda(f)
print(dic['k1'])
json
import pcikle
dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊',}
dic_pkl=pickle.dumps(dic)
print(dic_pkl)

with open('b.pkl','wb') as f:
    f.write(dic_pkl)

with open('b.pkl','rb') as f:
    s_pkl=f.read()
    s=pickle.loads(s_pkl)
#===========>2 pickle.dump与pickle.load
with open('c.pkl','wb') as f:
    pickle.dump(dic,f)
with open('c.pkl',mode='rb') as f:
    dic=pickle.load(f)
time与datatime模块
1.时间戳
print(time.time())
2.格式化的字符
print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
3.结构化的时间对象
print(time.localtime())
print(time.localtime().tm.hour)
print(time.localtime().tm.wday)
#print(time.gmtime())

# 时间转换
# 时间戳---->struct_time------->格式化的字符串
# struct_time=time.localtime(123123)
# print(struct_time)

# print(time.strftime('%Y-%m-%d',struct_time))

# 格式化的字符串---->struct_time------->时间戳
# struct_time=time.strptime('2017-03-11','%Y-%m-%d')
# print(struct_time)

# print(time.mktime(struct_time))

import datatime
print(datetime.datetime.now())
print(datetime.datetime.fromtimestamp(28318322))#转换时间戳
print(datetime.datetime.now() + datetime.timedelta(days=3))
print(datetime.datetime.now() - datetime.timedelta(days=3))
print(datetime.datetime.now() + datetime.timedelta(days=-3))
print(datetime.datetime.now() + datetime.timedelta(days=3,hours=3))

random模块
print(random.random())#随机0-1的小数
print(random.randint(1,3))#1-3的整数
print(random.randrange(1,3))
#1-3的整数,顾头不顾尾
print(random.uniform(1,3))#1-3的小数

print(random.choice([1,'a','c']))
print(random.sample([1,'a','c'],2))#选其中两个元素
item=[1,3,5,7,9]
random.shuffle(item)
print(item)

def make_code(max_size=5):
    res=''
    for i in range(max_size)
        num=str(random.randint(0,9))
        alp=chr(random.randint(65,90))
        res+=random.choice([num,alp])

    return res

print(make_code())
随机验证码生成