记录每天一道python面试题

版权声明:有一些面试题来源网络,只是进行整理,如有侵权,请联系我进行修改

20200613

Python3 一行代码实现1-100的求和:

# Python3 一行代码实现1-100的求和:
print(sum([i for i in range(101)]))
# 描述
sum() 方法对系列进行求和计算。
# 语法
以下是 sum() 方法的语法:
sum(iterable[, start])

# 参数
iterable -- 可迭代对象,如:列表、元组、集合。
start -- 指定相加的参数,如果没有设置这个值,默认为0sum([0,1,2])  
3  
>>> sum((2, 3, 4), 1)        # 元组计算总和后再加 1
10
>>> sum([0,1,2,3,4], 2)      # 列表计算总和后再加 2
12

20200614

Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

记录每天一道python面试题_第1张图片

记录每天一道python面试题_第2张图片

记录每天一道python面试题_第3张图片

记录每天一道python面试题_第4张图片

记录每天一道python面试题_第5张图片

记录每天一道python面试题_第6张图片

# Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

1. 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变)赋值就是很好的体现,只是指向了这个遍历的内存空间,当它改变是你也会随之改变copy.copy()方法属于浅拷贝


2.深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变)属于真正意义上的拷贝,在内存开辟了一个新的空间,不会随之改变,使用copy模块里面的copy.deepcopy()方法,深拷贝,只要拷贝时有一个是可变类型就可以

如果copy.copy拷贝的是元组,那么它不会进行浅拷贝,仅仅是指向,原因:因为元组是不可变类型,那么意味数据一定不能修改,因此copy.copy的时候它自动判断,如果是元组它就是执行了它

如果用copy.copy、copy.deeopcopy对一个全部都是不可变类型的数据进行拷贝,那么它们结果相同,都是引用指向,如果拷贝的是一个拥有,可变类型的数据,即使元组时最顶层,那么deepcopy依然是 深拷贝,而copy.copy还是指向

20200615

介绍一下Python下range()函数的用法?

# 介绍一下Python下range()函数的用法?
在python2中是生成是生成一个列表里面存放这些值,python3做了改进之后是占用极少空间不是生成列表而是生成这个值的方式,当你需要的时候就去取,经常用在for in range()循环中

20200616

谈下python的GIL

# 谈下python的GIL

GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。

多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

20200617

什么是lambda函数?它有什么好处?

# 什么是lambda函数?它有什么好处?

lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数

lambda函数:首要用途是指点短小的回调函数

lambda [arguments]:expression

>>> a=lambdax,y:x+y

>>> a(3,11)

20200621

Python中的局部变量和全局变量是什么?

# Python中的局部变量和全局变量是什么?

全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。

局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

20200623

介绍一下except的用法和作用?

# 介绍一下except的用法和作用?
tryexceptexcept[else][finally]

执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。

20200624

Python是如何进行内存管理的?

# Python是如何进行内存管理的?

# 从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

# 一、对象的引用计数机制

# Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

# 引用计数增加的情况:

# 1,一个对象分配一个新名称

# 2,将其放入一个容器中(如列表、元组或字典)

# 引用计数减少的情况:

# 1,使用del语句对对象别名显示的销毁

# 2,引用超出作用域或被重新赋值

# sys.getrefcount( )函数可以获得对象的当前引用计数

# 多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

# 二、垃圾回收

# 1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

# 2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

# 三、内存池机制

# Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

# 1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

# 2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。

# 3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

20200625

负索引是什么?

 # 负索引是什么?

# Python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。

20200626

elect和epoll的区别?

# elect和epoll的区别?

# a. select实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。

# b. select每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。

20200627

文件操作是xreadlines和readlines的区别?

# readlines()是把文件的全部内容读到内存,并解析成一个list,当文件的体积很大的时候,需要占用很多内存

# xreadlines()则是直接返回一个iter(file)迭代器,在python 2.3之后已经不推荐这种表示方法了,直接使用for循环迭代文件对象

20200628

列举布尔值为False的常见值?

# 列举布尔值为False的常见值?
0,[],(),{},'',False,None

20200629

is 和==的区别?

is 比较的是id
== 比较的是值

20200630

简述Django请求生命周期

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
#1.wsgi,请求封装后交给web框架 (Flask、Django)     
#2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session - 
#3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数    
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 - 
#5.中间件,对响应的数据进行处理。 
#6.wsgi,将响应的内容发送给浏览器。

20200701

django中间件方法:

记录每天一道python面试题_第7张图片
记录每天一道python面试题_第8张图片

# 在这里插入代码片Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预。
# 1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。 1.def init(): 2. pass
# 2.处理请求前:在每个请求上调用,返回 None 或 HttpResponse 对象。 1.def process_request(request): 2. pass
# 3.处理视图前:在每个请求上调用,返回 None 或 HttpResponse 对象。
# ''1.def process_view(request, view_func, view_args, view_kwargs): 2. pass"
# 4.处理模板响应前:在每个请求上调用,返回实现了 render 方法的响应对象。
# "1.def process_template_response(request, " response):2. pass
# 5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回 HttpResponse 对象。
# "1.def process_response(request, " response): 2. pass
# 6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个 HttpResponse 对象。1def process_exception(request,exception): 2pass

20200702

MVC模式和MVT模式:

# 所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完用户的请求

# Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
# M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
# T 代表模板(Template):负责如何把页面展示给用户(html)。
# V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
# 除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template

# 一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户

20200703

Django项目如何实现高并发?

# 可以从如下几个角度讲:

使用nginx进行反向代理和负载均衡
数据库分库和读写分离(含主从复制)
使用nosql数据库比如redis缓存热点数据
耗时任务(比如发邮件或写入操作)交由celery异步处理
使用Gzip或django-compressor压缩静态文件
使用CDN加速静态文件访问

20200704

什么是wsgi,uwsgi,uWSGI?

# WSGI (Web Server Gateway Interface)

Web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架。实现wsgi协议的模块有:

1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)

2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)

uwsgi:

与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型

uWSGI:

是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,

20200705

列举5个常用的Django第三方库

# django-allauth - 用户注册登录管理
1. django-allauth 是一个能够解决你的注册和认证需求的、可重用的 Django 应用。无论你需要构建本地注册系统还是社交账户注册系统,django-allauth 都能够帮你做到。
这个应用支持多种认证体系,比如用户名或电子邮件。一旦用户注册成功,它还可以提供从无需认证到电子邮件认证的多种账户验证的策略。同时,它也支持多种社交账户和电子邮件账户。它还支持插拔式注册表单,可让用户在注册时回答一些附加问题。
django-allauth 支持多于 20 种认证提供者,包括 Facebook、Google、微博 和 微信。如果你发现了一个它不支持的社交网站,很有可能通过第三方插件提供该网站的接入支持。这个项目还支持自定义后端,可以支持自定义的认证方式,对每个有定制认证需求的人来说这都很棒。
django-allauth 易于配置,且有完善的文档。该项目通过了很多测试,所以你可以相信它的所有部件都会正常运作。

# django-haystack - 全文检索引擎
全文检索不同于标题的简单匹配,是一件技术难度比较高的活。当文章很长时,你很难找到精确的匹配,同时搜索全文需要消耗大量的计算资源。有了haystack,你可以直接django中直接添加搜索功能,像搜索标题一样搜索全文,而无需关注索引建立、搜索解析等技术问题。haystack支持多种搜索引擎,不仅仅是whoosh,使用solr、elastic search等搜索,也可通过haystack,而且直接切换引擎即可,甚至无需修改搜索代码。

# django-ckeditor - 富文本编辑器
django没有提供官方的富文本编辑器,而ckeditor恰好是内容型网站后台管理中不可或缺的控件。ckeditor是一款基于javascript,使用非常广泛的开源网页编辑器。它允许用户直接编写图文,插入列表和表格,并支持文本和HTML格式代码输入。

# django-imagekit - 自动化处理图像
现代网站开发一般免不了处理一些图片,例如头像、用户上传的图片等内容。django-imagekit 帮你配合 django 的 model 模块自动完成图片的裁剪、压缩、生成缩略图、加水印等一系列图片相关的操作。

# django-crispy-forms - 快速美化django表单首选
大大增强 Django 内置的表单功能,Django 内置的表单生成原生的 HTML 表单代码还可以,但为其设置样式是一个麻烦的事情。django-crispy-forms 帮助你使用一行代码渲染一个 Bootstrap 样式的表单,当然它还支持其它一些热门的 CSS 框架样式的渲染。

# django-debug-toolbar - django项目调试利器
该工具给django web开发提供了强大的调试功能,包括查看执行的sql语句,db查询次数,request,headers,调试概览等。 通过安装插件Pympler,你还可以了解内存使用情况。

# django-celery - 执行异步任务或定时任务的最佳选择

20200706

如何从数据表中获取一个随机对象?

# 可以使用order_by('?').first()随机获取一个对象
def get_random_object():
    return MyModel.objects.order_by("?").first()

20200707

简述什么是FBV和CBV?

FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
- .提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- .可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

20200708

select_related和prefetch_related的区别?

前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能

select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询

20200709

cookie和session的区别:

.cookie:
cookie是保存在浏览器端的键值对,可以用来做用户认证

.session:
将用户的会话信息保存在服务端,key值是随机产生的字符串,value值是session的内容
依赖于cookie将每个用户的随机字符串保存到用户浏览器上
Django中session默认保存在数据库中:django_session表
flask,session默认将加密的数据写在用户的cookie中

20200710

接口的幂等性是什么意思?

#1.是系统的接口对外一种承诺(而不是实现)
#2.承诺只要调用接口成功,外部多次调用对系统的影响都是一致的,不会对资源重复操作

20200711

谈谈你对restful规范的认识?

#首先restful是一种软件架构风格或者说是一种设计风格,并不是标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。     
#就像设计模式一样,并不是一定要遵循这些原则,而是基于这个风格设计的软件可以更简洁,更#有层次,我们可以根据开发的实际情况,做相应的改变。
#它里面提到了一些规范,例如:
#1.restful 提倡面向资源编程,在url接口中尽量要使用名词,不要使用动词             
#2、在url接口中推荐使用Https协议,让网络接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,
#因此加密的详细内容就需要SSL(安全套接层协议))                          
#3、在url中可以体现版本号
#https://v1.bootcss.com/mycss
#不同的版本可以有不同的接口,使其更加简洁,清晰             
#4、url中可以体现是否是API接口 
#https://www.bootcss.com/api/mycss            
#5、url中可以添加条件去筛选匹配
#https://www.bootcss.com/v1/mycss?page=3             
#6、可以根据Http不同的method,进行不同的资源操作
#(5种方法:GET / POST / PUT / DELETE / PATCH)             
#7、响应式应该设置状态码
#8、有返回值,而且格式为统一的json格式             
#9、返回错误信息
#返回值携带错误信息             
#10、返回结果中要提供帮助链接,即API最好做到Hypermedia
#如果遇到需要跳转的情况 携带调转接口的URL
      ret = {
            code: 1000,
            data:{
            id:1,
            name:'小强',
            depart_id:http://www.luffycity.com/api/v1/depart/8/
            }
    }

20200712

解释blank和null

# blank
设置为True时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。如果为True,字段允许为空,默认不允许

# null
设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField型字段可以为空时,需要将blank,null均设为True。
如果为True,空值将会被存储为NULL,默认为False。
如果想设置BooleanField为空时可以选用NullBooleanField型字段。


# null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。NULL represents non-existent data.
# blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填。比如 admin 界面下增加 model 一条记录的时候。直观的看到就是该字段不是粗体

20200713

说说看Django信号(Signals)的工作原理, 主要应用场景及内置信号

Django 提供一个了“信号分发器”机制,允许解耦的应用在框架的其它地方发生操作时会被通知到。 通俗而讲Django信号的工作原理就是当某个事件发生的时候会发出一个信号(signals), 而监听这个信号的函数(receivers)就会立即执行。Django信号的应用场景很多,尤其是用于不同模型或程序间的联动。常见例子包括创建User对象实例时创建一对一关系的UserProfile对象实例,或者每当用户下订单时触发给管理员发邮件的动作。

Django内置信号包括:

django.db.models.signals.pre_save & post_save在模型调用 save()方法之前或之后发送。
django.db.models.signals.pre_init& post_init在模型调用_init_方法之前或之后发送。
django.db.models.signals.pre_delete & post_delete在模型调用delete()方法或查询集调用delete() 方法之前或之后发送。
django.db.models.signals.m2m_changed在模型多对多关系改变后发送。
django.core.signals.request_started & request_finished Django建立或关闭HTTP 请求时发送。

20200714

drf继承过哪些视图类?以及他们之间的区别?

第一种:APIView
     第一种遵循了CBV的模式,里面的功能比较多但是需要自己写的代码也有很多
     提供了免除csrf认证,版本处理、认证、权限、节流、解析器、筛选器、分页、序列化、渲染器
 ​
 ​
 第二种:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
     第二种则在第一种的基础上,封装了许多我们需要自己的写的代码,许多功能的实现只需要给专属的变量名赋值就可以实现该功能
 ​
 ​
 第三种:GenericViewSet、ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
     第三种则重构了APIView中的as_view()方法,结合请求方法和不同Mixin类的方法名从而进行执行不同的功能。与前面两种最主要的区别是url路由中as_view()方法中需要传值。
     目前使用的主要目的是把第二种的bug(查询全部数据的功能和查询单个数据的功能无法在一个类中实现)实现在一个类中!

20200715

django请求的生命周期?

当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中.
. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,
一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了.
. 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端.
. 客户端浏览器接收到返回的数据,经过渲染后显示给用户.

前端请求—>nginx—>uwsgi.>中间件—>url路由—->view试图—>orm—->拿到数据返回给view—->试图将数据渲染到模版中拿到字符串—->中间件—>uwsgi—->nginx—->前端渲染

20200716

简述jsonp及实现原理?

JSONP是用来解决跨域请求问题的 
跨域:协议 域名 端口号有一个不一样就是跨域 
实现原理: 
script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

20200717

django的request对象是在什么时候创建的?

当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个HttpResponse 对象。

20200718

列举django orm 中所有的方法(QuerySet对象的所有方法)

返回Query Set对象的方法有: 
* all() 
* filter() 
* exclude() 
* order_by() 
* reverse() 
* dictinct()

特殊的QuerySet: 
* values() 返回一个可迭代的字典序列 
* values_list() 返回一个可迭代的元祖序列

返回具体对象的: 
* get() 
* first() 
* last()

返回布尔值的方法有: 
* existe()

返回数学的方法有: 
* count( )

20200719

什么是split函数?

split()函数用于在Python中分隔给定的字符串

20200720

new() 与 init()的区别?

# __new__()用于创建实例,所以该方法是在实例创建之前被调用,它是类级别的方法,是个静态方法;

# __init__() 用于初始化实例,所以该方法是在实例对象创建后被调用,它是实例级别的方法,用于设置对象属性的一些初始值。

 由此可知,__new__()在__init__() 之前被调用。如果__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例,如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。

20200721

字典推导式

d = {key: value for (key, value) in iterable}
列表推导式
l = [x for x in range(100) if x%3 is 0]

你可能感兴趣的:(python面试题,python,面试,django,数据库)