Python开发面试题

Python 语言

  1. 类变量和实例变量

  2. @staticmethod 和 @classmethod

  3. 闭包,装饰器,迭代器,yield,生成器,内存管理GC?

  4. staticmethod和装饰器的区别?

  5. *args**kwargs

  6. 鸭子类型

  7. @property 和 @setter

  8. 简要描述Python的垃圾回收机制(garbage collection)

  9. __new____init__的区别。

  10. Python里面如何拷贝一个对象?

  11. 自省

  12. 写一个bottle绑定 url path的 decorator 或者口述一下原理。

  13. 标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗?

  14. python适合的场景有哪些?当遇到计算密集型任务怎么办?

  15. python高并发解决方案?我希望听到twisted->tornado->gevent,能扯到golang,erlang更好

  16. 解释一下 Gevent 和 threading / multiprocessing 的关系

  17. GIL

  18. ORM

  19. metaclass

  20. descriptor

  21. corountine

  22. pythonic

Web 开发框架

  1. Flask 源码?

  2. 解释一下 WSGI 和 FastCGI 的关系

  3. Django 和 Tornado 的关系、差别

  4. restfull 风格的api怎么写

  5. 网页嵌入的im原理

操作系统原理

  1. 进程间通信
  2. 多进程和多线程

  3. epoll,select的区别?边缘触发,水平触发区别?

  4. 负载均衡的几种算法?

  5. 计算密集型,IO密集型任务怎么办?

  6. time_wait是什么情况?出现过多的close_wait可能是什么原因?

算法

快速排序

冒泡

二分法

动态规划

动态规划(DP)的整理-Python描述

计算机网络

协议的本质?

TCP/IP

  1. tcp/udp的区别?tcp粘包是怎么回事,如何处理?udp有粘包吗?

HTTP(含2.0)

1、post 和 get方法区别

  1. 从输入URL到页面加载完成发生了什么?

数据库(存储)SQL/cache/nosql

存储可能包含rdbms,nosql以及缓存等,我以mysql,redis举例

mysql相关

  1. 增删改查
  2. 触发器

  3. SQL 语法、调优

  4. SQLAlchemy 的用法

  5. 谈谈mysql字符集和排序规则?

  6. varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符

  7. primary key和unique的区别?

  8. 外键有什么用,是否该用外键?外键一定需要索引吗?

  9. myisam与innodb的区别?innodb的两阶段锁定协议是什么情况?

  10. 索引有什么用,大致原理是什么?设计索引有什么注意点?

redis相关

  1. 什么场景用redis,为什么mysql不适合?

  2. 谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?

  3. redis内存满了会怎么样?

设计模式

单例模式

装饰器、面向切面编程 AOP

网络安全

web安全相关

  1. 解释一下 cookie 和 session 的关系

  2. xsrf 的攻击和防范方法解释一下

  3. sql注入是怎么产生的,如何防止?

  4. xss如何预防?htmlescape后能否避免xss?

  5. csrf是什么?django是如何防范的?

密码技术

  1. 什么是分组加密?加密模式有哪些?ecb和cbc模式有什么区别?为什么需要iv向量?

  2. 简单说说https的过程?

  3. 对称加密与非对称加密区别?

4.如何生成共享秘钥? 如何防范中间人攻击?

其他

  1. bottleneck

  2. rush condition的处理方法,scale的方向

  3. 做个短链接服务

  4. golang,rust是否了解?

  5. numpy,pandas是啥?

  6. 消息队列?

——————

—————————–

高并发的解决方案?

1.使用代理服务器,“根据因特网流量状况以及内容类型将请求导向特定的Web服务器”(注:《HTTP权威指南》“6.2 为什么使用代理”,P141)。

HTTP/0.9?

HTTP/0.9 报文也由请求和响应组成, 但请求中只包含方法和请求 URL, 响应中只包含实体。 它没有版本信息(它是第一个, 而且是当时唯一的版本), 没有状态码或原因短语, 也没有首部。

但这种简单协议无法提供更多的灵活性, 也无法实现本书中描述的大部分 HTTP 特性和应用。 这里对其进行简要的描述, 是因为仍然有一些客户端、 服务器和其他应用程序在使用这个协议, 应用程序的编写者应该清楚它的局限性。

(注:《HTTP权威指南》“3.2.5 版本0.9的报文”,P55-P56。)

幂等性?

即使在非错误情况下, 连接也可以在任意时刻关闭。 HTTP 应用程序要做好正确处理非预期关闭的准备。 如果在客户端执行事务的过程中, 传输连接关闭了, 那么,除非事务处理会带来一些副作用, 否则客户端就应该重新打开连接, 并重试一次。
对管道化连接来说, 这种情况更加严重一些。 客户端可以将大量请求放入队列中排队, 但源端服务器可以关闭连接, 这样就会留下大量未处理的请求, 需要重新调度。

副作用是很重要的问题。 如果在发送出一些请求数据之后, 收到返回结果之前, 连接关闭了, 客户端就无法百分之百地确定服务器端实际激活了多少事务。 有些事务,比如 GET 一个静态的 HTML 页面, 可以反复执行多次, 也不会有什么变化。 而其他一些事务, 比如向一个在线书店 POST 一张订单, 就不能重复执行, 不然会有下多张订单的危险。

如果一个事务, 不管是执行一次还是很多次, 得到的结果都相同, 这个事务就是幂等的。 实现者们可以认为 GET、HEAD、 PUT、 DELETE、 TRACE 和 OPTIONS 方法都共享这一特性。 19 客户端不应该以管道化方式传送非幂等请求(比如 POST)。否则, 传输连接的过早终止就会造成一些不确定的后果。 要发送一条非幂等请求,就需要等待来自前一条请求的响应状态。尽管用户 Agent 代理可能会让操作员来选择是否对请求进行重试, 但一定不能自动重试非幂等方法或序列。 比如, 大多数浏览器都会在重载一个缓存的 POST 响应时提供一个对话框, 询问用户是否希望再次发起事务处理

(注:《HTTP权威指南》“4.7.3 连接关闭容限、 重试以及幂等性”,P107-P108。)

post、get、put、head、delete这五种HTTP方法以及它们之间的相同点和不同点?

一旦 Web 服务器收到了请求, 就可以根据方法、 资源、 首部和可选的主体部分来对请求进行处理了。

有些方法(比如 POST要求请求报文必须带有实体主体部分的数据。 其他一些方法(比如 OPTIONS) 允许有请求的主体部分, 也允许没有。 少数方法(比如GET禁止请求报文包含实体主体数据。

语言基础、HTTP基础epoll、select是个啥?

gevent用过没,咋实现的?

redis用过没,讲讲怎么用的?

多进程、协程如何使用?

消息队列用过没?

django、flask、tornado这几个框架有啥特点?

Python有哪些数据结构?

面试官不会仅仅问你flask提供的API怎么用,而是会继续深入的问下去flask的源码里怎么设计这个API的,甚至问到如果你来设计这个API,你会怎么设计,这个设计需要用到Python的那些东西等等,会不断的把思维发散开去。。如果你不知道怎么学,去看下招聘信息,比如这是一段我从某招聘网站上复制下来的招Python Web开发岗位的要求:

  1. 熟练掌握Python,熟悉python异步IO、多线程、多进程编程;
  2. 熟悉一种web开发框架(Django/Flask/Tornado),参与过实际的python web开发;
  3. 了解前端开发技术,熟悉HTTP协议,TCP/IP,HTML, 了解Ajax, oauth,Ajax, Jquery等,熟悉前后端的交互过程;
  4. 熟悉一种常用的ORM框架,不限于 peewee/SQLAlchemy;
  5. 熟悉常用的数据结构算法、oo思想、一般设计模式,了解操作系统原理;
    7.有比较强的trouble shooting能力,善于通过错误跟踪和日志分析快速解决问题。

差不多是这样的。。所以,我的建议是,需要了解的基础只是还是了解下吧,不需要非常深入,但某些概念还是要搞熟悉。

背概念+代码实现。

比如生成器,需要知道的有这些:

1.概念(或者说特性)-保存之前的数据,然后在下一次调用时能在上一次调用产生的数据的基础之上进行计算,这种函数在Python中称为生成器。

2.代码实现:简单的就是怎么使用生成器,创建一个生成器等。难度大的玩法就多了,比如,自己实现一个拥有生成器功能的函数;再比如,使用生成器实现迭代器,再再比如使用生成器模拟线程并发等等。

3.一般面试,如果问到生成器,肯定会问到的是第一部分关于生成器的概念(或者说特性),然后问的深一点就会涉及到这些特性有什么用途,能用来实现什么东西,这个就是第二部分的东西了。

建议去刷LeetCode,做完easy和medium这两个难度级别的题就可以,最好多做几遍,把各种解法都想通了,那面试和笔试中数据结构和算法的部分基本就没问题了。。

参考文献:
1. 如何面试Python后端工程师?
2. Python面试指南
3. 常见面试题整理–Python概念篇
4. 关于Python的面试题 - github

你可能感兴趣的:(Python面试题)