day16 包的使用 json time 常用模块

复习

1.判断py文件的两种用途
提到判断__name__ == '__main__'时,会执行py文件,
直接输入main,在pycharm里按tab直接自动输入这条语句

2.解决模块相互导入的问题: 
在说之前,要知道文件的互相导入,是目录结构设计的不够合理,应该尽量调整程序结构并避免
run.py
import m1
m1.fun1()

m2.py
print('正在导入m2')
from m1 import x
y='m2'

m1.py
print('正在导入m1')
from m2 import y
print('来自m2的y:',y)
x='m1'

上面的run.py文件运行时会报错,报错的地方在m2中的from m1 import x,因为x还未定义就跳转到m2文件中去了,所以,这时候内存中还没有x,会报错

把函数内的定义放在导入的前面,这样可以先创建好自己的名称空间,方便互相导入,或者把导入放在函数中写,这样调用函数的时候才会导入模块

调整后的m1.py
def func1():
    from m2 import y,func2
    print('来自于m2的y:',y)
    func2()
x = 'm1'

调整后的m2.py
def func2():
    from m1 import x
    print('来自m1的x:',x)
y = 'm2'
这样定义好后,运行run.py会把两个模块的名称空间都创建好了,方便后续的使用

今日内容

1. 包

1. 什么是包
    包就是一个含有__init__.py文件的文件夹,导包就相当于在导入init文件
    包里的所有内容没有右键运行一说
2. 导入都以包的顶级目录往下找
3. 绝对导入
   相对导入:(仅限在包内使用)
    .加要用的模块名

2. json&pickle (*****) (为了解决序列化问题)

不要把自己定义的文件名命名为json或者pickle
1. 什么是序列化
序列化就是将内存中的数据类型转成另外一种格式
即:
    序列化:字典------序列化----->其他格式-------->存到硬盘
    硬盘---读取------>其他格式------反序列化------>字典
2. 为什么要序列化
    1. 持久保存程序的运行状态
    2. 数据的跨平台交互
    
    
3.如何序列化

    json:(以后常用的是json,为了程序的跨平台性)
        优点:这种格式是一种通用的格式,所有编程语言都能识别      缺点:不能识别所有python的数据类型
       强调:json内没有单引号
       
       用法:
       1.json.dumps和json.dump
       import json
       dic = {'k1':True,'k2':10,'k3':'egon','k4':'你好啊'}
       dic_pkl = json.dumps(dic) # 序列化
       with open('1.json',mode='wt',encoding='utf8') as f:
        f.write(dic_pkl) # 持久化
        
       以上语句可以一步做到,用json.dump直接序列化+持久化
       with open(1.json,mode='wt',encoding='utf8') as f:
        json.dump(dic,f)
        
        2.反序列化
        1.json.loads和json.load
        import json
        with open('1.json',mode = 'rt',encoding = 'utf8') as f:
            dic_json = f.read()
        dic = dic_json.loads(dic_json) 反序列化
        print(dic)
       
       以上语句也可以用一步做到,json.laod()
       with open('1.json',mode = 'rt',encoding = 'utf8') as f:
            dic = json.load(f)
            print(dic['k1'])

pickle
    优点:能识别所有python类型
        缺点:职能被python这门编程语言识别
    
    用法,pickle的用法和json的用法一模一样
    dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊'}
    1.pickle.dumps与pickle.dump
    dic_pkl=pickle.dumps(dic)
    with open('1.pickle',mode = 'wb') as f:
        f.write(dic_pkl)
        
    用dump代替
    with open('1.pickle',mode = 'wb') as f:
        pickle.dump(dic,f)
        
    2.pickle的loads,load
    with open('1.pickle',mode = 'rb') as f:
        dic_pkl=f.read()
    dic = pickle.loads(dic_pkl)
    
    用laod代替
    with open('1.pickle',mode = 'rb') as f:
        dic = pickle.load(f)
        print(dic)

3.time&datetime模块

http://www.cnblogs.com/linhaifeng/articles/6384466.html
时间分为三种格式:
    1.时间戳:1970年1月1号到今天经过的秒数
        import time
        time.time()
    2. 格式化的字符
        print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
    3.结构化的时间对象
        time.localtime() 得到本地时间的结构化时间对象
        time.localtime().tm_hour 只获取小时
        time.localtime().tm_wday 获取是本月的第几周
        time.localtime().tm_yday 获取本年的第几天 只获取小时只获取小时东八区的中国时间
        time.gmtime()  格林威治时间
        
    4. 时间转换
    时间戳---->struct time ------>格式化的字符串
    struct_time = time.localtime(123123123) 时间戳转struct time
    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))
    
    
    time模块的问题:
    1.格式化时间的获取比较麻烦
    2.时间转换不方便
    3.时间的计算太麻烦
    
    datatime解决了以上问题
    datetime.datetime.now() # 获取当前本地时间的格式化时间对象
    datetime.datetime.fromtimestamp(123123123) #从1970年1月1号往后多少秒后的时间转换成格式化时间对象
    datetime.datetime.now()+datetime.timedelta(days = 3) # 当前本地时间加上三天后的时间,换算成格式化时间对象
    datetime.datetime.now() + datetime.timedelta(days=3,hours = 3)

4. 随机模块

random() 随机取0到1之间的小数,不包含0和1
random.randint(1,3) [1,3] 取大于等于1,小于等于3的整数
random.randrange(1,3) [1,3) 取大于等于1小于3的整数
random.uniform(1,3) 取大于1小于3的小数
random.choice([1,'a','c']) 每次从里面选择一个
random.sample([1,'a','c'],2) 每次从列表里选择2个
item=[1,3,5,7,9]
random.shuffle(item) #给列表其中元素洗牌

小练习,生成一个网站的验证码
import random
def make_code(max_size = 6):
    res = ''
    for i in range(max_size):
        num = random.randint(0,9)
        alp = char(random.randint(65,90))
        res = random.choice(num,alp)

其中chr(65)  把里面数字转成对应的ascii码表
make_code(10)
原文地址:https://www.cnblogs.com/shanau2/p/10071886.html