day9
一、fastapi #模仿接口,开发接口,快速的验证,弥补协调的时间
先安装:pipi install fastapi和pip install uvicorn
以下可以进入接口界面测试:ip:port/docs(url是)
1、发送get请求
import fastapi import uvicorn#用于启动运行 #ip:port/docs 可进入接口界面化测试操作 server = fastapi.FastAPI()#实例化服务 @server.get('/')#装饰器,加上后就是接口,get请求 def index(id:int,sex:str):#定义参数及参数类型 if sex == 'nan': data={"id":id,'sex':'men'} else: data = {"id": id, 'sex': 'women'} return data if __name__ == '__main__':#运行接口 #fastapi模块 这是py文件名,server是服务名 uvicorn.run('fastapi模块:server',host='0.0.0.0', port=9999, debug=True)
2、发送post请求(k,v形式的传参)
@server.post('/')#装饰器,加上后就是接口,post请求 def order(id:int,type:str):#定义传参及类型 if type == 'success': data={"id":1,'order_amount':10000} else: data = {"id":id,'order_amount':0} return data if __name__ == '__main__':#运行接口 #fastapi模块 这是py文件名,server是服务名 # uvicorn.run('fastapi模块:server', port=9999, debug=True) uvicorn.run('fastapi模块:server',host='0.0.0.0', port=9999, debug=True)
3、发送post请求,参数类型为json的
from pydantic import BaseModel #传json串 #1、定义类 class User(BaseModel):#继承BaseModel username:str#参数和类型 password:str cpw:str @server.post('/user') def user_login(json:User):#json是参数,User是参数类型 # print(json.username) # print(json.password) # print(json.cpw) return {'code:0'} if __name__ == '__main__':#运行接口 #fastapi模块 这是py文件名,server是服务名 # uvicorn.run('fastapi模块:server', port=9999, debug=True) uvicorn.run('fastapi模块:server',host='0.0.0.0', port=9999, debug=True)
二、面向对象
1、类\实例方法
class Staff: nationality = 'CHN'#类变量,公共的,不用实例就可以使用 def __init__(self,name,id_no,position,salary): self.name = name#实例变量 实例后才能使用 self.id_no = id_no self.position = position self.salary = salary # 类方法 @classmethod#定义类方法,是公共的 def help(cls): print('这里的员工都来自%s'%cls.nationality) @classmethod def hh(cls): boss = cls('boos',1,'财务',10000000) boss.fagongzi() def fagongzi(self): print('这个月发了%s元'%self.salary) Staff.hh() Staff.help()#不用实例,可直接调用 print(Staff.nationality)
2、属性方法,不需要入参的时候,可定义成属性方法
import time class User: def work_age(self): create_time = 1528860238#时间戳 res = (time.time() - create_time)/(365*24*60*60) return round(res,1)#保留一位小数 ss = User() res = ss.work_age() print(res)
class User:
@property#定义属性方法
def work_age(self):
create_time = 1528860238#时间戳
res = (time.time() - create_time)/(365*24*60*60)
return round(res,1)#保留一位小数
ss = User()
print(ss.work_age) #调用的时候 直接写方法名 不带()
3、静态方法
@staticmethod#定义静态方法 def help():#其他类/实例方法可以调用静态方法,静态方法无法调用其他方法 print('静态方法')
4、继承
4.1 单继承
class Lz: contry = 'beijin' name = 'cc' def drive(self): print('开车') def cook(self): print('做饭') class Xz(Lz):#继承父类的方法,Xz就具有父类所有的属性和方法 除私有的方法属性不能继承 pass xx = Xz() xx.cook()
4.2 多继承及方法重写
多继承时,注意继承的声明前后顺序
用super().cook(Xz,Lz)时,找的是最开始的父类
用最原始的父类Lz().cook(self) ,返回的是子类的方法结果
class Lz: contry = 'beijin' name = 'cc' def drive(self): print('开车') def cook(self): print('做饭') class Xz(Lz):#继承父类的方法,Xz就具有父类所有的属性和方法 除私有的 def eat(self): print('eat') def cook(self): print('子类的cook') class Xxz(Lz): def cook(self): Lz.cook(self)#把父类的方法实现 print('xxz_cook')#新增一部分功能 class Llz(Xz,Lz):#注意多重继承的前后声明顺序,代码才可正常运 def cook(self): super().cook()#返回的是Lz的方法结果 class Lllz(Xz,Lz): def cook(self): Lz.cook(self)#返回的是Xz的方法结果
三、深拷贝、浅拷贝
1、浅拷贝
浅拷贝循环删除元素时,下标会错乱,导致结果不是预期的
a = [1,2,3,2,4,1,3,5,7,7,7,9,9,4] for i in a: if i % 2 != 0: a.remove(i) print(a)#[2, 2, 4, 3, 7, 7, 9, 4] 不应有3,因为移除的过程中,a列表的下标在变化,会漏元素 #浅拷贝-------------------------------- a2 = a for i in a2: if i % 2 != 0: a.remove(i) print(a)#[2, 2, 4, 7, 9, 4]
#浅拷贝--------------------------------
import copy
a4 = a.copy()
for i in a2:
if i % 2 != 0:
a.remove(i)
print(a)#[2, 2, 4, 9, 4]
2、深拷贝
会形成两个不同的对象,循环删除时,对下标不影响
#深拷贝 a = [1,2,3,2,4,1,3,5,7,7,7,9,9,4] import copy a3 = copy.deepcopy(a) for i in a3: if i % 2 != 0: a.remove(i) print(a)#[2, 2, 4, 4]
四、多线程
import threading#启动线程 import requests import hashlib def down_load(url): name = hashlib.md5(url.encode()).hexdigest() r = requests.get(url) with open('%s.jpg'%name,'wb') as fw: fw.write(r.content) l = ['https://erp.fulan.com.cn/static/dime/imgs/logo1.png', 'https://erp.fulan.com.cn/admin/employee/download?fileName=null'] # for url in l: # down_load(url)#串行,一个线程在干活 import time def insert_db(): time.sleep(3) print('insert over') t = threading.Thread(target=insert_db)#实例化Thread 后面是函数名,分配任务给线程 不要直接调用函数 # for i in range(10): # t = threading.Thread(target=insert_db)#启用了10个线程 # t.start() # print(threading.active_count())#线程个数+主线程 start_time = time.time() for i in range(3): insert_db()#串行时间 end_time = time.time() print('串行的时间%s'%(end_time-start_time)) start_time1 = time.time() for i in range(3): t = threading.Thread(target=insert_db) t.start()
#t.join() end_time1 = time.time() print('多线程运行的时间%s'%(end_time1-start_time1))
1、t.join()#加了join后 主线程会等子线程运行结果 再往下走,耗时会同串行
for i in range(3): t = threading.Thread(target=insert_db) t.start() threads.append(t)#解决主线程先结束的方案 for i in threads:#先让子线程循环做事 t.join()#主线程在这等待
#第二种方式,判断线程个数
while threading.activeCount() != 1:#当只剩下主线程1!=1时,跳出循环
pass
end_time1 = time.time()
print('多线程运行的时间%s'%(end_time1-start_time1))#这是主线程执行完的时间 子线程并没有结束
2、多线程运行时,拿不到函数的返回值,可定义一个list,将返回结果append到list中
3、守护线程(主线程提前结束,子线程工作没结束 也会跟随主线程一起结束
import threading,time def talk(name): print('chat%s'%name) time.sleep(200) def shipin(name): print('view%s'%name) time.sleep(200) print('qq窗口') t1 = threading.Thread(target=talk,args=['lll']) t1.setDaemon(True)#设置守护线程 t1.start() t2 = threading.Thread(target=shipin,args=['ccc']) t2.setDaemon(True) t2.start() time.sleep(5)#设置5s主线程结束 print('结束')
4、线程锁
import threading count = 0 lock = threading.Lock() def test(): global count lock.acquire(timeout=2)#加锁timeout=2 2秒后自动解锁 lock.acquire()不定义自动解锁时间 count+=1 lock.release()#解锁 #如果不定义timeout 也不定义release()的话 程序会出现死锁 for i in range(3): t = threading.Thread() t.start()
五、jsonpath模块
pip install jsonpath,这个模块用于取字典的值
dict={“name”:”xiaohei”,”stu_info”:[“id”:1,”phone”:”123214″]}
res = json.jsonpath(dict,’$..phone’)#$表示外层大字典,’..’表示模糊查询key为phone的所有value值