一、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值

 

版权声明:本文为yunyuncongsheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yunyuncongsheng/p/13156176.html