Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一,就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能,但是其中存在很多冗余的方法

mgr/medicine.py
mgr/k8s.py
mgr/medicine.py

打开这3个文件我们可以看到他们的入口函数dispatcher  实际的代码相似度非常高,该函数的大体代码基本类似,不同之处,只是分配给哪些函数处理

 

像这样的冗余代码如果持续增多,那么后续的维护成本也会变大,比如我想要将认证的返回值进行修改,那么我就需要去3个文件中挨个进行配置,所以我们要将这种相似的代码单独做成一个公共程序

一、冗余代码优化

1、添加公共函数目录

#在当前应用项目(mgr)下创建一个lib目录,并创建公共代码文件
lib|-handler.py

2、修改K8S.py存量代码

我们发现 请求消息给哪个函数处理, 完全是由 请求消息里面的action参数决定的, 所以,我们可以修改上面这3个代码文件,先删除原先的入口函数dispatcher函数(我前面几个定义的名称都不一致,这块可以改成一样的了)

#应用公共函数
from lib.handler import dispatcherBase#当前函数所支持请求类型
Action2Handler = {'list_customer': listcustomers,'add_customer': addcustomer,'modify_customer': modifycustomer,'del_customer': deletecustomer,
}def dispatcher(request):return dispatcherBase(request, Action2Handler)

我们定义一个什么样的action用什么函数处理的一张表 Action2Handler ,然后dispatcher 函数可以简单到直接调用 dispatcherBase, 并且把Action2Handler 作为参数传递给给它。剩下的就交由 dispatcherBase 去处理了,下面我们把原先的入口函数删除后,将上面的代码添加到3个文件最下面,注意修改Action2Handler变量中的请求参数和对应调用的函数名称

Django_demo/mgr/order.py

from django.http import JsonResponse
from django.db import  transaction
from django.db.models import F
# 导入 Order 对象定义
from  paas.models import  Order,OrderMedicinedef addorder(request):info  = request.params['data']# 从请求消息中 获取要添加订单的信息# 并且插入到数据库中with transaction.atomic():new_order = Order.objects.create(name=info['name'], customer_id=info['customerid'])batch = [OrderMedicine(order_id=new_order.id,medicine_id=mid,amount=1)for mid in info['medicineids']]#  在多对多关系表中 添加了 多条关联记录OrderMedicine.objects.bulk_create(batch)return JsonResponse({'ret': 0,'id':new_order.id})def listorder(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = Order.objects \.annotate(customer_name=F('customer__name'),medicines_name=F('medicines__name')) \.values('id','name','create_date','customer_name','medicines_name')# 将 QuerySet 对象 转化为 list 类型retlist = list(qs)# 可能有 ID相同,药品不同的订单记录, 需要合并newlist = []id2order = {}for one in retlist:orderid = one['id']if orderid not in id2order:newlist.append(one)id2order[orderid] = oneelse:id2order[orderid]['medicines_name'] += ' | ' + one['medicines_name']return JsonResponse({'ret': 0, 'retlist': newlist})##################################新的入口函数#################################添加导入公共函数
from .lib.handler import dispatcherBase#传入本地函数和方法
Action2Handler = {'list_order': listorder,'add_order': addorder,
}
#重新定义入口函数
def dispatcher(request):return dispatcherBase(request, Action2Handler)

 3、定义公共函数

Django_demo/mgr/lib/handler.py

import jsonfrom django.http import JsonResponsedef dispatcherBase(request,action2HandlerTable):# 根据session判断用户是否是登录的管理员用户if 'usertype' not in request.session:return JsonResponse({'ret': 302,'msg': '未登录','redirect': '/mgr/sign.html'},status=302)if request.session['usertype'] != 'mgr':return JsonResponse({'ret': 302,'msg': '用户非mgr类型','redirect': '/mgr/sign.html'},status=302)# 将请求参数统一放入request 的 params 属性中,方便后续处理# GET请求 参数 在 request 对象的 GET属性中if request.method == 'GET':request.params = request.GET# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取elif request.method in ['POST','PUT','DELETE']:# 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式request.params = json.loads(request.body)# 根据不同的action分派给不同的函数进行处理action = request.params['action']print(action)if action in action2HandlerTable:handlerFunc = action2HandlerTable[action]return handlerFunc(request)else:return JsonResponse({'ret': 1, 'msg': 'action参数错误'})

前面的认证转换和参数获取和之前的代码是一致的,区别在于获取到action参数后的操作

 # 根据不同的action分派给不同的函数进行处理action = request.params['action']if action in action2HandlerTable:handlerFunc = action2HandlerTable[action]return handlerFunc(request)

这段代码就是根据action参数的值,到 action2HandlerTable 查找出对应的 函数处理 ,可以根据这个方法去修改其他的两个代码文件

4、测试请求

import  requests,pprint#添加认证
payload = {'username': 'root','password': '12345678'
}
#发送登录请求
response = requests.post('http://127.0.0.1:8000/api/mgr/signin',data=payload)
#拿到请求中的认证信息进行访问
set_cookie = response.headers.get('Set-Cookie')# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"list_order",
}
url='http://127.0.0.1:8000/api/mgr/orders/'if set_cookie:# 将Set-Cookie字段的值添加到请求头中headers = {'Cookie': set_cookie}# 发送请求给web服务response = requests.post(url,json=payload,headers=headers)pprint.pprint(response.json())

返回

{'ret': 0,'retlist': [{'create_date': '2023-10-26T01:15:09.718Z','customer_name': 'zhangsan','id': 13,'medicines_name': 'gmkl','name': '天山订单'},{'create_date': '2023-10-26T01:14:29.897Z','customer_name': 'zhangsan','id': 12,'medicines_name': 'gmkl','name': '天山订单'},{'create_date': '2023-10-26T01:13:35.943Z','customer_name': 'zhangsan','id': 11,'medicines_name': 'gmkl','name': 'ts'},{'create_date': '2023-10-25T03:08:00Z','customer_name': 'zhangsan','id': 5,'medicines_name': 'gmkl','name': 'test'}]}

5、补全其他案例

Django_demo/mgr/k8s.py


from django.http import JsonResponsefrom paas.models import PaasInfodef listcustomers(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = PaasInfo.objects.values()# 将 QuerySet 对象 转化为 list 类型# 否则不能 被 转化为 JSON 字符串retlist = list(qs)return JsonResponse({'ret': 0, 'retlist': retlist})
def addcustomer(request):info = request.params['data']# 从请求消息中 获取要添加客户的信息# 并且插入到数据库中# 返回值 就是对应插入记录的对象record = PaasInfo.objects.create(ClusterName=info['ClusterName'] ,NodeSum=info['NodeSum'] ,PrometheusAddress=info['PrometheusAddress'])return JsonResponse({'ret': 0, 'id':record.id})
def modifycustomer(request):# 从请求消息中 获取修改客户的信息# 找到该客户,并且进行修改操作customerid = request.params['id']newdata    = request.params['newdata']print(customerid,newdata)try:# 根据 id 从数据库中找到相应的客户记录customer = PaasInfo.objects.get(id=customerid)except PaasInfo.DoesNotExist:return  {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}if 'ClusterName' in  newdata:customer.ClusterName = newdata['ClusterName']if 'NodeSum' in  newdata:customer.NodeSum = newdata['NodeSum']if 'PrometheusAddress' in  newdata:customer.PrometheusAddress = newdata['PrometheusAddress']# 注意,一定要执行save才能将修改信息保存到数据库customer.save()return JsonResponse({'ret': 0})
def deletecustomer(request):customerid = request.params['id']try:# 根据 id 从数据库中找到相应的客户记录customer = PaasInfo.objects.get(id=customerid)except PaasInfo.DoesNotExist:return  {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}# delete 方法就将该记录从数据库中删除了customer.delete()return JsonResponse({'ret': 0})#重定义入口函数
from .lib.handler import dispatcherBaseAction2Handler = {'list_customer': listcustomers,'add_customer': addcustomer,'modify_customer': modifycustomer,'del_customer': deletecustomer,
}def dispatcher(request):return dispatcherBase(request, Action2Handler)

Django_demo/mgr/medicine.py

from django.http import JsonResponse# 导入 Medicine 对象定义(这块可能显示模块导入不正常,忽略)
from  paas.models import  Medicineimport jsondef listmedicine(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = Medicine.objects.values()# 将 QuerySet 对象 转化为 list 类型# 否则不能 被 转化为 JSON 字符串retlist = list(qs)return JsonResponse({'ret': 0, 'retlist': retlist})def addmedicine(request):info    = request.params['data']# 从请求消息中 获取要添加客户的信息# 并且插入到数据库中medicine = Medicine.objects.create(name=info['name'] ,sn=info['sn'] ,desc=info['desc'])return JsonResponse({'ret': 0, 'id':medicine.id})def modifymedicine(request):# 从请求消息中 获取修改客户的信息# 找到该客户,并且进行修改操作medicineid = request.params['id']newdata    = request.params['newdata']try:# 根据 id 从数据库中找到相应的客户记录medicine = Medicine.objects.get(id=medicineid)except Medicine.DoesNotExist:return  {'ret': 1,'msg': f'id 为`{medicineid}`的药品不存在'}if 'name' in  newdata:medicine.name = newdata['name']if 'sn' in  newdata:medicine.sn = newdata['sn']if 'desc' in  newdata:medicine.desc = newdata['desc']# 注意,一定要执行save才能将修改信息保存到数据库medicine.save()return JsonResponse({'ret': 0})def deletemedicine(request):medicineid = request.params['id']try:# 根据 id 从数据库中找到相应的药品记录medicine = Medicine.objects.get(id=medicineid)except Medicine.DoesNotExist:return  {'ret': 1,'msg': f'id 为`{medicineid}`的客户不存在'}# delete 方法就将该记录从数据库中删除了medicine.delete()return JsonResponse({'ret': 0})from .lib.handler import dispatcherBaseAction2Handler = {'list_medicine': listmedicine,'add_medicine': addmedicine,'modify_medicine': modifymedicine,'del_medicine': deletemedicine,
}def dispatcher(request):return dispatcherBase(request, Action2Handler)

Django_demo/mgr/urls.py

from django.urls import path
from .views import login
from .sign_in_out import signin,signout#重定义路由名称
from .k8s import dispatcher as k8s
from .order import dispatcher as order
from .medicine import dispatcher as medicine
urlpatterns = [path('customers/', k8s),path('medicines/', medicine),path('orders/', order),path('signin', signin),path('signout', signout),path('login',login)]

二、数据库冗余

现在我们的 mgr/order.py 里面用 listorder 函数列出订单。如果一个订单里面有多个药品,就会产生多条记录。为了解决这个问题,我们不得不用python代码来处理冗余,像下面这样

def listorder(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = Order.objects\.annotate(customer_name=F('customer__name'),medicines_name=F('medicines__name'))\.values('id','name','create_date','customer_name','medicines_name')# 将 QuerySet 对象 转化为 list 类型retlist = list(qs)# 可能有 ID相同,药品不同的订单记录, 需要合并newlist = []id2order = {}for one in retlist:orderid = one['id']if orderid not in id2order:newlist.append(one)id2order[orderid] = oneelse:id2order[orderid]['medicines_name'] += ' | ' + one['medicines_name']return JsonResponse({'ret': 0, 'retlist': newlist})

 这样做其实有一些问题,首先他会使得我们的代码增加了额外的去除重复记录的功能,并且还会代理性能问题,比如当大量用户登录时需要列出订单信息,需要服务程序从数据库获取到数据后,再去执行去除重复记录的任务

 1、冗余问题思路

我们可以修改数据库表的设计,就在订单表(order) 里面 直接存入订单包含的药品信息

这样就不用去关联表(orderMedicine) 去获取关联药品的信息,从而也不需要去除重复代码

这样,就不需要 从 OrderMedicine 表里面 去获取关联药品信息了,当然也不需要去除重复的代码了。

      但又有了新问题,如果说我们希望订单表里面有药品信息,需要有药品的id、名称、数量,而且有可能存在多种药品,关键是不同的订单和药品的数量也是不同的,对于这种情况,我们通常可以使用一个字段, 里面存储 json格式的字符串,记录可变数量的数据信息。

Django_demo/paas/models.py

class Order(models.Model):# 订单名name = models.CharField(max_length=200,null=True,blank=True)# 创建日期create_date = models.DateTimeField(default=datetime.datetime.now)# 客户customer = models.ForeignKey(Customer,on_delete=models.PROTECT)# 订单购买的药品,和Medicine表是多对多 的关系medicines = models.ManyToManyField(Medicine, through='OrderMedicine')# 为了提高效率,这里存放 订单 medicines 冗余数据medicinelist =  models.CharField(max_length=2000,null=True,blank=True)

 我们在订单表中添加了一个medicinelist的字段,里面用json格式来存储订单中的药品

[{"id": 1, "name": "青霉素", "amount": 20}, {"id": 2, "name": "来适可", "amount": 100}
]id 表示药品的idname 表示 药品的名字amount 表示 药品的数量

 上面的例子就表示该订单中有id 为 1 和 2 的两种药品 数量分别是 20 和 100

这个字段最大长度可达2000个字符,通常足以存储订单中的药品信息了

python manage.py makemigrations common
python manage.py migrate

2、修改接口参数

我们之前在请求接口的时候使用的是如下格式

{"action":"add_order","data":{"name":"华山医院订单002","customerid":3,"medicineids":[1,2]}
}

这里面只有药品的id,没有药品的 名称和数量。我们在开发的时候,经常会遇到当前的接口设计不能满足新的需求,需要修改的情况。这时候就要和 接口的设计者 , 以及接口对接的开发团队进行沟通, 说明为什么你需要修改接口

3、修改请求api格式

添加订单格式
{"action":"add_order","data":{"name":"华山医院订单002","customerid":3,"medicinelist":[{"id":16,"amount":5,"name":"环丙沙星"},{"id":15,"amount":5,"name":"克林霉素"}]}
}
列出订单格式
    {"id": 2, "name": "华山医院订单002", "create_date": "2018-12-27T14:10:37.208Z", "customer_name": "华山医院","medicinelist":[{"id":16,"amount":5,"name":"环丙沙星"},{"id":15,"amount":5,"name":"克林霉素"}]}

既然接口变动了,前端的开发团队 要根据修改后的接口,修改他们的代码,保证按照新的接口实现消息格式, 上面这个是前端发请求api所要携带的参数

4、修改后端代码逻辑

修改添加逻辑

Django_demo/mgr/order.py

def addorder(request):info = request.params['data']with transaction.atomic():medicinelist  = info['medicinelist']new_order = Order.objects.create(name=info['name'],customer_id=info['customerid'],# 写入json格式的药品数据到 medicinelist 字段中medicinelist=json.dumps(medicinelist,ensure_ascii=False),)batch = [OrderMedicine(order_id=new_order.id,medicine_id=medicine['id'],amount=medicine['amount'])for medicine in medicinelist]OrderMedicine.objects.bulk_create(batch)return JsonResponse({'ret': 0, 'id': new_order.id})
修改列出表逻辑

Django_demo/mgr/order.py

def listorder(request):qs = Order.objects \.annotate(customer_name=F('customer__name'))\.values('id', 'name', 'create_date','customer_name','medicinelist')# 将 QuerySet 对象 转化为 list 类型retlist = list(qs)return JsonResponse({'ret': 0, 'retlist': retlist})

5、添加数据

import  requests,pprint#添加认证
payload = {'username': 'root','password': '12345678'
}
#发送登录请求
response = requests.post('http://127.0.0.1:8000/api/mgr/signin',data=payload)
#拿到请求中的认证信息进行访问
set_cookie = response.headers.get('Set-Cookie')# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"add_order","data":{"name":"华山医院订单002","customerid":1,"medicinelist":[{"id":6,"amount":5,"name":"gmkl"},]}
}
url='http://127.0.0.1:8000/api/mgr/orders/'if set_cookie:# 将Set-Cookie字段的值添加到请求头中headers = {'Cookie': set_cookie}# 发送请求给web服务response = requests.post(url,json=payload,headers=headers)print(response)

注意

payload = {"action":"add_order","data":{"name":"华山医院订单002","customerid":1,"medicinelist":[{"id":6,"amount":5,"name":"gmkl"},]}
}

因为我们是要添加订单,所以客户id ("customerid":1,)  和药品id + 名称是必须要先知道的,或者我们在发起请求的时候不带这种id,去到后端的时候去根据数据库查询客户和药品的id再写入

6、调用查询数据

import  requests,pprint#添加认证
payload = {'username': 'root','password': '12345678'
}
#发送登录请求
response = requests.post('http://127.0.0.1:8000/api/mgr/signin',data=payload)
#拿到请求中的认证信息进行访问
set_cookie = response.headers.get('Set-Cookie')# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"list_order","data":{"customer_name":"华山医院订单002",}
}
url='http://127.0.0.1:8000/api/mgr/orders/'if set_cookie:# 将Set-Cookie字段的值添加到请求头中headers = {'Cookie': set_cookie}# 发送请求给web服务response = requests.post(url,json=payload,headers=headers)pprint.pprint(response.json())

返回

             {'create_date': '2023-11-02T09:05:27.095Z','customer_name': 'zhangsan','id': 19,'medicinelist': '[{"id": 6, "amount": 5, "name": "gmkl"}]','name': '华山医院订单002'}]}

7、关于前后方案的

   上面这么做的好处很明显,列出订单的代码就比较简单了,不需要执行去重的任务。

性能也提高了, 只要查询一张表,并且不要执行去重的任务,但是有可能出现其他的问题

   

     冗余数据,我们本来记录在 OrderMedicine 表 中的, 现在我们还需要记录在 Order 表中,这么一说咋还不如之前的方法呢? 这样每次需要写两张表的性能反而是下降了吧

   但是除此之外还需要考虑到,是修改订单的请求多,还是查询订单的请求多,那么一定是查询的要多很多,每次查询都要跑去重,和只有修改的时候才会写两张表之间选择,肯定是后者的方案更好

     

     可能有小伙伴觉得,写两张表还更麻烦了,反正订单里面有药品信息,那么干脆不用OrderMedicine表不就更简单了吗,这样做,最大的问题是, 如果以后我们需要统计药品被采购的信息就非常麻烦了,因为,现在我们在数据库中存储的订单中的药品信息,是以字符串类型存储的 json信息,不能直接使用SQL语句进行过滤查询,只能把所有的记录读取出来进行分析,那样性能会非常低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178309.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac/Linux类虚拟机_CrossOver虚拟机CrossOver 23.6正式发布2024全新功能解析

CodeWeivers 公司于今年 10 月发布了 CrossOver 23.6 测试版,重点添加了对 DirectX 12 支持,从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿,表示正式发布 CrossOver 23 稳定版,在诸多新增功能中,最…

我和“云栖大会”的双向奔赴

目录 引言初次参加云栖大会云栖大会带来的技术风向标本届大会最强技术有哪些?云栖大会对我职业生涯的影响个人对未来云栖大会的期待和建议结语 引言 想必大家对“云栖大会”并不陌生,“云栖大会”作为国内最具规模和影响力的云计算盛会,每年…

Jellyfin转码和色调映射效率提升:开启处理器低电压模式(GuC/HuC)

Jellyfin转码和色调映射效率提升 系统环境拉取nyanmisaka/jellyfin镜像开启低电压模式Jellyfin配置开启QSV和低电压模式解码开启色调映射(基于OpenCL) 实测验证低电压模式转码帧率实测测试视频概况221029版本 vs 230901版本开启色调映射的影响开启低电压…

移动路由器Cellular Router命令执行漏洞复现 [附POC]

文章目录 移动路由器Cellular Router命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 移动路由器Cellular Router命令执行漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章…

线扫相机DALSA-相机平场矫正详细步骤

在相机视野下铺放白色亚克力板或纯白纸,采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈,让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…

Notepad++下载、使用

下载 https://notepad-plus-plus.org/downloads/ 安装 双击安装 选择安装路径 使用 在文件夹中搜索 文件类型可以根据需要设置 如 *.* 说明是所有文件类型; *.tar 说明是所有文件后缀是是tar的文件‘;

Flink1.18新特性生产环境应用的重点解读!

大家好,我是你们的群主王知无呀。 Flink 1.18已经于近期发布了。在这个新版本中新增了很多新的功能和特性。在这些特性中,有一些是生产环境非常重要的能力,大家在使用过程中可以重点参考和了解其中的原理。 算子级别状态保留时间TTL设置 首先…

企业邮箱:哪个品牌最实用?

企业邮箱用哪个品牌的好用?从无广告、新手上手难度、功能来看Zoho Mail企业邮箱,优势很大。Zoho Mail企业邮箱界面简洁无广告,让用户可以更专注的去处理邮件,为了便于用户处理邮件,Zoho 还提供了多种整理和分类邮件的选…

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值(Lvalues)和右值(Rvalues) 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…

pytorch学习第五篇:NN与CNN代码实例

这篇文章详细介绍了全链接神经网络实现方法,以及卷积的实现方法。最后我们发现,卷积的实现方法与全链接大同小异,因为 torch 为我们做了很多工作,我们来看看这两个有什么区别。 我们使用 torch 框架来实现两种神经网络,来对图形进行分类。 NN 首先我们引入依赖包 impor…

利用关键字批量整理文件:用关键字轻松移动多个文件到指定文件夹

在日常生活和工作中,我们经常需要处理大量的文件,随着时间的推移,电脑中的文件越来越多,而文件的命名可能并不规范,导致查找和整理变得非常困难。因此,我们需要一种高效的文件管理方法,以方便我…

微信小程序自定义弹窗阻止滑动冒泡catchtouchmove之后弹窗内部内容无法滑动

自定义弹窗 如图所示: 自定义弹窗内部有带滚动条的盒子区域 问题: 在盒子上滑动,页面如果超出一屏的话,也会跟着一起上下滚动 解决方案:给自定义弹窗 添加 catchtouchmove 事件,阻止冒泡即可 网上不少…

查询和下载“省市县乡村“五级行政区划

背景信息 在更新完CTAmap1.12版本之后,我想继续完善这个系列的数据,把时间范围往前更新是基础,但如何展现多年的数据是个值得解决的问题。 如何展现多个年份的行政区划?我的思考是用思维导图的形式,简单明了。既然要…

分享66个工作总结PPT,总有一款适合您

分享66个工作总结PPT,总有一款适合您 66个工作总结PPT下载链接:https://pan.baidu.com/s/1g8AWl42-tLdFYXEHZUYyGQ?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 立冬PPTPPT模板 西藏信仰PPT模板 古镇丽…

C++构造函数和析构函数详解

一、构造函数 1、概念 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名叫做构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。 2、特征 函数名与类名相同。无返回值对象实例化时编译器自动调用对应的…

SMTP邮件发送图片-如何在github中存储图片并访问

之前写了一篇文章 Go:实现SMTP邮件发送订阅功能(包含163邮箱、163企业邮箱、谷歌gmail邮箱),实现了通过邮箱服务来发送邮件,但都是文字内容,要是想实现邮件发送图片,就需要将图片放到公网可访问…

关注云栖大会的感受:从工业大脑到全面AI时代的进化

前言 自2009年的地方网站峰会到如今的云栖大会,这个盛大的科技盛事已经走过了一个多十年的漫长历程。这个会议见证了中国科技行业的崛起,也记录了技术的不断演化。而对我来说,首次接触云栖大会是在2020年,当年大会迁移到线上&…

LV.12 D15 WDT实验 学习笔记

一、WDT简介 WDT Watch Dog Timer即看门狗定时器,其主要作用是当发生软件故障时可产生复位信号使SOC复位,其本质是一个计数器 工作原理 CPU正常工作时,需要定时往看门狗计数器里刷新一个比较大的值,来保证看门狗计数器中的值不会…

模型应用系实习生-模型训练笔记(更新至线性回归、Ridge回归、Lasso回归、Elastic Net回归、决策树回归、梯度提升树回归和随机森林回归)

sklearn机械学习模型步骤以及模型 一、训练准备(x_train, x_test, y_train, y_test)1.1 导包1.2 数据要求1.21 导入数据1.22 数据类型查看检测以及转换1.22 划分数据 二、回归2.1 线性回归2.2 随机森林回归2.3 GradientBoostingRegressor梯度提升树回归2…

利用C++实现RANSAC拟合多条直线并提出符合要求的直线,标准库和手写(不使用任何库、链表方式)两种方法

**背景:**2D/3D激光雷达扫描的点云数据,拟合直线做分析,实现总共有三种方法: (1)PCL点云库实现 (2)利用标准库手写 (3)不使用任何库,链表方式实现…