关于Python的33个面试题及答案

  1. Django如何工作?
    Django可以分解成许多组件:
    Models.py文件:此文件通过将单行代码扩展到完整数据库表并添加预构建管理部分来管理内容来定义数据模型。
    Urls.py文件:它使用正则表达式捕获URL模式以进行处理。
    Views.py文件:它是Django的主要部分。 实际处理在视图中发生。
    当访问者登陆Django页面时,首先Django会检查创建的URL模式并使用该信息来检索视图。 在该视图处理请求之后,在必要时查询数据库,并将请求的信息传递给模板。
    之后,模板以创建的布局呈现数据并显示页面。

2.Django的继承风格是什么?
Django有三种可能的继承样式:

  1. 抽象基类:当只希望父类包含不想为每个子模型键入的信息时,使用此样式。

  2. 多表继承:如果要对现有模型进行子类化并且需要每个模型都有其数据库表,则使用此样式。

  3. 代理模型:如果您只想修改模型的Python级别行为而不更改模型的字段,则使用此样式。

  4. Django中间件的典型用法是什么?
    会话管理;
    使用身份验证;
    跨站点请求伪造保护;
    内容gzip压缩;

  5. 简述什么是FBV和CBV
    FBV(function base views)就是在视图函面使用函数处理请求
    CBV(class base views)就是在视图里面使用类处理请求

  6. 谈一谈你对ORM的理解
    ORM是“对象-关系-映射”的简称。
    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

  7. 什么是中间件并简述其作用
    中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
    中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。

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

8.用过哪些中间件和作用?
SecurityMiddleware:为请求/相应提供了几种安全改进
SessionMiddleware:开启会话支持
CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的url
CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值
AuthenticationMiddleware:向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户
MessageMiddleware:开启基于Cookie和会话的消息支持
XFrameOptionsMiddleware:对点击劫持的保护

9.什么是PEP 8?
PEP 8是一种编码约定,它规定了一组指南,关于如何编写更易读的Python代码。这是一组规则,用于指导如何格式化Python代码以最大化其可读性。 将代码编写到规范有助于创建重要的代码库,有许多编写器,更加统一和可预测。

10.Python中如何删除字符串中的空格?
要从字符串中删除空格和尾随空格,Python提供了strip([str])内置函数。 删除空格(如果存在)后,此函数返回字符串的副本。 否则返回原始字符串。

11.django的请求生命周期
请求来了先到uwsgi,把请求做一部分分装给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给uwsgi,在返回给用户。

12.uwsgi和wsgi
wsgi:是web服务器网关接口,是pyhton应用程序或框架和web服务器之间的一种接口,其广泛使用的是django框架。
uwsgi:是一个web服务器,它实现了wsgi协议,Nginx中HttpUwsgiModule的作用是与Uwsgi服务器进行交换

  1. 列举django的内置组件?
    #1.Admin是对model中对应的数据表进行增删改查提供的组件
    #2.model组件:负责操作数据库
    #3.form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示
    #4.ModelForm组件即用于数据库操作,也可用于用户请求的验证

  2. 说一下Django,MIDDLEWARES中间件的作用和应用场景?
    #中间件是介于request与response处理之间的一道处理过程,用于在全局范围内改变Django的输入和输出。
    #简单的来说中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作
    #例如:
    #1.Django项目中默认启用了csrf保护,每次请求时通过CSRF中间件检查请求中是否有正确#token值
    #2.当用户在页面上发送请求时,通过自定义的认证中间件,判断用户是否已经登陆,未登陆就去登陆。
    #3.当有用户请求过来时,判断用户是否在白名单或者在黑名单里

  3. django中csrf的实现机制?
    #第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
    #第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}
    #第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

  4. 什么是RPC?
    #远程过程调用 (RPC) 是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务
    #1.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
    #2.首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
    #2.在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,
    #3.最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

17 . 为什么要使用django rest framework框架?
#能自动生成符合 RESTful 规范的 API
#1.在开发REST API的视图中,虽然每个视图具体操作的数据不同,
#但增、删、改、查的实现流程基本一样,这部分的代码可以简写
#2.在序列化与反序列化时,虽然操作的数据不同,但是执行的过程却相似,这部分的代码也可以简写
#REST framework可以帮助简化上述两部分的代码编写,大大提高REST API的开发速度

18.git工作流程?
1、git clone 克隆远程资源到本地目录,作为工作目录;
2、然后在本地的克隆目录上添加或修改文件;
3、如果远程修改了,需要同步远程的内容,直接git pull就可以更新本地的文件;
4、本地在修改之后,可以通过git status 查看修改的文件。然后使用git add 添加修改的文件暂到缓冲区;
5、在添加之后,可以使用git commit添加到当前的工作区;
6、在修改完成后,如果发现错误,可以撤回提交并再次修改并提交;
7、git push将本地的修改推送到远程的git服务器。

19.数据库设计的步骤有哪些
1、需求分析:了解用户的数据需求、处理需求、安全性及完整性要求;
2、概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型;
3、逻辑结构设计:设计系统的模式和外模式,对于关系模型主要是基本表和视图;
4、物理结构设计:设计数据的存储结构和存取方法,如索引的设计;
5、系统实施:组织数据入库、编制应用程序、试运行;
6、运行维护:系统投入运行,长期的维护工作。

20.docker的命令?
docker run 首次启动
docker images 列出镜像
docker pull 拉取镜像
docker search 搜索镜像
docker save 保存镜像
docker load 解压镜像
docker ps 列出运行中的容器

21.当消费者意外终止程序,会造成消息的丢失,怎么处理?
实现消息确认机制,有两步骤:
basic_consume d的no_ack参数设置为False
在消息处理函数中,添加ch.basic_ack(delivery_tag=method.delivery_tag)进行消息确认

22.消息队列的公平调度?
解决问题思路:消费者确定消息之后,RabbitMQ再给它分配消息,如果此时消费者正在忙碌,应该将消息分配给其他的消费者,代码如何告诉RabbitMQ:
Channl.basic_qos(prefetch_count=1)

23.如何保持消息的持久化?
1,确保RabbitMQ不会丢失队列,增加durable=True参数
2,设置消息的持久化存储properties = pika.BasicProperties(delivery_mode=2)

24.基本命令
创建虚拟环境 mkvirtualenv -p python3 项目名
创建工程 django-admin startproject 项目名
创建应用 python …/…/manage.py startapp users

  1. 非关系型数据库和关系型数据库区别,优势比较?
    非关系型数据库的优势:
    性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
    可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
    关系型数据库的优势:
    复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
    事务支持:使得对于安全性能很高的数据访问要求得以实现。
    其他:
    1.对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
    2.NOSQL数据库慢慢开始具备SQL数据库的一些复杂查询功能,比如MongoDB。
    3.对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国,比如Redis set nx。

26.关系型数据库和非关系型数据库区别
关系型数据库
优点
容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
使用方便:通用的SQL语言使得操作关系型数据库非常方便;
易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
支持SQL,可用于复杂的查询。
支持事务
缺点
为了维护一致性所付出的巨大代价就是其读写性能比较差;
固定的表结构;
不支持高并发读写需求;
不支持海量数据的高效率读写
非关系型数据库
使用键值对存储数据;
分布式;
优点
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点
不提供sql支持

27.提高python运行效率的方法?
1、使用生成器,因为可以节约大量内存
2、循环代码优化,避免过多重复代码的执行
3、核心模块用Cython PyPy等,提高效率
4、多进程、多线程、协程
5、多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

  1. 简述mysql和redis区别
    redis: 内存型非关系数据库,数据保存在内存中,速度快
    mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢

  2. 分别从前端、后端、数据库阐述web项目的性能优化?
    前端优化:
    1、减少http请求、例如制作精灵图
    2、html和CSS放在页面上部,javascript放在页面下面,因为js加载比HTML和Css加载慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差
    后端优化:
    1、缓存存储读写次数高,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
    2、异步方式,如果有耗时操作,可以采用异步,比如celery
    3、代码优化,避免循环和判断次数太多,如果多个if else判断,优先判断最有可能先发生的情况
    数据库优化:
    1、如有条件,数据可以存放于redis,读取速度快
    2、建立索引、外键等

  3. 简述多线程、多进程
    进程:
    1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
    2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
    线程:
    1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
    2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
    应用:
    IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间
    CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

  4. find和grep
    grep命令是一种强大的文本搜索工具,grep所有内容串可以是正则表达式,允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。
    find通常用来在特定的目录下搜索符合条件的文件,也可以用来搜索特定用户属主的文件。

  5. 描述数组、链表、队列、堆栈的区别?
    数组和链表是数据存储方式的概念,数组在连续的空间中存储数据,而链表可以在非连续的空间中存储数据;
    队列和堆栈是描述数据存取方式的概念,队列是先进先出,而堆栈是后进先出;队列和堆栈可以用数组来实现,也可以用链表实现。

  6. ngnix的正向代理与反向代理?
    正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
    反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值