首页 文章 精选 留言 我的

精选列表

搜索[全模态模型],共10000篇文章
优秀的个人博客,低调大师

2020 云原生技术 7 大领域趋势全预测

文章联合撰稿人(排名不分先后)叔同、谷朴、不瞋、育睿、许晓斌、至简、典违、鲁直、改之、小剑、汤志敏、白慕、循环、文卿,喽哥、水鸟、神秀。 在筹备阿里云首届云原生实践峰会的过程中,我们展开了对云原生技术的应用和研究领域的探索,邀请了 17 位云原生技术专家从 Serverless、Service Mesh、Kubernetes、边缘计算、容器实例与容器引擎、云原生基础架构、云原生应用开发 7 个发展方向,回顾 2019 云原生领域进展,描绘云原生技术的新十年。 2020 云原生标志性事件预测 展望 2020,在云原生技术的应用和研究领域,我们预见会有这些标志性事件。 第一,云原生技术关注重心在上移,Serverless和应用管理重点。 过去的几年我们看到,云原生技术重心围绕容器和容器编排。Docker 和 K8s 的成功几乎成了云原生的代名词

优秀的个人博客,低调大师

DataHub通过DataConnector流转到MaxCompute全链路测试

概述 前面通过博客:流数据同步DataConnector测试整理简要介绍了DataConnector的配置。下面通过一个示例,从maxcompute建表开始,介绍整个链路的实现。 实验目的 使用Datahub SDK写入数据到Topic,进而经过Dataconnector推送数据到maxcompute的数据表。 实验步骤 1、Dataworks建表SQL脚本 CREATE TABLE IF NOT EXISTS ods_log_tracker( ip STRING COMMENT 'client ip address', user STRING, accesstime string, method STRING COMMENT 'HTTP request type, such as GET POST...', url STRING, prot

优秀的个人博客,低调大师

一篇文章搞定Python多进程(全)

公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现和GIL - https://mp.weixin.qq.com/s/Hgp-x-T3ss4IiVk2_4VUrA一篇文章理清Python多线程同步锁,死锁和递归锁 - https://mp.weixin.qq.com/s/RZSBe2MG9tsbUVZLHxK9NA一篇文章理清Python多线程之同步条件,信号量和队列 - https://mp.weixin.qq.com/s/vKsNbDZnvg6LHWVA-AOIMA 今天开始会开启python多进程的内容,大家看过前面文章的应该都知道python中的GIL的存在,也就是多线程的时候,同一时间只能有一个线程在CPU上运行,而且是单个CPU上运行,不管你的CPU有多少核数。如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。 下面说说Python多进程的实现方法,和多线程类似 2.Python多进程实现方法一 from multiprocessing import Process def fun1(name): print('测试%s多进程' %name) if __name__ == '__main__': process_list = [] for i in range(5): #开启5个子进程执行fun1函数 p = Process(target=fun1,args=('Python',)) #实例化进程对象 p.start() process_list.append(p) for i in process_list: p.join() print('结束测试') 结果 测试Python多进程 测试Python多进程 测试Python多进程 测试Python多进程 测试Python多进程 结束测试 Process finished with exit code 0 上面的代码开启了5个子进程去执行函数,我们可以观察结果,是同时打印的,这里实现了真正的并行操作,就是多个CPU同时执行任务。我们知道进程是python中最小的资源分配单元,也就是进程中间的数据,内存是不共享的,每启动一个进程,都要独立分配资源和拷贝访问的数据,所以进程的启动和销毁的代价是比较大了,所以在实际中使用多进程,要根据服务器的配置来设定。 3.Python多进程实现方法二 还记得python多线程的第二种实现方法吗?是通过类继承的方法来实现的,python多进程的第二种实现方式也是一样的 from multiprocessing import Process class MyProcess(Process): #继承Process类 def __init__(self,name): super(MyProcess,self).__init__() self.name = name def run(self): print('测试%s多进程' % self.name) if __name__ == '__main__': process_list = [] for i in range(5): #开启5个子进程执行fun1函数 p = MyProcess('Python') #实例化进程对象 p.start() process_list.append(p) for i in process_list: p.join() print('结束测试') 结果 测试Python多进程 测试Python多进程 测试Python多进程 测试Python多进程 测试Python多进程 结束测试 Process finished with exit code 0 效果和第一种方式一样。 我们可以看到Python多进程的实现方式和多线程的实现方式几乎一样。 Process类的其他方法 构造方法: Process([group [, target [, name [, args [, kwargs]]]]]) group: 线程组 target: 要执行的方法 name: 进程名 args/kwargs: 要传入方法的参数 实例方法: is_alive():返回进程是否在运行,bool类型。 join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。 start():进程准备就绪,等待CPU调度 run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。 terminate():不管任务是否完成,立即停止工作进程 属性: daemon:和线程的setDeamon功能一样 name:进程名字 pid:进程号 关于join,daemon的使用和python多线程一样,这里就不在复述了,大家可以看看以前的python多线程系列文章。 4.Python多线程的通信 进程是系统独立调度核分配系统资源(CPU、内存)的基本单位,进程之间是相互独立的,每启动一个新的进程相当于把数据进行了一次克隆,子进程里的数据修改无法影响到主进程中的数据,不同子进程之间的数据也不能共享,这是多进程在使用中与多线程最明显的区别。但是难道Python多进程中间难道就是孤立的吗?当然不是,python也提供了多种方法实现了多进程中间的通信和数据共享(可以修改一份数据) 进程对列Queue Queue在多线程中也说到过,在生成者消费者模式中使用,是线程安全的,是生产者和消费者中间的数据管道,那在python多进程中,它其实就是进程之间的数据管道,实现进程通信。 from multiprocessing import Process,Queue def fun1(q,i): print('子进程%s 开始put数据' %i) q.put('我是%s 通过Queue通信' %i) if __name__ == '__main__': q = Queue() process_list = [] for i in range(3): p = Process(target=fun1,args=(q,i,)) #注意args里面要把q对象传给我们要执行的方法,这样子进程才能和主进程用Queue来通信 p.start() process_list.append(p) for i in process_list: p.join() print('主进程获取Queue数据') print(q.get()) print(q.get()) print(q.get()) print('结束测试') 结果 子进程0 开始put数据 子进程1 开始put数据 子进程2 开始put数据 主进程获取Queue数据 我是0 通过Queue通信 我是1 通过Queue通信 我是2 通过Queue通信 结束测试 Process finished with exit code 0 上面的代码结果可以看到我们主进程中可以通过Queue获取子进程中put的数据,实现进程间的通信。 管道Pipe 管道Pipe和Queue的作用大致差不多,也是实现进程间的通信,下面之间看怎么使用吧 from multiprocessing import Process, Pipe def fun1(conn): print('子进程发送消息:') conn.send('你好主进程') print('子进程接受消息:') print(conn.recv()) conn.close() if __name__ == '__main__': conn1, conn2 = Pipe() #关键点,pipe实例化生成一个双向管 p = Process(target=fun1, args=(conn2,)) #conn2传给子进程 p.start() print('主进程接受消息:') print(conn1.recv()) print('主进程发送消息:') conn1.send("你好子进程") p.join() print('结束测试') 结果 主进程接受消息: 子进程发送消息: 子进程接受消息: 你好主进程 主进程发送消息: 你好子进程 结束测试 Process finished with exit code 0 上面可以看到主进程和子进程可以相互发送消息 Managers Queue和Pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。那么久要用到Managers from multiprocessing import Process, Manager def fun1(dic,lis,index): dic[index] = 'a' dic['2'] = 'b' lis.append(index) #[0,1,2,3,4,0,1,2,3,4,5,6,7,8,9] #print(l) if __name__ == '__main__': with Manager() as manager: dic = manager.dict()#注意字典的声明方式,不能直接通过{}来定义 l = manager.list(range(5))#[0,1,2,3,4] process_list = [] for i in range(10): p = Process(target=fun1, args=(dic,l,i)) p.start() process_list.append(p) for res in process_list: res.join() print(dic) print(l) 结果: {0: 'a', '2': 'b', 3: 'a', 1: 'a', 2: 'a', 4: 'a', 5: 'a', 7: 'a', 6: 'a', 8: 'a', 9: 'a'} [0, 1, 2, 3, 4, 0, 3, 1, 2, 4, 5, 7, 6, 8, 9] 可以看到主进程定义了一个字典和一个列表,在子进程中,可以添加和修改字典的内容,在列表中插入新的数据,实现进程间的数据共享,即可以共同修改同一份数据 5.进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。就是固定有几个进程可以使用。 进程池中有两个方法: apply:同步,一般不使用 apply_async:异步 from multiprocessing import Process,Pool import os, time, random def fun1(name): print('Run task %s (%s)...' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 3) end = time.time() print('Task %s runs %0.2f seconds.' % (name, (end - start))) if __name__=='__main__': pool = Pool(5) #创建一个5个进程的进程池 for i in range(10): pool.apply_async(func=fun1, args=(i,)) pool.close() pool.join() print('结束测试') 结果 Run task 0 (37476)... Run task 1 (4044)... Task 0 runs 0.03 seconds. Run task 2 (37476)... Run task 3 (17252)... Run task 4 (16448)... Run task 5 (24804)... Task 2 runs 0.27 seconds. Run task 6 (37476)... Task 1 runs 0.58 seconds. Run task 7 (4044)... Task 3 runs 0.98 seconds. Run task 8 (17252)... Task 5 runs 1.13 seconds. Run task 9 (24804)... Task 6 runs 1.46 seconds. Task 4 runs 2.73 seconds. Task 8 runs 2.18 seconds. Task 7 runs 2.93 seconds. Task 9 runs 2.93 seconds. 结束测试 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。 进程池map方法 案例来源于网络,侵权请告知,谢谢 因为网上看到这个例子觉得不错,所以这里就不自己写案例,这个案例比较有说服力 import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRECTORY = \'thumbs\' def get_image_paths(folder): return (os.path.join(folder, f) for f in os.listdir(folder) if \'jpeg\' in f) def create_thumbnail(filename): im = Image.open(filename) im.thumbnail(SIZE, Image.ANTIALIAS) base, fname = os.path.split(filename) save_path = os.path.join(base, SAVE_DIRECTORY, fname) im.save(save_path) if __name__ == \'__main__\': folder = os.path.abspath( \'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840\') os.mkdir(os.path.join(folder, SAVE_DIRECTORY)) images = get_image_paths(folder) pool = Pool() pool.map(creat_thumbnail, images) #关键点,images是一个可迭代对象 pool.close() pool.join() 上边这段代码的主要工作就是将遍历传入的文件夹中的图片文件,一一生成缩略图,并将这些缩略图保存到特定文件夹中。这我的机器上,用这一程序处理 6000 张图片需要花费 27.9 秒。 map 函数并不支持手动线程管理,反而使得相关的 debug 工作也变得异常简单。 map在爬虫的领域里也可以使用,比如多个URL的内容爬取,可以把URL放入元祖里,然后传给执行函数。

优秀的个人博客,低调大师

Python全栈 Web(Django框架、forms对象、cookie、session)

forms模块的高级处理 将models和forms结合到一起使用 1.在forms.py中创建class 继承自forms.ModelForm 2.创建一个内部类Meta来关联Model model 指定要关联的实体类是谁 fields 指定从model中取出那些字段生成控件 取值 "__all__"表示全部属性都要生控件 列表 声明允许生成控件的属性名 labels 指定每个属性所关联的label 取值为字典 label = { '属性名':'label文本', '属性名':'label文本', } class RegisterForm(forms.ModelForm): #通过内部类Meta表示关联的信息 class Meta: #1.指定关联的Model model = User #2.指定要生成控件的字段们 fields = "__all__" #3.指定每个控件对应的label labels = { 'uphone':'电话号码', 'upwd':'登录密码', 'uname':'用户名称', 'uemail':'电子邮件', } if request.method == 'GET': form = RegisterForm() return render(request,'05-register.html',locals()) 小部件: 什么是小部件? widget表示生成到页面上的控件类型以及其他的HTML属性 常用小部件类型 TextInput: type="text" PasswordInput: type="password" NumberInput: type="number" EmailInput: type="email" URLInput: type="url" HiddenInput: type="hidden" CheckboxInput: type="checkbox" Textarea: <textarea></textarea> Select: <select></select> 小部件的使用 继承自forms.Form 基本 只需要指定控件的类型 class RemarkForm(forms.Form): 属性 = forms.CharField( label:'文本', widget=forms.小部件类型 ) 高级 指定控件类型的基础上 还允许设置HTML的一些相关属性 属性 = forms.CharField( label="文本" widget=forms.小部件类型( attrs = { "html属性名":"html属性值", "html属性名":"HTML属性值" } ) ) 继承自forms.ModelForm class xxxForm(forms.ModelForm): class Meta: model = User fields = "__all__" labels = { "属性":"label" } widgets = { "属性1": forms.小部件类型(attrs={ }), } class LoginForm(forms.ModelForm): class Meta: model = User fields = ['uphone','upwd'] labels = { 'uphone':'注册电话', 'upwd':'登录密码', } #指定小部件 widgets = { 'upwd':forms.PasswordInput(attrs={ 'placeholder':'请输入您的密码' }) } class WidgetLoginForm(forms.Form): uphone = forms.CharField(label='电话号码') #为pwd指定小部件,显示为 密码框 # upwd = forms.CharField(label='登录密码',widget=forms.PasswordInput) upwd = forms.CharField( label='登录密码', widget=forms.PasswordInput( attrs = { 'placeholder':'请输入密码', 'class':'form-control', } ) ) cookies在Django中的实现 django中使用cookies 设置cookies: 响应对象.set_cookie(key, value, expires) key:cookie的名字 value:cookie的值 expires:保存时间 以s为单位 响应对象: HttpResponse() resp = HttpResponse("hello") resp.set_cookie(response, "xxx.html", locals()) return resp render() 获取cookies的值: 通过request.COOKIES 获取当前站点下对的所有的cookie的信息 def login_views(request): if request.method == 'GET': #判断uname是否存在于cookies中,如果有的话,直接提示登录成功,否则,去往09-login模板 if 'uname' in request.COOKIES: return HttpResponse('您已成功登录过') return render(request,'09-login.html') else: # 获取用户名称和密码 uname=request.POST['uname'] upwd = request.POST['upwd'] # 判断用户名称和密码的 if uname=='wangwc' and upwd=='123456': # 如果用户名和密码正确的话,判断有没有勾住记住密码 resp = HttpResponse("登录成功") if 'isSaved' in request.POST: # 如果有勾住记住密码,则将用户名称保存进cookies resp.set_cookie('uname',uname,60*60*24*90) return resp else: return HttpResponse('登录失败') session在django中的实现: 设置session的值: request.session["key"] = value 获取session的值: value = request.session["key"] 删除session的值 del request.session["key"] 在settings.py中设置session的相关设置 SESSION_COOKIE_AGE 设置 sessionID在cookies中的保存时间 SESSION_COOKIE_AGE = 60 * 60 * 24 # 最多保存24小时 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置关闭浏览器是则清空服务器上对应的session空间 bool值 # 设置session def setSession_views(request): request.session['uname']='wangwc' return HttpResponse('Set Session Succefull') # 获取session def getSession_views(request): uname = request.session['uname'] return HttpResponse('uname:'+uname)

优秀的个人博客,低调大师

(全)(20)

call(),apply(),bind() 函数大家可能都有所了解,但是在平时搬砖过程中很可能或者基本没用过,学过但都淡忘了。 但是在大量第三方的框架(库),甚至js自己都在 源码中大量使用 call,apply 函数。所以今天和大家仔细讨论下它们在 开发中的应用场景 。 1 . 它们是啥意思1.1 作用他们的作用都是改变函数内部的this。这三个函数都是函数对象的方法,也就是说只有函数才可以直接调用这些方法。1.2 三者区别参数: 三个函数的第一个参数都是需要绑定的 this。call: 可以有n个参数,从第二个参数开始的所有参数都是原函数的参数。 `apply`:只有两个参数,并且第二个参数必须为数组,数组中的所有元素一一对应原函数的参数。 `bind`: 只有一个参数,即要绑定的this。 call 语法: foo.call(this, arg1,arg2, ... ,argn ); apply 语法: foo.apply(this, [ arg1,arg2, ... ,argn ] ); bind 语法: foo.bind(this); 调用:call,apply: 调用后立即执行原函数。 `bind`: 调用后返回已经绑定好this的函数。 小例子一枚: function foo(a,b){ console.log(a+b); } foo.call(null,'海洋','饼干'); // 海洋饼干 这里this指向不重要就写null了 foo.apply(null, ['海洋','饼干'] ); // 海洋饼干 var fun = foo.bind(null); fun('海洋','饼干'); // 海洋饼干 2 .它们能干啥事这是我们今天讨论的主题,这三个函数如何应用?什么情况下使用?能改变this指向又能咋滴? 2 .1 处理伪数组 (最常用)先考虑一个问题,如果你使用var arr = document.getElementsByTagName('li')获取了5个li元素,你现在需要获取其中的第2,3,4三个元素,你会怎么做? 这样arr.slice(1,4);? 啊哦,TypeError -- arr.slice is not a function(slice不是函数),数组操作在日常搬砖中非常常见,我见过最傻的解决这个问题的方式是使用循环,将需要的元素一个个添加到一个新数组里0.0,下面我介绍的方法完全可以在实战中使用,可以给你的代码加分哦,非常方便简洁(中高级前端程序员中,算是基本操作了)。 先要介绍一个概念( 伪数组 ),这也是为什么我们刚刚slice切割数组时出错的原因: (对新手来说算是干货了,知道的可以跳过) 什么是伪数组?( 字面的意思已经呼之欲出了 ) 有length属性能按索引存储数据能像遍历数组一样来遍历不能使用数组的push()、slice()等方法简单来说就是可以像数组一样操作的对象,但是没有数组的方法。 js中存在大量伪数组,如 : 1. function的arguments对象。 2. getElementsByName(),getElementsByTagName(),childNodes/children 等方法的返回值。 3. 还有比较常见的jquery,使用它获取的元素也是伪数组。 回到原来的问题,如何截取伪数组中的元素:伪数组没有这些方法,我们'借用'Array的slice不就行了 [].slice.call(arr,1,4); // 推荐写法 不想借用你可以直接给伪数组添加一个slice函数,如 arr.slice = [].slice; arr.slice(1,4); 当然,'借用' 更方便,直接添加会导致伪数组对象'污染'。 如果可以随意改变原对象,可以 直接将其转成真正的数组对象。 [].slice.call(arr); 2 .2 继承继承方式多种多样,我们现在讨论的这种是其中很重要的一种实现方式,用call实现 js 构造函数继承 。 单继承 function person(name){ this.name = name } function man(name){ this.age = '男'; person.call(this,name); // 继承 man } var me = new man('海洋饼干'); console.log(me.name,me.age); // '海洋饼干' '男' 多继承 function person(name){ this.name = name } function man(name){ this.age = '男'; } function manProgrammer(name){ this.girlfriend = null; person.call(this,name); // 继承 person man.call(this,name); // 继承 man } var me = new manProgrammer('海洋饼干'); console.log(me.name,me.age,me.girlfriend); // '海洋饼干' '男' null 2 .3 this 硬绑定 --- bind将一个对象强制且永久性绑定到函数的this上,使用call,apply或者其他的绑定方式都无法改变(除了new绑定,当然,可以手动撸一个new都无法改变的硬绑定) 直接看例子: var fun ; var obj = { a : 1, foo : function(){ var _this = this; //平时有没有过这种写法? 为了防止this指向问题 //将this赋值给一个变量,间接维持了this的安全性 fun = function(){ console.log(_this.a); } } } obj.foo(); fun(); // 1 var obj1 = { a : 2} obj.foo.call(obj1); // 直接修改_this所绑定的值,boom了 fun(); // 2 但是这种方法感觉上是在逃避问题,直接不使用this了 ? 这真的不是什么好的解决问题的态度。下面使用我们的bind来优化一下: var fun ; var obj = { a : 1, foo : function(){ // 不使用 _this, 避免无谓的变量声明 fun = function(){ console.log(this.a); }.bind(this); // 代码很简洁,很漂亮(b格) } } var obj1 = { a : 2} obj.foo(); fun(); // 1 fun.call(obj1); // 1 call ,apply等绑定 无法修改 // 这里和上面call的位置不同是因为this所处于不同的位置 这样替代 _this 很规(zhuang)范(b)呢 2 .4 取数组最大最小值Math.max和min方法,接收多个参数,比较出极值,这里用到apply的一个默认功能:展开数组,传入一个数组参数就可以默认将这个数组转成一个个参数的形式赋给原函数 var num = [6,9,-3,-5]; console.log(Math.max.apply(Math,num)); // 9 等价 console.log(Math.max(6,9,-3,-5)); console.log(Math.min.apply(Math,num)); // -5 等价 console.log(Math.min(6,9,-3,-5)); 2 .5 合并数组合并数组常见有三种方式,1.循环 2.Array的concat() 3. 使用apply()合并 这里是使用最简便的apply var a = [1,2,3]; var b = [4,5,6]; [].push.apply(a,b); // 借用数组的push方法 等价 a.push(4,5,6); console.log(a); // [1, 2, 3, 4, 5, 6]

优秀的个人博客,低调大师

Python全栈 Web(Flask框架、应用配置, request, response)

修改配置: app = Flask(__name__, template_folder="模板目录", static_url_path="静态文件路径", static_path="文件存储路径") app = Flask(__name__,template_folder='t',static_url_path='/static',static_folder='s') template_folder: 设置模板的保存路径 static_url_path: 设置静态文件的访问路径(映射到web中的访问路径) static_folder: 设置静态文件的保存目录(映射到项目中的目录名称) HTTP请求(request): HTTP协议: 请求对象request: request 请求对象 封装了所

优秀的个人博客,低调大师

Python全栈 Web(JavaScript 数组、string、正则、Math、Date)

数组: 常用的API: toString() 将数组转换为字符串 默认是将数组的元素 使用逗号隔开 链接成字符串在进行返回 join(seperator) 将数组的元素使用seperator字符串作为分隔符 链接成字符串再进行返回 reverse() 将数组进行反转 该函数会改变现有数组的结构 不需要接受返回值 sort() 对数组的元素进行排序 默认按照Unicode码进行排序 对数字不准确 会改变原有数组的内容 特点: 允许自定义的排序规则(排序函数)用来指定数组的排序方式 语法: arr.sort(排序函数); 排序函数: 升序的排序函数: function sortAsc(a, b){ return a - b; } arr.sort(sortAsc); 匿名函数实现: arr.sort(function(a, b){ return a - b; }) 降序排序: 排序后

优秀的个人博客,低调大师

Python全栈 Web(文本属性、表格属性、布局)

文本相关属性 字体属性: 1.设置字体大小 属性:font-size 取值:px 2.指定字体名称 属性:font-family 取值:字体名称,如果出现多个名称,使用,隔开 如果字体名称出现中文或出现中文空格要用引号引起来 3.设置字体的加粗 属性:font-weight 取值: 单词表示 normal 默认值 正常显示 bold 加粗显示 lighter 极细文本 数字显示 100~900之间 整百数值 值越大越粗 400 等于 normal 700 等于 bold 4.设置字体样式: 属性:font-style 取值: normal 正常显示 italic 使用斜体显示 oblique 使文本倾斜达到斜体效果 5.字体属性简写: 属性:font 取值:style weight size family family属性值必须写 不写所有设置无效 文本属性: 1.文本颜色 属性:color 取值:颜色值 2.文本水平对齐方式: 属性:text-align 取值:left(默认值) center right justify(两端对齐) 3.设置行高 属性:line-height 取值:像素 或无单位数值表示当前文本大小的倍数 行高常用于设置文本的垂直居中 将元素的高度与行度保持一致 一行文本 在当前行中一定是垂直居中的 上下的空隙由浏览器自动分配 4.文本装饰线 属性:text-decoration 取值: underline 下划线 overline 上划线 line-through删除线 none:针对超链接取消下划线 表格属性: 基础样式属性是通用的 width height background color margin padding 独有CSS属性: 边框合并: border-collapse 取值: separate(默认分离) collapse(边框合并) td不支持外边距 边框合并只能写在table标签里 边框的边距: 设置单元格之间的距离 属性: border-spacing 取值: h-Value 水平方向的距离 v-Value 垂直方向的距离 两个值用空格隔开 只能在表格边框分离的状态下使用 过渡效果: 过度效果指的是元素CSS属性值在发生变化时的一种平滑效果 语法: 过度属性: 属性:transition-property 作用:用来指定哪些CSS属性需要添加过度效果 取值: 指定单个的属性名称增加一个过度效果 例如:width 指定多个属性用,隔开 all: 将所有能添加过渡效果的都进行添加 能够添加过渡效果的属性: 所有颜色相关的属性 所有数值取值为数字的属性 过渡时长: 属性:transition-duration 作用:表示多长时间内完成过渡效果 取值: 单位为s(秒)或者是ms(h毫秒)的数值 速度时间曲率: 属性:transition-timing-function 作用:设置过渡效果的变化速率 取值: ease(默认) 慢速开始 中间变快 慢速结束 linear 匀速变化 ease-in 慢速开始 加速结束 ease-out 快速开始 减速结束 ease-in-out 慢速开始和结束 中间先加速后减速 过渡延迟: 属性:transition-delay 作用:延迟指定时长后再发生过渡效果 取值: 单位为s(秒)或者是ms(h毫秒)的数值 使用注意: 过渡时长必须设置,其他可以省略 否则没有过渡效果 使用过渡相关的属性,要定义在元素默认样式中 不能写在伪类选择器中,会影响效果 属性简写: 属性:transition 取值: property、duration timing-function 、delay duration必须写 布局: 设置元素在网页中的排列方式和位置 分类: 普通流布局/标准流布局/文档流布局 网页中默认布局方式 特点: 将元素按照书写顺序和类型从左向右 从上到下排列 浮动布局: 属性:float left、right、none(默认) left: 元素向左浮动 停靠在其他元素的边缘 right: 元素向右浮动 停靠在其他元素的边缘 特点: 1.元素在设置浮动元素后会脱离文档流 元素在文档中不占位 呈现一种浮动元素飘浮在文档上方的效果 2.浮动元素后面的正常元素会上移占据原本浮动元素所在的位置 3.多个元素左浮或右浮动,浮动元素会依次停靠在前一个元素的边缘位置 第一个浮动元素会贴着负元素的边框显示 4.如果父元素中无法并排显示浮动元素会自动换行 5.浮动元素在文档中不占位 6.所有类型的元素只要设置浮动就可以设置宽高 行内或行内快元素浮动后 水平方向之间没有空隙 浮动元素的特殊效果: 文字环绕效果 浮动元素会遮挡后面正常元素 但是不会遮挡正常元素的内容的显示 内容会自动围绕在浮动元素的周围显示 浮动元素对父元素高度影响: 由于浮动元素在文档中不占位 一旦子元素全部浮动 父元素的高度会成0 影响背景的显示,和后面其他元素的布局 解决方式: 1.指定父元素的高度 但是不能准确确认父元素的高度 2.父元素中设置:overflow:hidden 如果父元素要显示溢出的内容,设置overflow:hidden之后 溢出的内容就不显示了 3.清除浮动: 由于浮动元素会对其后的正常元素带来一些影响 所以在网页布局中要清除这种影响 属性:clear 取值: none (默认)不做处理 left 清除当前元素前面左浮元素带来的影响 right 正常元素右边不允许出现浮动元素 both 正常元素两边都不能出现浮动元素 在父元素的末尾添加空的块级元素 设置空块级元素 clear:both;

优秀的个人博客,低调大师

Python全栈 MongoDB 数据库(数据的修改)

修改操作符的使用 $set 修改一个域的值,增加一个域 阿哲年龄修改为33 db.class1.update({name:'阿哲'},{$set:{age:33}}) 如果sex域不存在则会添加这个域 db.class1.update({name:'阿蓉'},{$set:{sex:'w'}}) $unset 删除一个域 删除sex域 db.class1.update({name:'小陈'},{$unset:{sex:''}}) * 每个操作符可以同时操作多项 db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}}) * 一次修改可以同时使用多个操作符 db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}}) $rename 修改域名 将sex域名改为gender db.class1.update({sex:{$exists:true}},{$rename:{sex:'gender'}},false,true) $setOnInsert 如果第三个参数为true且插入数据,则表示插入文档的补充内容。如果不插入文档则不起作用 如果插入新文档则setOnInsert中键值对也作为文档内容 db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true) $inc 加减修改器 db.class1.update({},{$inc:{age:-1}},false,true) $mul 乘法修改器 db.class2.update({},{$mul:{age:2}},false,true) * $inc $mul 参数可以使整数小数正数负数 $min 如果筛选文档指定域的值小于min值则不修改,大于min值则修改为min值 如果age大于18则修改为18 db.class2.update({},{$min:{age:18}},false,true) $max 如果筛选文档指定域的值大于max值则不修改,小于max值则修改为max值 将年龄不到30的修改为30 db.class1.update({},{$max:{age:30}},false,true) 数组修改器 $push 向数组中添加一项 向score数组中添加一项 db.class2.update({name:'小亮'},{$push:{score:91}}) $pushAll 向数组中添加多项 db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}}) $pull 从数组中删除一项 db.class2.update({name:'小明'},{$pull:{score:10}}) $pullAll 从数组中删除多项 db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}}) $each 对多个值进行逐一操作 db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}}) $position 指定插入位置 配合each使用将数据插入到指定位置 db.class2.update({name:'小红'},{$push:{score:{$each:[5],$position:1}}}) $sort 对数组进行排序 对数组进行排序 db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}}) $pop 弹出一项 1表示弹出数组中最后一项,-1表示弹出第一项 db.class2.update({name:'小明'},{$pop:{score:-1}}) $addToSet 向数组中添加一项,但是不允许添加重复内容 如果数组中没有80则添加80 db.class2.update({name:'小红'},{$addToSet:{score:80}}) 时间类型 mongodb 中支持时间格式 : ISODate() 1. 使用 new Date() 自动生成当前时间 db.class0.insert({book:'Python入门',date:new Date()}) 2. 使用 ISODate() 生成当前时间 db.class0.insert({book:'Python精通',date:ISODate()}) 3. 获取计算机时间生成时间格式字符串 Date() db.class0.insert({book:'Python疯狂',date:Date()}) 指定时间: ISODate() 功能: 生成mongodb时间存储类型 参数: 不加参数生成当前时间 指定时间格式参数: "2018-01-01 12:12:12" "20180101 12:12:12" "20180101" db.class0.insert({book:'Python崩溃',date:ISODate("2018-07-13 11:23:36")}) 时间戳: 通过当前的时间生成的一个时间节点标志 valueOf() 生成某个标准时间的时间戳 db.class0.insert({book:'Python重生',date:ISODate().valueOf()}) Null 类型: 值 : null 1. 如果某个域存在却没有值可以设置为null 表示date没有实际意义的值 db.class0.insert({book:'Python编程',date:null}) 2. 在查找时可以找到值为null或者不存在某个域的文档 查找到date值为null或者不存在date域的文档 db.class0.find({date:null},{_id:0}) 数组的下标操作方式: 可以通过 域名.下标 的方式具体操作数组的某一项 查找数组 0 项大于90的文档 db.class2.find({'score.0':{$gt:90}},{_id:0}) 将score 第1项改为10 db.class2.update({name:'小红'},{$set:{'score.1':10}}) 内部文档操作(Object): 文档内部某个域的值还是一个文档,则这个文档称为内部文档类型数据 * 通过 外部域.内部文档域 的方式引用内部文档中某个域的值进行操作 db.class3.find({'books.title':'狂人日记'},{_id:0}) db.class3.update({"books.title":'骆驼祥子'},{$set:{"books.price":48.6}}) 查找结果的下标引用 可以通过下标的方式获取查找结果的某一项 获取查找结果的 第 2 项 db.class1.find({},{_id:0})[2] 综合示例 : 使用之前的grade数据库 1.将小红年龄改为8岁,兴趣爱好变为跳舞画画 db.class.update({$set:{age:8,hobby:['dance','draw']}}) 2. 追加小明兴趣爱好 唱歌 db.class.update({$push:{hobby:'sing'}}) 3. 追加小王兴趣爱好,吹牛,打篮球 db.class.update({$pushAll:{hobby:['吹牛','basketball']}}) 4. 小李兴趣多了跑步唱歌,但是要确保不和以前的重复 db.class.update({$addToSet:{hobby:{$each:['running','sing']}}}) 5. 将该班所有同学年龄加1 db.class.update({},{$inc:{age:1}},false,ture) 6. 删除小明的sex属性 db.class.update({$unset:{sex:''}}) 7.删除小李兴趣中的第一项 db.class.update({$pop:{hobby:-1}}) 8,删除小红兴趣中的画画和唱歌 db.class.update({$pullAll:{hobby:['draw','sing']}}) 9. 为小红增加一个域,为 score:{english:93,chinese:92,match:78} db.class.update({$set:{score:{english:93,chinese:92,match:78}}}) 10. 给小红数学成绩加5分 db.class.update({$inc:{'score.math':5}}) 11. 小明的第一爱好改为computer db.class.update({$set:{'hobby.0':'computer'}}) 索引: 指建立指定键值及所在文档中存储位置的对照清单, 使用索引可以方便我们进行快速查找,减少数据遍历次数,从而提高查找效率 Mongodb 创建索引: ensureIndex() 功能 : 创建索引 参数 : 第一个为对哪个域创建索引 第二个为索引的选项 对name域创建索引 db.class1.ensureIndex({name:1}) * 1表示正向索引 -1表示逆向索引 查看某个集合中的 索引: db.class1.getIndexes() * _id是系统为每个集合自动创建的索引 自定义索引名称 通过第二个参数传入索引选项实现 db.class1.ensureIndex({age:1},{name:'ageIndex'}) * 同一个域不能重复创建相同的索引,一个集合中索引名也不要相同 删除索引: dropIndex() 功能: 删除一个索引 参数: 索引名或者索引键值对 db.class1.dropIndex({name:-1}) db.class1.dropIndex("ageIndex") dropIndexes() 功能: 删除所有索引 删除class1中所有索引,但是不会删除_id索引 db.class1.dropIndexes() 其他索引类型: 复合索引: 同时根据多个域创建一个索引 根据name和age域查询都为索引查询,比单独创建两个索引表更节省空间 db.class1.ensureIndex({name:1,age:-1}) 数组和子文档索引: 如果对某个数组和子文档域创建索引,那么根据数组和子文档的查找均为索引查找 如果对score域创建索引则 下面的查找也是索引查找 db.class2.find({'score.0':60},{_id:0}) 覆盖索引: 查找操作需要获取的域,只有索引域没有其他域。 此时索引表可以直接提供给用户想要的内容,提高查找效率 唯一索引: 创建的索引,索引域值无重复,此时可以创建唯一索引 唯一索引数据结构更加便于查找 对name创建唯一索引,name值不能有重复 db.class1.ensureIndex({name:1},{ unique:true}) * 当对某个域创建唯一索引,该域就不能再插入重复数据 稀疏索引: 只针对有指定域的文档创建索引表,如果某个文档没有该域则不会插入到索引表中 对age创建稀疏索引 db.class1.ensureIndex({age:1},{ sparse:true}) 索引约束: 1. 索引表也需要占用一定的磁盘空间 2. 当数据发生更新时索引表也要随之更新 综上: 1. 数据量比较大时更适合创建索引,数据量较小时没有必要付出索引代价 2. 频繁进行查找操作而不是更新删除插入操作,此时更适合使用索引 固定集合: mongodb中可以创建大小固定的集合,称之为固定集合。 特点: 1.插入速度更快,顺序查找更快 2.可以控制集合的空间大小 3.能够自动淘汰早期数据 使用: 日志处理 临时缓存 创建: db.createCollection(collection,{capped:true,size:10000,max:1000}) 参数: capped:true: 创建固定集合 size:10000: 固定集合的大小 字节数 max :1000: 表示最多多少条文档 创建一个固定集合 db.createCollection('log',{capped:true,size:10000,max:3})

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册