-APIView:之前用过
-GenericAPIView:GenericAPIView继承了APIView
-类属性:
queryset:要序列化的所有数据
serializer_class:序列化类
lookup_field = 'pk' :查询单条时的key值
-方法:
-get_queryset():获取所有要序列化的数据【后期可以重写】
-get_serializer : 返回序列化类
-get_object :获取单个对象
1 必须配置类属性
queryset
serializer_class
2 想获取要序列化的所有数据
get_queryset()
3 想使用序列化类:
get_serializer
4 想拿单条
get_object
from rest_framework.views import APIView
from .serializer import BookSerialzier
from rest_framework.response import Response
from .models import Book
class BookView(APIView):
def get(self,request):
qs = Book.objects.all()
ser = BookSerialzier(qs, many=True)
return Response({'code': 100,
'msg': '成功',
'results': ser.data})
def post(self,request):
ser = BookSerialzier(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100,
'msg': '成功'})
else:
return Response({'code': 100,
'msg': ser.errors})
class BookSerializer(APIView):
def get(self, request, pk):
book = Book.objects.all().get(pk=pk)
ser = BookSerialzier(book)
return Response({'code':100,
'msg': '成功',
'results': ser.data})
def put(self,request, pk):
book = Book.objects.all().get(pk=pk)
ser = BookSerialzier(data=request.data, instance=book)
if ser.is_valid():
ser.save()
return Response({'code': 100,
'msg': '更新成功'})
else:
return Response({'code': 100,'msg':ser.errors})
# 咱们写的
# class GenericAPIView(APIView):
# query_set=None
# serialzier_class=None
# def get_queryset(self):
# return self.query_set
# def get_serializer(self):
# return self.serialzier_class
# def get_object(self):
# return self.query_set.filter(pk=pk)
人家写的
from rest_framework.generics import GenericAPIView
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
qs = self.get_queryset()
ser = self.get_serializer(qs, many=True)
return Response({'code': 100,
'msg': '成功',
'results': ser.data})
def post(self,request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100,
'msg': '成功'})
else:
return Response({'code': 100,
'msg': ser.errors})
class BookDetailView(GenericAPIView):
queryset = Book.objects()
serializer_class = BookSerializer
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(book)
return Response({'code': 100,
'msg': '成功',
'results': ser.data})
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerialzier
def get(self, request):
qs = self.get_queryset()
ser = self.get_serializer(qs, many=True)
return Response({'code': 100, 'msg': '成功', 'results': ser.data})
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': '成功'})
else:
return Response({'code': 100, 'msg': ser.errors})
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerialzier
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(book)
return Response({'code': 100, 'msg': '成功', 'results': ser.data})
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(data=request.data, instance=book)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': '更新成功'})
else:
return Response({'code': 100, 'msg': ser.errors})
-查询所有 :ListModelMixin--->list方法
-新增一条:CreateModelMixin--->create方法
-查询单条:RetrieveModelMixin--->retrieve方法
-修改一条:UpdateModelMixin--->update方法
-删除一条:DestroyModelMixin--->destroy方法
写5个类(不叫视图类,视图扩展类,需要配合GenericAPIView一起用),每个类有一个方法,以后想写哪个接口,就继承哪个类即可
# 需要继承GenericAPIView类
from rest_framework.response import Response
class ListModelMixin:
def list(self, request, *args, **kwargs):
qs = self.get_queryset()
ser = self.get_serializer(qs, many=True)
return Response({'code': 100, 'msg': '成功', 'results': ser.data})
class CreateModelMixin:
def create(self, request, *args, **kwargs):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': '成功'})
else:
return Response({'code': 100, 'msg': ser.errors})
class RetrieveModelMixin:
def retrieve(self, request, *args, **kwargs):
book = self.get_object()
ser = self.get_serializer(book)
return Response({'code': 100, 'msg': '成功', 'results': ser.data})
# DestroyModelMixin,UpdateModelMixin
class DestroyModelMixin:
def destroy(self, request, *args, **kwargs):
self.get_object().delete()
return Response({'code': 100, 'msg': '删除成功'})
class UpdateModelMixin:
def update(self, request, *args, **kwargs):
book = self.get_object()
ser = self.get_serializer(data=request.data, instance=book)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': '更新成功'})
else:
return Response({'code': 100, 'msg': ser.errors})
from .models import Book
from .serializer import BookSerialzier
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, \
RetrieveModelMixin
class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerialzier
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class BookDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerialzier
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
5 个视图扩展类--->不是视图类---》必须配合GenericAPIView及其子类使用---》不能配合APIView使用
5个视图扩展类,每一个类中只有一个方法,完成5个接口中的其中一个,想写多个接口,就要继承多个
自己写的
**#### 自己写的---开始######
class ListAPIView(GenericAPIView, ListModelMixin):
def get(self, request):
return self.list(request)
class CreateAPIView(GenericAPIView, CreateModelMixin):
def post(self, request):
return self.create(request)
class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
def post(self, request):
return self.create(request)
def get(self, request):
return self.list(request)
#### 自己写的---结束######
from rest_framework.generics import ListAPIView, CreateAPIView, UpdateAPIView, DestroyAPIView, RetrieveAPIView
from rest_framework.generics import ListCreateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.generics import RetrieveUpdateAPIView
from rest_framework.generics import RetrieveDestroyAPIView
# from rest_framework.generics import UpdateDestroyAPIView # 这个没有
class BookView(ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerialzier
class BookDetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerialzier
-继承它后,只需要在视图类中写两行
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialzier
继续扩展
def list(self, request, *args, **kwargs):
res = super().list(request, *args, **kwargs)
return Response({'code': 100, 'msg': '成功', 'data': res.data})
def create(self, request, *args, **kwargs):
res = super().create(request, *args, **kwargs)
print('发送邮件。。。')
return Response({'code': 100, 'msg': '新增成功'})
def perform_create(self, serializer):
# 在新增值,加入逻辑
print('发送邮件。。。。')
super(BookView, self).perform_create(serializer)
-配置路由,5个接口都有了
path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
-继承了:
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin
GenericViewSet
-ViewSetMixin :没有见过,重写了 as_view
-GenericAPIView
-只要继承了ModelViewSet,路由写法变了,谁控制它变的:ViewSetMixi
ViewSetMixin 如何控制路由写法变了?
-BookView.as_view 是在执行,其实是ViewSetMixin的as_view
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
#我们传入的 actions={'get': 'list', 'post': 'create'}
def view(request, *args, **kwargs):
self = cls(**initkwargs)
for method, action in actions.items():
# method:get
# action:list
# 通过反射,self是BookView的对象,取BookView对象中反射list
handler = getattr(self, action)
# 通过反射:setattr(BookView的对象,'get',list方法)
setattr(self, method, handler)
# APIViwe的dispatch
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
'''
1 只要继承了ViewSetMixin及其子类,路由写法就变了,必须传actions参数
2 变成映射关系了:
path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
3 以后,只要是books路由匹配成功,的get请求,就会执行视图类BookView的list方法
4 以后视图类中的方法名,可以随意命名
5 这个类,必须配合视图类使用(APIView,GenericAPIView,9个视图子类),必须放在视图类之前
'''
2个视图基类
-APIView
-GenericAPIView
5个视图扩展类(不是视图类,需要配合GenericAPIView及其子类使用)
9个视图子类
视图集:
ModelViewSet:5个接口的
ReadOnlyModelViewSet:两个接口,list和retrieve
ViewSetMixin:魔法,不能单独使用,必须配合视图类用,路由写法变了
ViewSet:ViewSetMixin+APIView,以后想继承APIView,但是想路由写法变化,视图类中方法可以任意命名
GenericViewSet:ViewSetMixin+GenericAPIView,以后想继承GenericAPIView,但是想路由写法变化,视图类中方法可以任意命名
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet,ViewSetMixin,ViewSet,GenericViewSet
from rest_framework.views import APIView
# ViewSetMixin+APIView=ViewSet
# ViewSetMixin+GenericAPIView=GenericViewSet
# ReadOnlyModelViewSet:只读视图类---》只有两个,查询所有和查询单台哦
class SmsView(ViewSet):
def lqz(self, request):
return Response('你好')
-原始写法
-映射的写法:path('books/', BookView.as_view({'get': 'list', 'post': 'create'}))
-自动生成路由
-必须要继承ViewSetMixin及其子类的视图类,才能用
-继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由
-跟咱们写的这个是一样的
-path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
-path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
-自己写的视图类的方法,如何映射
-映射的方式我们会
-自动生成的方式
1 继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由(get:list,get:retrieve..)
2 我们自己命名的: 方法名:login send_sms,需要使用装饰器来做
# 视图类:
class SMSView(ViewSet):
@action(methods=['GET'], detail=False, url_path='lqz', url_name='lqz')
def lqz(self, request):
# 路由
router.register('lqz',SMSView,'lqz')
# 路径是:http://127.0.0.1:8000/api/v1/lqz/lqz/
3 action装饰器的参数
methods:请求方式
detail:一个True,一个False,用True,表示生成详情的路径 <int:pk>
# True,books/1/方法名/
# False,books/方法名/
url_path:路径名字,需要加上前面的路径一起,如果不加,默认以函数名作为路径名
url_name:反向解析使用的名字(用的不多)
SimpleRouter :用的最多
DefaultRouter
# DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。
# 自动生成路由
from rest_framework.viewsets import ModelViewSet, ViewSet, ViewSetMixin
from rest_framework.views import APIView
# 使用装饰器---》做映射
from rest_framework.decorators import action
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialzier
@action(methods=['GET'], detail=False)
def login(self,request):
# print(pk)
return Response('登录成功')
# 参数:methods=None, detail=None, url_path=None, url_name=None
# class SMSView(ViewSetMixin,APIView): 前面两个相加等于Viewset
class SMSView(ViewSet):
@action(methods=['GET'], detail=True, url_name='lqz')
def lqz(self, request):
return Response('你好')
from django.contrib import admin
from django.urls import path, include
# from app01.views import BookView
# from app01.views import BookView, BookDetailView
from app01.views import BookView, SMSView
# 第一步:导入一个路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:实例化得到对象
router = DefaultRouter()
# 第三步:注册路由(视图类)
router.register('books', BookView, 'books')
# router.register('publish',PublishView,'publish')
# http://127.0.0.1:8000/api/v1/lqz//lqz/
router.register('lqz',SMSView,'lqz')
# 第四步:加入到中路由中
# 4,1 方式一
# urlpatterns+=router.urls
# 4.2 使用include
path('api/v1/', include(router.urls)),
urlpatterns = [
path('admin/', admin.site.urls),
# path('lqz/', SmsView.as_view({'get':'lqz'})),
path('api/v1/', include(router.urls)),
# path('lqz/', SMSView.as_view({'get': 'lqz'})), # 我们都会,使用自动生成,如何做
]
APIView:
这是DRF中最基础的视图类,提供了处理HTTP请求的基本功能。开发者需要继承该类,并在子类中实现相应的HTTP方法(如get()、post()、put()等)来处理请求。
GenericAPIView:
这是一个更高级的通用视图类,结合了APIView和mixins模块的功能。GenericAPIView提供了一些通用的方法和属性,例如get_object()、get_queryset()等,用于简化开发过程。
ViewSet:
这是DRF中更高级的视图类,结合了GenericAPIView和mixins模块的功能,并提供了更多的功能和灵活性。ViewSet可以处理常见的CRUD操作,包括list()、create()、retrieve()、update()和destroy()等,通过路由器进行注册和映射。
ModelViewSet:
这是一个特殊的ViewSet,专门用于处理与数据库模型相关的操作。ModelViewSet结合了GenericAPIView和ModelMixin的功能,提供了一套完整的CRUD操作,包括列表、创建、检索、更新和删除等。
一、带参数请求到的数据和不带参数请求到的数据有啥区别?你请求获取的数据,是依据接口决定的。比如:http://127.0.0.1/user/infouser/info这个接口决定了它会返回用户信息。接口规定路径和参数,请求方需遵守这个规定。接口规定了必须携带id参数或者其它参数,才能正确的返回数据。你加上参数id=123。约定是要带参数的,且是什么格式带参数,然后服务器根据接口的参数返回对应的数据。二、思考题数据库在服务器的硬盘里,数据在数据库文件里。如sql的mdf文件。有些敏感的数据,需要测试接口返回的数据与数据库里的数据是否一致。以下是我和Java开发经理的对话:问:接口返回的数据未必存储到了数据库当中,数据库就是用来存储数据的,它返回给你了,但是它没有帮你把数据存起来。下次的请求时候就会发现返回的数据不对。这是个什么场景?是不是我首次注册,发请求将name和pwd给了服务器,服务器将数据返回给客户端,客户端这边就成功注册了。但是由于数据库没存储数据,当我登录的时候就报错了。发的请求没有响应数据。是这个意思吧?答:接口数据分两种。提交的数据:一般发给服务器用来做业务逻辑。返回的数
背景拼接完基因组之后最重要的事就是对拼接结果进行统计,一般很难一次就得到满意的结果。而是需要进行多次拼接,尝试不同的软件,不同的选项参数,得到多个拼接结果。然后从中选择一个合适的结果。这就需要对每个结果进行统计。包括拼接出基因组的大小,条数,最长长度,最短长度等。今天的部分是fasta格式文件介绍与处理。一、fasta文件格式FASTA文件主要用于存储生物的序列文件,例如基因组,基因的核酸序列以及氨基酸等,是最常见的生物序列格式,一般以扩展名fa,fasta,fna等。1.1fasta文件格式介绍fasta文件中,第一行是由大于号">"开头的任意文字说明,用于序列标记,为了保证后续分析软件能够区分每条序列,单个序列的标识必须是唯一的,序列ID部分可以包含注释信息。从第二行开始为序列本身,只允许使用既定的核苷酸或氨基酸编码符号。序列部分可以在一行,也可以分成多行。>NP_214518.1hypotheticalprotein ATGACGGGTTCTGTTGACCGGCCCGACCAGAATCGCGGTGAGCGATCAATGAAGTCACCAGGGTTG
文章目录阻塞队列阻塞队列的使用生产消费者模型使用场景1.解耦合2.削峰填谷简单模型代码BlockingQueue的具体实现阻塞队列 BlockingQueue是Java标准库中提供的阻塞队列,底层是由链表、数组实现的,实现了Queue接口所以BlockingQueue由Queue的常见方法offer、poll、peek等方法但是我们在使用阻塞队列时,常用到的方法是put(),take()put带有阻塞功能,但是offer不带有,使用阻塞队列一般是使用put入队,take出队 阻塞队列的使用阻塞队列如何体现其阻塞功能呢?当队列为空时,我们再进行出队操作,发生阻塞等待 当队列已满时,我们再进行入队操作,发生阻塞等待 我们来简单使用以下BlockingQueue的常见方法importjava.util.concurrent.BlockingQueue; importjava.util.concurrent.LinkedBlockingQueue; publicstaticvoidmain(String[]args)throwsInterruptedException{ BlockingQ
人类大脑对声音的响应速度和敏感程度非常高。K歌时对人声音轨和伴奏音轨的时间对齐有很强的要求。唱吧资深研发总监王国腾在LiveVideoStackCon2018大会的分享中详细介绍了手机K歌在混音对齐方面存在的问题,解决方案以及值得探索的方向。LiveVideoStack对演讲内容进行整理。文/王国腾整理/LiveVideoStack大家好,我是王国腾,在唱吧主要负责音视频技术的研发和音频新技术的科研工作。本次将主要为大家介绍手机K歌在混音时间对齐方面存在的问题,常规的工程解决方案以及值得探索的方向。1、手机K歌简介手机K歌APP模拟的唱歌过程中两个主要的界面场景,演唱和预览。演唱界面,用户跟随伴奏和提示的歌词完成唱歌,主要生成一股人声的干声。预览界面提供了很多音效的后期处理。包括音准和节奏的校准、特效或预制的混音需求,干声和伴奏的合成预览,甚至是分析人声特点,添加一些动态的音效,做到一键修音。2、音质的评价标准声音后处理的效果要如何评价呢?比如一些混音师,他们有时候会说这个声音很顶,不够饱满,然而从工程和科学的角度,我们从几个抽象维度描述音效:还原度,清晰度,区分度,瑕疵的掩盖能力,以
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的。 废话不多说,开始今天的题目:问:简单说说Pythonsocket编程步骤?答:Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。Python提供了两个基本的socket模块。第一个是Socket,它提供了标准的BSDSocketsAPI。第二个是SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。下面
现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。导航定义一、简单工厂模式二、工厂方法模式三、抽象工厂模式定义工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。按实际业务场景划分,工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。下面我们来分别看一下这3种模式。一、简单工厂模式在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式又叫作静态工厂方法模式。简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在GoF23种设计模式之列。简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。 下面来看一个例子:化妆品工厂可以生产出面霜和爽肤水。 调用方直接使用化妆品工厂的静态方法即可生产出化妆品。clas
通过用户使用信用卡行为数据,建立信用卡盗刷风控模型。当用户有了新的行为,通过这个模型就可以判断是正常用户的行为,还是有人盗刷这张卡。 由于数据集是PCA降维后的数据,这样就隐藏了原始信息的敏感信息,但保留了原数据中的信息量。 深度神经网络可解释性差,数据维度是用PCA处理之后的,所以很容易出现过拟合。可以把权重值加到Loss函数中,惩罚权重,降低过拟合。 查看数据kaggle官网下载数据需要登录。欧洲的信用卡持卡人在2013年9月2天时间里的284807笔交易数据,其中有492笔交易是欺诈交易,占比0.172%。数据采用PCA变换映射为V1,V2,...,V28数值型属性,只有交易时间和金额这两个变量没有经过PCA变换。输出变量为二值变量,1为正常,0为欺诈交易。RangeIndex:284807entries,0to284806 Datacolumns(total31columns): Time284807non-nullfloat64 V1284807non-nullfloat64 V2284807non-nullfloat64 V3284807non-nullfloat64 V4
一、vsftp安装本安装手册基于CentOS7.6操作系统,其他操作系统安装方式除操作系统安装命令和安装包不一样外其他安装配置类同。1.1、挂载Linuxyum源先备份/etc/yum.repos.d目录下其他无用的yum源,然后新增CentOS-Base.repo文件并添加如下配置。 #vi/etc/yum.repos.d/CentOS-Base.repo[Centos7.2]name=CentOS-$releasever-BaseSourcesbaseurl=ftp://10.10.93.86/pub/Centos7.2gpgcheck=1enabled=1gpgkey=ftp://10.10.93.86/pub/Centos7.2/RPM-GPG-KEY-CentOS-7 #yumcleanall#yummakecache123456789101.2、安装vsftp [root@localhost~]#yuminstallvsftpdLoadedplugins:fastestmirrorLoadingmirrorspeedsfromcachedhostfileResolvingD
插入排序 1.直接插入排序 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。 要点:设立哨兵,作为临时存储和判断数组边界之用。 实现: Void InsertSort(Node L[],int length) { Int i,j;//分别为有序区和无序区指针 for(i=1;i<length;i++)//逐步扩大有序区 { j=i+1; if(L[j]<L[i]) { L[0]=L[j];//存储待排序元素 While(L[0]<L[i])//查找在有序区中的插入位置,同时移动元素 { L[i+1]=L[i];//移动 i--;//查找 } L[i+1]=L[0];//将元素插入 } i=j-1;//还原有序区指针 } } 2.希尔排序 原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。 要点:增量的选择以及排序最终以1为增量进行排序结束
http://hihocoder.com/problemset/problem/1227 /************************************************ *Author:Powatr *CreatedTime:2015/9/2114:46:41 *FileName:A.cpp ************************************************/ #include<cstdio> #include<algorithm> #include<iostream> #include<sstream> #include<cstring> #include<cmath> #include<string> #include<vector> #include<queue> #include<deque> #include<stack> #include<list> #include<ma
refrence:http://cloga.info/python/2014/02/07/classify_use_Sklearn/ 加载数据集 这里我使用pandas来加载数据集,数据集采用kaggle的titanic的数据集,下载train.csv。 importpandasaspd df=pd.read_csv('train.csv') df=df.fillna(0)#将缺失值都替换为0 df.head()复制 PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked 0 1 0 3 Braund,Mr.OwenHarris male 22 1 0 A/521171 7.2500 0 S 1 2 1 1 Cumings,Mrs.JohnBradley(FlorenceBriggsTh... female 38 1 0 PC17599 71.2833 C85 C 2 3 1 3 Heikkinen,Miss.Laina female 26 0
vue.config.js配置别名alias、配置生产环境清除console 项目中使用引入文件有时候路径比较深,需要使用"../../../xx.js"这种类似的路劲引入,这种方式比较笨,可以使用webpack的别名alias配置来解决。 首先,先确定项目中是否有path模块: 如果没有path模块需要先安装path npminstallpath--save复制 以下为vue.config.js配置 constpath=require("path"); functionresolve(dir){ returnpath.join(__dirname,dir); } module.exports={ chainWebpack:config=>{ config.resolve.alias .set("@",resolve("src")) .set("assets",resolve("src/assets")) .set("components",resolve("src/components")) .set("base",res
1.下载node.js(下载地址https://nodejs.org/zh-cn/download/) 安装过程全是点下一步,过程略,安装nodejs时自动安装npm 2.cmd下查看node版本:node-v(查看npm版本:npm-v) 3.(可跳过)装cnpm(node.js安装以后在cmd下命令:npminstall-gcnpm--registry=https://registry.npm.taobao.org) 这样就可以使用cnpm命令了,因为cnpm使用国内服务器所有以后npm速度会块很多。 4.因为npm官方地址太慢,所以设置npm的registry地址改为阿里的:(https://developer.aliyun.com/mirror/NPM?from=tnpm) 查看了下当前的npm的registry配置:npmconfiggetregistry 可以看出当前还用的是npm默认仓库地址,要修改成tao
http://lx.lanqiao.cn/problem.page?gpid=T454 题解: 对于K,我们分为K组,对于每一组的任何两个相邻的数,控制他们的间隔为k, 比方说k=3,那么我们可以分为3组。 0,3,6,9.... 1,4,7,10... 2,5,8,11... 这样就可以连续的保存任意个数,而且每一组的间隔为k。 然后再把每个数出现的次数保存一下,接下来就可以做dp了 即对于第i组的第j个数,dp[j]=max(dp[j-1],dp[j-2]+val[j]); code: #include<bits/stdc++.h> usingnamespacestd; constintMAX_k=100005; constintN=100005; intdp[N]; intarr[N]; intnum[N]; intval[N]; boolmark[N]; intmain(){ intn,k; cin>>n>>k; for(inti=1;i<=n;i++){ cin>>arr[i]; num[arr[i]]++; } int
两点之间的任意路径都可表示为 随便某一条路径xor任何多个环, 然后可以用线性基来做,这样不会重复的, 另外必须一位一位的处理,xor是不满足结合律的 1#include<cstdio> 2#include<cstdlib> 3#include<algorithm> 4#include<cstring> 5#include<vector> 6#defineMOD1000000007 7#defineMAXN100000+10 8#definelllonglong 9#definepbpush_back 10#defineftfirst 11#definescsecond 12#definempmake_pair 13#definepilpair<int,ll> 14usingnamespacestd; 15intn,m; 16vector<pil>G[MAXN]; 17lld[MAXN]; 18intpw[MAXN]; 19vector<ll>vs; 20vector<in
源码如下: <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Title</title> <style> *{ margin:0; padding:0; } body{ width:100vw; height:100vh; display:flex; justify-content:center; align-items:center; background:#34495e; } .heart{ width:200px; height:200px; background:red; transform:rotate(45deg)scale(.5); animation-name:hd; animation-duration:2s; animation-iteration-count:infinite; } .heart::before{ content:""; width:200px; height:200px;
1页面链接检查每一个链接是否都有对应的页面,并且页面之间切换正确; 2相关性检查删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。 3检查按钮的功能是否正确如update,cancel,delete,save等功能是否正确。 4字符串长度检查输入超出需求所说明的字符串长度的内容,看系统是否检查字符串长度,会不会出错. 5字符类型检查在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错. 6标点符号检查输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确. 7中文字符处理在可以输入中文的系统输入中文,看会否出现乱码或出错. 8检查带出信息的完整性在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致 9信息重复在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理. 10检查删除功能在一些可以一次删除多个信息的地方,不选择任何信息,按
<!--页脚结束--> <scripttype="text/javascript"> //1.监听注册按钮是否被点击click()如果被点击可以执行一个方法 $("#btn-reg").click(function(){ //动态获取表单中控制的数据 //letusername=$("#username").val(); //letpwd=$("#password").val(); //data:"username="+username+"&password="+pwd,5 //2.发送ajax()的异步请求来完成用户的注册功能 $.ajax({ url:"/users/reg", type:"POST", //serialize()相当于制动获取拼接了一个username=tom&password=123 data:$("#form-reg").serialize(), dataType:"JSON", success:function(json){ if(json.state===200){ alert("用户注册成功") loca
个人认为浏览器到服务器的通信过程是基础中的基础。如果没有了解的话,第二步中,发送DNS请求,可能会存在运营商DNS劫持,那么发现和修复后的针对性测试就会是个问题 客户端封装过程 在浏览器URL地址栏中输入www.baidu.com。 在本机C:\Windows\System32\drivers\etc\Hosts解析域名,确定IP地址。(若没有解析成功则发送DNS请求)。 在应用层封装http报头,在传输层封装TCP报头(填写上层端口号,由于MSS最大传输单元的限制,需要排序分包,头部检验和计算出数据和TCP的状态供接收方检查)。 三次握手建立连接。 在网络层封装IP报头(填写上层协议号,由于不同路由器的MTU大小不同,是否需要继续分片,填充源IP和目的IP),查找路由表。查找ARP表。 在数据链路层封装以太网报头(填充上层类型值、源MAC和目的MAC)。 在物理层封装前导码和帧首定界符,同时将数据包发出。 服务器解析过程 服务器收到数据包后,开始依次解封装。先解封物理层的前导码和帧首定界符,向数据链路层递送。 数据链路层先看以太网协议里目的MAC是不是自己,若不是,丢包。若