python面试

简介: 面试题

1.python的数据结构有哪些,在这些数据结构中哪些是可变的,哪些是不可变的?
答:python的数据结构有:str,list,dict,bool,int,set,touple,在这些数据结构中list,dict,set为可变数据类型,其余的为不可变数据类型。

  1. 装饰器的作用

答:作为日志,函数计数,权限校验,缓存等。

  1. python的面向对象

答:面向对象的三大特性:封装,继承,多态;封装是指通过私有属性和私有方法的方式实现封装;继承是指子类拥有父类的特性,提高代码的重用性;多态指的是同一个方法不同的对象调用,产生不同的行为。

4.python的设计模式有哪些?
答:工厂模式,单例模式;工厂模式即将创建者和调用者分开,例如:电脑的组装,汽车的生产(不同的厂家生产出不同的汽车)。

5.python中什么是闭包?闭包和装饰器的区别?
答:1.函数嵌套;2.内部函数使用外部函数的变量或参数;3.外部函数返回内部函数名;装饰器——装饰器是一个闭包函数,在不修改代码的前提下,给已有函数增加额外的功能,不同点在于调用时,参数为函数类型;

6.python中的异步celery
答:Celery主要由三部分组成,消息中间件broker,任务执行单元Worker(消费者),任务执行结果存储Result;消息中间件接受生产者发送的任务信息,存进队列再分配给消费者,能做为消息中间件的有Rabbit MQ,Redis等;能做为执行结果存储Result的有Redis,RabbitMQ等。

7.python中的深拷贝和浅拷贝
答:深拷贝和浅拷贝的区别在于:当拷贝的对象中可变对象中的元素发生变化,拷贝得到的对象也会发生变化,而深拷贝则不会;

8.python中的多进程和多线程
答:1.进程是资源分配的最小单位,线程是CPU调度的基本单位;2.进程之间不共享全局变量;3.进程是并发执行的,线程是并行;4.进程是操作CPU密集型数据,线程是操作IO密集型数据;5.由于线程共享全局变量,因此会出现线程安全问题,出现脏数据,解决方法:线程等待,加锁。

9.python中全局解释器锁GIL
答:python的全局解释器锁GIL——允许一个线程持有Python解释器的控制权,因此python中的多线程的并发并不是真正的并发;

10.Django中如何实现状态保持?
答:cookie和session以及jwt;cookie和session的区别:1.cookie数据存储在客户端浏览器上,session存储在服务器上;2.session在一定时间内保存在服务器上,当访问量增加时,考虑服务器性能,使用cookie;3.session依赖cookie;4.cookie的数据存储太小,4k左右;5.cookie不安全,因此需要将一些重要的登录信息存储在session中;
jwt的原理:第一次认证通过用户名密码,服务端签发一个json格式的token。后续客户端的请求都携带这个token,服务端仅需要解析这个token,来判别客户端的身份和合法性;jwt包含三个部分:header,payload,signature;

11.python中的协程
答:1.一个线程可以有多个协程,协程是异步机制;2.协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态;一般使用gevent库,如果是非阻塞异步并发的一般都是使用协程。

12.python中TCP为什么需要等待2msl的时间?
答:1.保证客户端发送的最后一个ACK报文能够到达服务器,因为这个报文可能丢失;2.防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中;

13.为什么建立连接是三次握手,关闭连接确是四次挥手呢?
答:建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

14.如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

15.diango中orm和原生sql的优缺点
答:orm——对象关系映射,开发速度快,操作简单,但是处理多表联查等复杂操作,orm语法会变得复杂;sql语句开发速度慢,执行速度快,性能强。

16.django中http的执行流程
答:1.一个http请求打包成HttpRequest对象;
2.将该对象传递给Request中间件处理,如果该中间件返回了Response,则直接传递给response中间件做收尾处理;
3.Resquest中间件将访问URL配置,确定访问哪一个路由路径,但是在还没传给View视图的时候,系统会把request传递给View中间件处理器,如果该中间件返回Response,那么该Response直接传递给Response做收尾处理;
4.将执行对应的View视图并返回给Response中间件,如果在这个过程中发生异常并抛出错误,会传递给Exception中间件处理;否则返回视图模板结束。

17.django中的中间件有哪些
答:1.process_request;
2.process_view;
3.process_response;
4.process_exception;
5.process_template

18,django中的CSRF(跨站请求伪造)
答:用户登录了正常的网站A, 然后再访问某恶意网站,该恶意网站上有一个指向网站A的链接,那么当用户点击该链接时,则恶意网站能成功向网站A发起一次请求,实际这个请求并不是用户想发的,而是伪造的,而网站A并不知道。攻击者利用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等。

19.django中的FBV和CBV
答:FBV——在视图里面使用函数处理请求;CBV——在视图里面使用类处理请求(提高代码复用性,针对不同的HTTP请求,不需要通过if判断,提高代码的可读性)

20.mysql的更新流程(update)
答:1.从buffer pool中查看是否有这条数据,如果不存在,就从磁盘中加载到缓冲池,然后对这行记录进行加锁;2.将更新记录的旧值写入到undolog中以便回滚;3.更新buffer pool中的数据;4.执行器把数据的修改写入到redolog中;5.在提交事务时,会将redolog写入到磁盘中;6.执行器会生成更新的binlog,然后写入到磁盘binlog文件中;7.执行器将本次更新对应的binlog文件写入都redolog中,同时在redolog中写入一个commit标记;

21.Python中的三大器(迭代器,生成器,装饰器)
答:迭代器——对可迭代对象就行迭代的方式,并且记录当前迭代进行到的位置;可迭代对象指的是实现__iter__和__next__方法;通过内置函数next或实例对象的__next__方法,获取当前迭代的值;迭代器一定是可迭代对象,可迭代对象不一定是迭代器;如果可迭代对象遍历完后继续调用next(),则会抛出:StopIteration异常。
生成器——一边循环一边计算的机制,被称为生成器,想要得到庞大的数据,又想让它占用空间少,那就用生成器;生成器的实现方法——1.还有yiel关键字;2.使用生成器推导式;
生成器的工作原理:1.生成器迭代的关键是含有next()方法;重复调用next()方法,直到捕获一个异常;2.yield记录返回位置,下次迭代代码从yield的下一句执行

22.微服务的优缺点
答:优点:解耦,服务拆分,当有一个服务宕机时,不会影响其他的服务运行,可以保证主业务的流程;缺点:架构复杂,开发难度较大,数据聚合很难;如果想要聚合两个服务之间的数据,可以使用数仓的模式;

23.如何确保同一网站不能同时登陆
答:单点登录;将微信unionid,手机号关联同一个账号,每次登录时,只需要判断该用户是否存在即可;

24.JWT在什么情况下使用?
答:首先http协议是一种无状态的协议,不能记录用户当前状态,因此引入了cookie和session,cookie存储在浏览器,session存储在服务器端,session需要依赖cookie,会将sessionid存储在cookie中,如果用户过多就会需要去维护,并且需要删除一些过期数据,效率太低,因此引入了jwt,jwt包含三部分:headers,payload,signature;其实jwt是一种加密手段,使用jwt只需要用户在登录时,携带生成的token值,服务端会使用加盐模式进行解密;

25.mysql的存储引擎都有哪些?
答:Innodb,MyIsam,Memory;
Innodb支持外键,支持事务;MyIsam不支持外键,不支持事务;
Innodb和MyIsam采用的是B+Tree,Memory采用的是Hash索引;

26.数据库的优化方式
答:1.在进行表设计时,可适度增加冗余字段(反范式设计),减少JOIN操作;
2.多字段表可以进行垂直分表优化,多数据表可以进行水平分表优化;
3.选择恰当的数据类型,如整型的选择;
4.对较频繁的作为查询条件的字段创建索引;唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;更新非常频繁的字段不适合创建索引;
5.编写SQL时使用上面的方式对SQL语句进行优化;
6.使用慢查询工具找出效率低下的SQL语句进行优化;
7.构建缓存,减少数据库磁盘操作;
8.可以考虑结合使用内存型数据库,如Redis,进行混合存储。

相关文章
|
22天前
|
中间件 数据库连接 API
Python面试:FastAPI框架原理与实战
【4月更文挑战第18天】FastAPI是受欢迎的高性能Python Web框架,以其简洁的API设计、强大的类型提示和优秀的文档生成能力著称。本文将探讨FastAPI面试中的常见问题,包括路由、响应对象、Pydantic模型、数据库操作、中间件和错误处理。同时,还会指出一些易错点,如类型提示不准确、依赖注入误解,并提供实战代码示例。通过理解和实践FastAPI,可以在面试中展示出色的Web开发技能。
29 1
|
22天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
28 2
|
22天前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
34 2
|
22天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
27 1
|
20天前
|
算法 测试技术 持续交付
Python面试:代码审查与重构相关问题
【4月更文挑战第19天】本文讨论了Python面试中常被问到的代码审查和重构主题。代码审查涉及理解审查目的、使用工具(如GitHub PR)和遵循PEP 8规范。要避免仅关注表面错误,忽视可读性,同时提供具体反馈。重构时,要理解其原则,熟悉各种手法,并借助单元测试和持续集成保证质量。遵循小步快跑原则,评估技术债务,记录重构步骤。文中通过示例展示了如何将原始代码重构为更清晰的抽象类结构,以提高代码组织性。掌握这些技能对于面试成功至关重要。
13 0
|
20天前
|
缓存 监控 算法
Python性能优化面试:代码级、架构级与系统级优化
【4月更文挑战第19天】本文探讨了Python性能优化面试的重点,包括代码级、架构级和系统级优化。代码级优化涉及时间复杂度、空间复杂度分析,使用内置数据结构和性能分析工具。易错点包括过度优化和滥用全局变量。架构级优化关注异步编程、缓存策略和分布式系统,强调合理利用异步和缓存。系统级优化则涵盖操作系统原理、Python虚拟机优化和服务器调优,需注意监控系统资源和使用编译器加速。面试者应全面理解这些层面,以提高程序性能和面试竞争力。
18 1
Python性能优化面试:代码级、架构级与系统级优化
|
21天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
26 0
|
21天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
22 0
|
22天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
18 1
Flask框架在Python面试中的应用与实战
|
23天前
|
监控 负载均衡 API
Python模型部署与服务化:面试中的热门话题
【4月更文挑战第17天】本文探讨了Python模型部署与服务化的面试重点,包括模型导出、API设计、服务化平台、性能优化、安全与合规等方面。强调了Flask、FastAPI等本地部署,以及阿里云、AWS等云服务部署。易错点涉及环境差异、服务稳定性和版本管理。提供Flask部署模型服务和阿里云SLS日志服务监控的代码示例,建议面试者全面掌握相关知识和实践经验。
31 9