| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 2021 python 常见面试题总结 -> 正文阅读 |
|
[Python知识库]2021 python 常见面试题总结 |
** python 常见面试题总结** 深浅拷贝,赋值深拷贝 完全拷贝了父对象和子对象 相当于在本地拷贝了一个副本 副本的变化不会影响到源文件中的数据 ***浅拷贝***拷贝父对象,但是不会拷贝父对象的子对象 相当于是内存指针调用 副本变化会改变原数据 ***赋值:***其实就是对象的引用。 python 如何实现多线程线程是一个轻量级的进程,多线程允许依次执行多个线程 GIL锁(全局解释锁)确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,这样就会产生并行执行的错觉,但是实际上,只是线程轮流在CPU上执行 threading.local的作用?线程内的全局变量,只在同一个线程内可以调用,本质上是对全局字典对象管理类的一个封装 *args和**kwargs的区别(缺省参数)*args传递元组/列表 不定长参数 **kwargs传递字典 关键字参数 ***args和*kwargs都是用于函数中传递参数的,*args传递的是非键值对的参数,*kwargs传递的是带键值对的参数,如果还有普通参数需要传递,那么应该先传递普通的参数。 计算文件中的大写字母数isupper() 检查是否时大写 islower() 检查是否时小写 istitle() 检查是否是标题格式 @ $ 这样的符号既满足大写又满足小写 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DZpnI6sr-1633433477568)(https://www.yuanmajc.icu/img/img/image-20210927160034241.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtqtPpxj-1633433477570)(https://www.yuanmajc.icu/img/img/image-20210927155812275.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eE2bXMJo-1633433477572)(https://www.yuanmajc.icu/img/img/image-20210927160034241.png)] 如何随机打乱列表中的元素,要求不引用额外的内存空间[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QwVUNKVp-1633433477574)(https://www.yuanmajc.icu/img/img/image-20210927154523839.png)] join 和 split的区别 ?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYDhXVhN-1633433477575)(https://www.yuanmajc.icu/img/img/image-20210928185525962.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uORqDUOl-1633433477576)(https://www.yuanmajc.icu/img/img/image-20210927154917357.png)] 删除字符串多余空格[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHLPG1WJ-1633433477577)(https://www.yuanmajc.icu/img/img/image-20210927155617877.png)] http 和 https ?http: 端口 80 ? 超文本传输协议,信息明文传递 ? 连接简单,基于无状态的连接 https: ? 端口 443 ? 具有安全协议的超文本传输协议,信息ssl密文传递 ? 由ssl+http协议构成的可以进行密文传输,身份认证的网络协议 ? https协议需要到ca机构申请ssl证书,免费证书较少,高级ssl证书 需要付费 状态码2xx:200(get请求成功),201(post,put创建了一个资源),204(删除一个资源,服务器删除成功) 3xx:301(服务器永久移动,自动转发到新的位置),302(服务器临时移动,原服务器没有永久移除)俩者的最大区别为搜索引擎是否记录 4xx:400(客户端请求语法错误),403(服务器拒绝提供服务),404(客户端引用了不存在的资源) 5xx:500(服务器错误,拒绝请求),503(服务器当前不能处理客户请求,当前服务器不可用),504(请求超时,没有到达网关) 500,503,504常见场景 500:常见场景为编程语言语法错误,web脚本错误,高并发,打开文件数超过系统资源限制,一般解决思路为查看服务器nginx,python的错误日志,负载均衡,修复脚本错误 503:常见场景为服务器无法使用,一般为服务器超载或者是停机维护,解决思路为查看服务器系统资源或者确定服务器开启状态 502,504:常见场景为web服务器故障,程序进程不够,一般解决思路为查看nginx代理的问题,或者是nginx的conf配置相关 常见的HTTP方法有哪些?get:请求指定的页面信息,返回实体主体; head: 类似于get请求,只不过返回的响应中没有具体的内容,用于捕获报头; post:向指定资源提交数据进行处理请求(比如表单提交或者上传文件),。数据 被包含在请求体中。 put: 从客户端向服务端传送数据取代指定的文档的内容; delete:请求删除指定的页面; connext:HTTP1.1协议中预留给能够将连接方式改为管道方式的代理服务器; options: 允许客户端查看服务器的性能; trace:回显服务器的请求,主要用于测试或者诊断。 scrapy整体架构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B67MKmh2-1633433477578)(https://www.yuanmajc.icu/img/img/20180807172830315.png)] 流程1.引擎打开一个域名,蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。 2.引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。 3.引擎从调度那获取接下来进行爬取的页面。 4.调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。 5.当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。 6.引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。 7.蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。 8.引擎将抓取到的项目项目管道,并向调度发送请求。 系统重复第二步后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系 scrapy的去重原理 (指纹去重到底是什么原理)需要将dont_filter设置为False开启去重,默认是False; scrapy中间件有几种类scrapy的中间件理论上有三种(Schduler Middleware,Spider Middleware,Downloader Middleware),在应用上一般有以下两种
说一说redis-scrapy中redis的作用?它是将scrapy框架中Scheduler替换为redis数据库,实现队列管理共享。 优点:可以充分利用多台机器的带宽; 可以充分利用多台机器的IP地址。 scrapy和scrapy-redis的区别?scrapy是一个爬虫通用框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫,而提供了一些以redis为基础的组件 redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高 什么是主从同步?在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态 scrapy[默认深度优先]和requests的使用情况 ?requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据 scapy 底层是异步框架 twisted ,并发是最大优势 scrapy框架的运行机制 ?从start_urls里面获取第一批url发送请求,请求由请求引擎给调度器入请求对列,获取完毕后,调度器将请求对列交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理,如果提取出需要的数据,则交给管道处理,如果提取出url,则继续执行之前的步骤,直到多列里没有请求,程序结束。 什么是爬虫协议 ?Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。 Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。 爬虫常见问题UA 设置IP访问频率,如果超过一定频率,弹出验证码 通过并发识别爬虫 有些爬虫的并发是很高的,统计并发最高的IP,加入黑名单(或者直接封掉爬虫IP所在C段) 请求的时间窗口过滤统计 限制单个ip/api token的访问量 识别出合法爬虫 对http头agent进行验证,是否标记为、百度的spider,严格一点的话应该判别来源IP是否为、baidu的爬虫IP,这些IP在网上都可以找到。校验出来IP 不在白名单就可以阻止访问内容。 蜜罐资源 爬虫解析离不开正则匹配,适当在页面添加一些正常浏览器浏览访问不到的资源,一旦有ip访问,过滤下头部是不是搜素引擎的蜘蛛,不是就可以直接封了。比如说隐式链接。 破解反爬虫机制的几种方法设置下载延迟 禁止Cookie 使用user agent池 使用IP池 分布式爬取 模拟登录—浏览器登录的爬取 如何提高爬取效率 ?爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回 采用异步与多线程,扩大电脑的cpu利用率; 采用消息队列模式 提高带宽 分布式原理?多台机器多个spider 对多个 url 同时进行处理 需要计算的数据量大,任务多,一台机器搞不定或者效率极低,需要多台机器共同协作(而不是孤立地各做各的,所以需要通信),最后所有机器完成的任务汇总在一起,完成大量任务. 将一个项目拷贝到多台电脑上,同时爬取数据 分布式爬虫则是将多台主机组合起来,共同完成一个爬取任务,这将大大提高爬取的效率。 记住爬虫的本质是网络请求和数据处理,如何稳定地访问网页拿到数据,如何精准地提取出高质量的数据才是核心问题。 分布式爬虫主要解决什么问题?面对海量待抓取网页,只有采用分布式架构,才有可能在较短时间内完成一轮抓取工作。 它的开发效率是比较快而且简单的。 分布式如何判断爬虫已经停止了?request请求方式中的post、get有什么区别 ?GET一般用于获取/查询资源信息,而POST一般用于更新资源信息 get是在url中传递数据,数据放在请求头中,post是在请求体中传递数据 get安全性非常低,post安全性较高,但是get执行效率却比Post方法好 模拟登陆原理 ?因为http请求是无状态的,网站为了识别用户身份,需要通过cookie记录用户信息(用户、密码),这些信息都会在手动登陆时记录在post请求的form-data里,那么在爬虫时候只需要将这些信息添加到请求头里即可。 Session与Cookie区别和联系cookie数据保存在客户端,session数据保存在服务器端。 Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个cookie的文本文件中;而“Session”则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。但是我们一般认为cookie是不可靠的,session是可靠地,但是目前很多著名的站点也都以来cookie。有时候为了解决禁用cookie后的页面处理,通常采用url重写技术,调用session中大量有用的方法从session中获取数据后置入页面。 Cookies与Session的应用场景: 编写函数的4个原则 ?函数设计要尽量短小 函数声明要做到合理、简单、易于使用 函数参数设计应该考虑向下兼容 一个函数只做一件事情,尽量保证函数语句粒度的一致性 什么是Hash(散列函数)?散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表 python函数重载机制?函数重载主要是为了解决两个问题。
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。 好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。 那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。 好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。 python 中的闭包如果一个内部函数里,对外界作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包 运算符位运算 和 & 同1为1 其他为0 或 | 遇1为1 异或 ^ 同为0,不同为1 取反 ~ 原码 反码 补码 最左边 符号位 1为负数,0为正数 正数 原码=反码=补码 负数 原码=符号位不变,其他按位取反=反码+1 元组的解封装[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZ4D1yCq-1633433477579)(https://www.yuanmajc.icu/img/img/image-20210927165155741.png)] 定义多个变量并且赋值(1) a,b,c=1,2,3 (2) a=b=c=3 进程和线程的区别进程是资源分配的基本单位 线程是程序中执行的最小单位 进程有自己独立的内存空间,没启动一次进程,系统就会为它分配地址空间,建立数据表来维护代码段,堆栈段和数据段 线程是共享进程中的数据,使用相同的地址空间,因此cup切换一个线程花费的远比进程要小很多,同时创建一个线程的开销也比进程小很多 进程:from multiprocessing import pool 多进程适合在CPU 密集型操作(cpu 操作指令比较多,如位数多的浮点运算)。 线程:threading.Thread 多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫)。 进程之间的通信最常用的进程间通信的方式有***信号、信号量、消息队列、共享内存***。 多线程竞争线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎同步会被多个线程占用,造成数据混乱,即所谓的线程不安全。 那么怎么解决多线程竞争问题?? – 锁。 (限制多线程同时执行,保证同一时间只有一个线程执行) *锁(Lock)是Python 提供的对线程控制的对象。有 **锁的好处:**确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子操作问题。 锁在多线程和多进程中起到一个同步的作用,以保护每个线程和进程必要操作的完整执行。 锁的坏处:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了 锁的致命问题:死锁。 创建多线程或多进程,都必须要先经过主模块判断,即必须在if name==‘main’:语句之后才行,这是为了保护资源的一种强制性机制 线程安全,互斥锁?每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 同一个进程中的多线程之间是共享系统资源的,多个线程同时对一个对象进行操作,一个线程操作尚未结束,另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁,保证每个线程对该对象的操作都得到正确的结果。 同步: 多个任务之间有先后顺序执行,一个执行完下个才能执行。执行完代码后,原地等待,直至出现结果 **异步:**多个任务之间没有先后顺序,可以同时执行有时候一个任务可能要在必要的时候获取另一个 同时执行的任务的结果,这个就叫回调!执行完代码后,不等待,继续执行其他事务(常与回调机制关联) **阻塞:**如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。cpu在遇到I/O操作,进入阻塞状态,cpu切换到其他任务 **非阻塞:**如果不会卡住,可以继续执行,就是说非阻塞的。 同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。不会遇到I/O操作,cpu一直处于计算状态 **并行:**同一时刻多个任务同时在运行。 实现并行的库:multiprocessing **并发:**在同一时间间隔内多个任务都在运行,但是并不会在同一时刻同时运行,存在交替执行的情况。 实现并发的库:threading 网络中常用的I/O操作有(accept,recv,send) 协程(协程是一种更轻量级的线程)【进程里有线程,线程里有协程】 子程序切换不是线程切换,而是由程序自身控制 没有线程切换的开销,和多线程比,线程数量越多,携程的性能优势就越明显 不需要多线程的锁机制,因为只有一个线程,也不循在同时写变量的冲突,在协程中控制共享资源不加锁 具体的生产环境中,Python项目经常会使用多进程+协程的方式,规避GIL锁的问题,充分利用多核的同时又充分发挥协程高效的特性。 垃圾回收机制引用计数:创建一次,调用一次,引用计数降为0时自动进行垃圾回收 分代技术:python中默认定义了三代对象集合,索引越大,对象存活时间越长;python中使用了某些启发式算法来加速垃圾回收(越晚创建的对象越早被回收) 内存池:
内存泄漏 ,如何避免 ?由于疏忽或者错误造成程序未能释放已经不再使用的内存的情况 有del()函数的对象间的循环引用是导致内存泄漏的主凶 不使用一个对象时,使用 del object 来删除对象的引用计数就可以有效的防止内存的泄露问题,可以通过python 的gc扩展模块来查看不能回收的对象的详细信息 可以通过 sys.getrefcount(obj)来获取对象的引用计数,并且根据返回值是否为0来判断是否内存泄漏 如何在python中管理内存python中使用一个私有堆内存空间来防止所有的对象和数据结构,我们无法直接访问它。由解释器来管理它。不过使用一些核心的API我们可以访问一些Python内存管理工具控制内存的分配 调优手段手动垃圾回收 调高垃圾回收阈值 避免循环引用:手动解循环引用和使用弱引用 迭代器、生成器、装饰迭代器是一个可以记住遍历位置的对象,迭代器只能往前,不会后退 迭代器基本方法:iter() next() 字符串,元组,列表 对象都可用于创建迭代器 生成器 yield() 生成器是一个返回迭代器的函数,只能用于迭代操作,简单理解 生成器就是一个迭代器 在调用生成器过程中,每次遇到yield()会暂停并且保存当前所有的运行信息,返回yield的值,并且在下一次执行next()时从当前位置继续执行 调用一个生成器对象,返回一个迭代器对象 区别:生成器能做到迭代器能做的所有事,而且因为自动创建了iter()和next()方法,生成器显得特别简洁,而且 生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当生成器终结时,还会自动抛StopIteration 异常。 装饰器本质上是一个Python函数,它可以让已有的函数不做任何改动的情况下增加功能。非常适合有切面需求的场景,比如权限校验,日志记录和性能测试等等。如果你想要执行某个函数前记录日志或者记录时间来统计性能,又不想改动这个函数,就可以通过装饰器来实现。
read 、readline 、readlines 、xreadlines?read 读取整个文件 readline 读取下一行,使用生成器方法 readlines 读取整个文件到一个迭代器以供我们遍历 xreadlines()返回一个生成器,来循环操作文件的每一行 函数调用的时候参数的传递方式是 值传递还是引用传递?不可变参数用值传递像整数和字符串这样的不可变对象 ,是通过拷贝进行传递的,因为无论如何都不可能在原处改变不可变对象 可变参数是引用传递像列表,字典这样的对象是通过引用传递,和c语言里边的指针传递数组很类似,可变对象能在函数内部改变 为什么函数 名字可以当作参数使用?在python中一切皆是对象 函数名是函数在内存中的空间,也是一个对象 请你说说python传参传引用python 的函数传递方式使用的是引用的方式,就是将实参的地址传递给形参,执行期间实参和形参公用相同的内存单元,被调用的函数对于实形参的任何操作都等同于对实参的操作,所以实参会随着形参的变化而变化 递归函数终止条件?判断递归次数是否达到某一限定值 判断运算结果是否达到某一范围 根据设计的目的来进行选择 回调函数是如何进行通信的?把函数地址作为参数传递给另一个函数,将真个函数当作一个对象,赋值给调用的函数 python 的僵尸进程僵尸进程:子进程结束后父进程并未结束,此时子进程占用的资源(打开的文件,占用的内存)会被cpu回收,但是子进程的信息(进程号PID,运行时间,退出状态)会被保留,子进程变成僵尸进程 python2和python3的区别python3中的print 使用() python2中使用ascii编码,python3中使用utf-8编码 pytohn2中使用raw_input() python3中使用input() python2中rang(1,10)返回列表 python3中返回迭代器 Python 2有为非浮点数准备的int和long类型。int类型的最大值不能超过sys.maxint,而且这个最大值是平台相关的,可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在Python 3里,只有一种整数类型int,大多数情况下,它很像Python 2里的长整型。 python 的上下文管理器with open as f: 在内部已经实现了 python 内置数据类型 ?布尔 数字 字符串 元组 集合 列表 字典 输出内建方法?print(dir(‘a’)) 阶乘计算[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6Ut5dEn-1633433477580)(https://www.yuanmajc.icu/img/img/image-20210928200522274.png)] 单例模式
面向对象编程?面向对象是一种基于结构分析的、以数据为中心的程序设计思想。在面向对象语言中有一个有很重要东西,叫做类。 面向对象有三大特性:封装、继承、多态。 封装:将某些内容先封装到一个地方,等需要的时候再去调用 继承:即攀升类(子类)可以继承基类(父类)的方法,我们可以将多个类共有的方法提取到父类中,这样子类仅需要继承父类而不必实现每个方法 ? 多继承 ? 在python中 类可以继承多个类,在继承多个类时,它对类中的函数查找有两种当时,他对类中的函数查找有两种方式 ? 深度优先:类是经典类hi,多继承的情况下,会按照深度有限的方式查找 ? **广度优先:**类是新式类,多继承的情况下,会按照广度优先的方式查找 ? (在python3中)都默认是广度优先,但还是可以了解一下两个的区别, ? 新式类:当前类或者基类继承了object类 就叫新式类,否则就是经典 **多态:**不同的子类对象调用相同的父类方法,产生不同执行效果,可以增加代码的外部调用灵活度。父类变量能够引用子类对象,当子类中有重写父类父类方法,调用的将是子类对象 正则表达式match() 只有0位置 匹配成功才有返回 search() 扫描整个字符串进行匹配 贪婪模式、非贪婪模式?贪婪模式:<.>是贪婪匹配,会从第一个“<”开始匹配,直到最后一个“>”中间所有的字符都会匹配到,中间可能会包含“<>” 非贪婪模式*:<.*?>是非贪婪匹配,从第一个“<”开始往后,遇到的第一个“>”:结束匹配,这中间的字符串都会匹配到,但是不会有“<>” 非贪婪模式==贪婪模式后+? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXDOEsgv-1633433477581)(https://www.yuanmajc.icu/img/img/image-20210928211143440.png)] 算法时间复杂度[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEFwG43l-1633433477582)(https://www.yuanmajc.icu/img/img/image-20210928221921758.png)] MongodbMongodb id 由12个字节组成4字节 自Unix纪元以来的秒数 5字节 随机值 3字节 计数器 从随机位置开始 Mongodb 相对于 RDBMS(关系数据库管理系统) 的优势无固定结构 - MongoDB 是一个文档数据库,一个集合中可以包含不同的文档。文档的字段数、内容和大小都可以不同 单个对象的结构是清晰的 没有复杂的表连接 查询功能强大 已于扩展、调优 应用程序对象与数据库对象天然对应 使用内存存储工作集,可以更快的访问数据 为什么使用mongodb ?面向文档的数据库 任意字段的索引 复制和高可用性 自动分片 丰富的查询 就地更新快 Mongodb的专业支持 哪些场景下使用mongodb ?大数据 内存管理和交付 移动应用/社交应用 用户数据管理 数据中心
mongodb 支持的数据类型string 必须是utf8编码格式 integer 正数可以是32位或64位,取决于服务器 boolean double 双精度 存储浮点数据 min/max keys 此类型用于将值与最低和最高的BSON元素进行比较 arrays 将数组、列表、多个值存储在一个键中 timestamp 时间戳 记录文档合适被修改或创建 object 用于嵌入文档 null 存储null值 symbol 通常用于某些特定符号的语言 date 以UNIX时间格式存储当前日期或时间 objectid 存储文档的id binary data 存储二进制数据 code 将javascript代码存储到文档中 regular expression 存储正则表达式 linuxlinux 定时任务设置crontab命令用于设置周期性被执行的指令 crontab -l 查看定时任务 Redis开源 使用C语言编写 支持网络交互 可基于内存也可基于持久化的Key-Values数据库
mysql
python 打包exepyinstaller -F -w -i .py路径 pipreqs . encoding = utf8 --force -F : 可执行程序 -w : 无黑窗口 -i : 图标 python生成requirements.txt 依赖生成 :pip freeze > requirements.txt 安装 : pip install -r requirements.txt is 和 ==的区别 ?is 内存地址相同 值也必相同 == 值相同 python 字符串驻留机制:当字符串较小时,为了提高系统性能,python 会保留一个它的副本,当创建新的字符串时,直接指向该副本即可 解释型语言和编译型语言 ?解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。 用编译型语言写的程序执行之前,需要一个专门的编译过程,通过 位和字节的关系?bit就是位,也叫比特位,是计算机表示数据最小的单位 byte就是字节 1byte=8bit 1byte就是1B 一个字符=2字节 1KB=1024B 字节就是Byte,也是B 1KB=1024B 1B= 8b 字节码和机器码的区别?机器码(machine code) 通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。 用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。 机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。 8086到Pentium的机器语言指令长度可以从1字节到13字节。 尽管机器语言好像是很复杂的,然而它是有规律的。 存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来 总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。
通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode。 字节码在运行时通过JVM(JAVA虚拟机)做一次转换生成机器指令,因此能够更好的跨平台运行。 总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。 列表去重
统计如下list单词及其出现的次数。
给列表中的字典排序
在Python中读取大文件
简要描述python中 单引号、双引号、三引号的区别。单引号和双引号在使用时基本上没有什么区别,当字符串中有单引号时,最好在外面使用双引号;当有双引号时,最好在外面使用单引号。 三引号一般不常用,除了用来做注释之外,还可以用来打印多行字符串。特殊用途,是可以打印多行字符串。 如何在一个function里设置一个全局的变量。全局变量是指定义在函数外部的变量。全局变量的作用域为全局。 局部变量是指定义在函数内部的变量。局部变量的作用域为函数内,出了函数就无效了。 这里举个例子,如果把函数比作国家,那么全局就是全球,全局变量好比是阿拉伯数字,每个国家都认识。 所以,根据定义可以知道,在函数内部是无法定义一个全局变量的,只能做到修改已经定义的全局变量。 Python的最大递归层数Python的最大递归层数是可以设置的,默认的在window上的最大递归层数是 998
xrange和range的区别python2中 xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。 布尔值为False的常见值None、""、0、[]、()、{} pass的作用pass是空语句占位符,是为了保持程序结构的完整性。 什么是断言?应用场景 ?Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息。 AssertError不是在测试参数时应该抛出的错误 断言应该用于: ☆防御型的编程 确保代码的正确性 简述OSI七层网络模型OSI的概念Open System Interconnect开放系统互连参考模型,是由ISO(国际标准化组织)定义的。它是个灵活的、稳健的和可互操作的模型,并不是协议,是用来了解和设计网络体系结构的。 OSI模型的目的规范不同系统的互联标准,使两个不同的系统能够较容易的通信,而不需要改变底层的硬件或软件的逻辑。 OSI分为哪七层?OSI把网络按照层次分为七层,由下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dt0aBbUG-1633433477585)(https://www.yuanmajc.icu/img/img/v2-9d87cfe800f0c154da43fdf047bf76fe_r.jpg)] 应用层为应用软件提供接口,使应用程序能够使用网络服务 常见的应用层协议: http(80)、https(443)、 dns(53)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23) 表示层数据的解码和编码、加密和解密、压缩和解压缩 图片:jpg、gif…… 音频:mp3、wma、aac…… 视频:mp4、avi…… 会话层在设备或节点之间提供会话控制,协调通信过程,并提供3种不同的方式来组织它们之间的通信,单工、半双工、全双工。 单工:BB机,只能收不能发。 半双工:对讲机,收的时候不能发,发的时候不能收。 全双工:电话,手机,能同时收发。 传输层(TCP/UDP)负责建立端到端的连接,保证报文在端到端之间的传输。 服务点编址、分段与重组、连接控制、流量控制、差错控制。 网络层(IP) 代表:路由器为网络设备提供逻辑地址 进行路由选择、维护路由表,负责将分组数据从源端传输到目的端 数据链路层(MAC) 代表:交换机在不可靠的物理链路上,提供可靠的数据传输服务,把帧从一跳(结点)移动到另一跳(结点)。 组帧、物理编址、流量控制、差错控制、接入控制 物理层 代表:集线器负责把逐个的比特从一跳(结点)移动到另一跳(结点)。 定义接口和媒体的物理特性(线序、电压、电流) 定义比特的表示、数据传输速率、信号的传输模式 定义网络物理拓扑(网状、星型、环型、总线型等拓扑) OSI参考模型的特点及各层之间的联系重要特点:
各层之间的联系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QjpzB16-1633433477586)(https://www.yuanmajc.icu/img/img/1320725-20190606153411655-1869749290.png)] TCP传输的可靠性主要靠以下手段来保证传输ACK确认机制: 简单的说就是发送随机生成一个数字,接收端在确认收到数据,提取随机数并加1,返回发送端,告知确认收到数据包,同时也保证数据接收的唯一性 超时重传:发送方在一定时间内未收到对方的回传的ack确认码,则将数据重新发送,保证数据传输的一致性 滑动窗口 流量控制 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VeUHeckq-1633433477587)(https://www.yuanmajc.icu/img/img/image-20211004153202144.png)] 基于tcp 协议的套接字通信流程1). 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听。 2). 用 bind 函数来绑定一个端口号和 IP 地址。因为本地计算机可能有多个网址和 IP,每一个 IP 和端口有多个端口。需要指定一个 IP 和端口进行监听。 3). 服务器调用 listen 函数,使服务器的这个端口和 IP 处于监听状态,等待客户机的连接。 4). 客户机用 socket 函数建立一个套接字,设定远程 IP 和端口。 5). 客户机调用 connect 函数连接远程计算机指定的端口。 6). 服务器用 accept 函数来接受远程计算机的连接,建立起与客户机之间的通信。 7). 建立连接以后,客户机用 write 函数向 socket 中写入数据。也可以用 read 函数读取服务器发送来的数据。 8). 服务器用 read 函数读取客户机发送来的数据,也可以用 write 函数来发送数据。 9). 完成通信以后,用 close 函数关闭 socket 连接。 路由器和交换机的不同之处有哪些 ?工作层次不同: 交换机主要工作在数据链路层(第二层) 路由器工作在网络层(第三层)。 交换机转发所依据的对象时:MAC地址。(物理地址) 路由转发所依据的对象是:IP地址。(网络地址) 交换机主要用于组建局域网, 而路由主要功能是将由交换机组好的局域网相互连接起来,或者接入Internet。 交换机能做的,路由都能做。 交换机不能分割广播域,路由可以。 路由还可以提供防火墙的功能。 路由配置比交换机复杂。 交换机是看门大爷,路由是邮差。 C/S 和 B/S 架构C/S架构是一种比较早的软件架构,主要应用于局域网内。在这之前经历了集中计算模式,随着计算机网络的进步与发展,尤其是可视化工具的应用,出现过两层C/S和三层C/S架构,不过一直很流行也比较经典的是我们所要研究的两层C/S架构。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLSn8FIv-1633433477588)(https://www.yuanmajc.icu/img/img/20150415173118535.jpg)] 粘包粘包: 在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收)。如,对方第一次发送hello,第二次发送world,在接收时,应该收两次,一次是hello,一次是world,但事实上是一次收到helloworld,一次收到空,这种现象叫粘包。 原因 什么情况会发生: 1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据很小,会合到一起,产生粘包) 2、接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包) 解决方案: 一个思路是发送之前,先打个招呼,告诉对方自己要发送的字节长度,这样对方可以根据长度判断什么时候终止接受。 C/S架构的优点1**)客户端和服务器直接相连**
2)客户端可以处理一些逻辑事务
3) 客户端操作界面
C/S架构的缺点1)客户端
2)服务器
3)用户
? 4)开发成本
? 5)后期成本
B/S型模式 是C/S架构的一种改进,可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdSBDOG7-1633433477588)(https://www.yuanmajc.icu/img/img/20150415191106683.jpg)]。 B/S架构的优点1)浏览器
2)服务器
3)用户
4)成本
B/S架构的缺点1)客户端
2)服务器
C/S和B/S的不同点[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rlBx3S2J-1633433477589)(https://www.yuanmajc.icu/img/img/20150422172805449.png)] 实现同步,所有用户都能看到。
2)服务器
3)用户
4)成本
B/S架构的缺点1)客户端
2)服务器
C/S和B/S的不同点[外链图片转存中…(img-rlBx3S2J-1633433477589)] |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 17:25:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |