包, json&pickle模块,time&datetime模块,random模块

补充:模块的循环导入

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

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

#run.py
import m1
报错
解决循环导入的两种方法
1.把名字全都往上放,把导入往下放,让名字先加载了
#m1.py
print('正在导m1')
x='m1'
from m2 import y

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

#run.py
import m1
2.运用了函数,函数在定义阶段不运行语法
#m1.py
print('正在导入m1')
def func1():
  from m2 import y,func2
  print('来自于m2的y:',y)
func2()
x='m1'

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

#run.py
import m1
m1.func1()

一.包

1.什么是包?
包就是一个含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来.
包的本质就是一种模块
2.为何要用包?
随着功能越来越多,模块也越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
3.包的使用
所有导入都以包的顶级目录作为起始,这种导入叫做绝对导入

相对导入只能在包内使用 .代表当前文件的文件夹

二.内置或第三方模块的使用

2.1 json&pickle

一.序列化与反序列化介绍
1. 什么是序列化
序列化就是将内存中的数据类型转成另外一种格式
即:
字典---------序列化--------->其他的格式--------------->存到硬盘
硬盘---读取---->其他格式----------反序列化-------->字典

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

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

pickle
优点: 能识别所有python类型
缺点: 只能被python这门编程语言识别
二.json模块的使用
import json
dic={'k1':True,'k2':10,'k3':'egon','k4':'帅'}
#序列化
dic_json=json.dumps(dic)
#持久化
with open(r'a.json',mode='wt',encoding='utf-8')as f:
  f.write(dic_json)
#序列化+持久化
with open(r'a.json',mode='wt',encoding='utf-8')as f:
  json.dump(dic,f)


import json
#从文件中读取json格式化的字符
with open(r'a.json',mode='rt',encoding='utf-8')as f:
  dic_json=f.read()
#反序列化
dic=json.loads(dic_json)
print(dic)
# 读取文件内容+反序列化
with open(r'a.json',mode='rt',encoding='utf-8')as f:
  dic=json.load(f)
  print(dic)

三.picpkl模块的使用(二进制形式)
import pickle
dic={'k1':True,'k2':10,'k3':'egon','k4':'帅'}
with open(r'b.pkl',mode='wb')as f:
  pickle.dump(dic,f)

import pickle
with open(r'b.pkl',mode='rb')as f:
  dic=pickle.load(f)
  print(dic)

2.2 time&datetime

time
时间分为三种格式:
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 ) #这周第几天,从0开始
print(time.localtime().tm_yday) #这年第几天
print(time.gmtime())
#时间转换
时间戳--->结构化的时间对象struct_time--->格式化的字符串
import time
struct_time=time.localtime(123123)
print(struct_time)
print(time.strftime('%Y-%m-%d',struct_time))

格式化字符串--->struct_time--->时间戳
struct_time=time.strptime('2018-12-05','%Y-%m-%d')
print(struct_time)
print(time.mktime(struct_time))

datetime
import datetime
print(datetime.datetime.now())
print(datetime.datetime.fromtimestamp(123123))
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)) 三天三小时前

2.3 random模块(随机模块

import random
print(random.random())#(0,1)----float 大于0且小于1之间的小数
print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数
print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数
print(random.choice([1,'23',[4,5]])) #1或者23或者[4,5]
print(random.sample([1,'23',[4,5]],2)) #列表元素任意2个组合
print(random.uniform(1,3)) #大于1小于3的小数,如1.927109612082716
item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于洗牌
print(item)

生成随机验证码
import random
def make_code(max_size):
  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(5))

原文地址:https://www.cnblogs.com/lizeqian1994/p/10073284.html