Python后端工程师面试题(附答案)终结版

之前在网上搜集python面试题,这是最流行的一个版本。但是没有答案,故自己搜集或回答了一部分。现分享给大家,有些题目

回答的并不准确,望各路大神纠正,完善!!!

python语法以及其他基础部分

1.可变与不可变类型;

不可变类型(数字、字符串、元组、不可变集合)不可变类型不能被修改。

可变类型(列表、字典、可变集合)

2.浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;

基本类型 :

基本类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们是通过按值来访问的。

引用类型 :

引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。

栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,

因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。

这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,

我们把它叫做按引用访问。

浅拷贝只复制指向某个对象的引用地址,而不复制对象本身(只复制一层对象的属性),新旧对象还是共享同一块内存。

但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

import copy as cp

L=[1,[2,3]]

L1=cp.copy(L) #浅拷贝: 只是引用,并不会开辟新的内存空间,

L1与L指向同一片内存空间。L改变,L1也会锁着改变。

L2=cp.deepcopy(L) #深拷贝:会为数据重新开辟一片内存空间,L的变化不会影响L2。

3.__new__() 与 __init__()的区别;

_new_作用于_init_之前。前者可以决定是否调用后者,或者说可以决定调用哪个类的_init_方法。

首先要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。

Python 中的 _new_ 方法负责创建一个实例对象,_init_ 方法负责将该实例对象进行初始化;

4.你知道几种设计模式;

单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接

装饰器模式:不修改元类代码和继承的情况下动态扩展类的功能,例如框架中的每个controller文件会提供before和after方法。

迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类

命令模式: 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作.

5.编码和解码你了解过么;

数据通过编码decode转换成Unicode编码,编码的同时会将数据变成byte类型,通过解码encode转换为utf-8。

6.列表推导list comprehension和生成器的优劣;

[expr for iter_var in iterable] 列表推导式是将所有的值一次性加载到内存中

(expr for iter_var in iterable)

在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,

效率更高,它并不创建一个列表,只是返回一个生成器。

7.什么是装饰器;如果想在函数之后进行装饰,应该怎么做;

装饰器是一个函数,这个函数的主要作用是包装另一个函数或类

包装的目的是在不改变原函数名的情况下改变被包装对象的行为。

接收一个函数,内部对其包装,然后返回一个新函数,这样子动态的增强函数功能

通过高阶函数传递函数参数,新函数添加旧函数的需求,然后执行旧函数。

8.手写个使用装饰器实现的单例模式;

该模式的主要目的是确保某一个类只有一个实例存在。

from functools import warps

def My_decorate(f):

@warps(f)

def fn(*args,**kwargs):

print('decorate called')

return f(*args,**kwargs)

return fn

@My_decorate

def fx():

pring('fx called')

fx()

9.使用装饰器的单例和使用其他方法的单例,在后续使用中,有何区别;

使用装饰器单例属性不会被覆盖。因为装饰器单例模式是直接返回之前生成的对象,

并不会重新初始化对象。像new方法构建的单例模式会重新调用init方法,为实例重新初始化属性。

10.手写:正则邮箱地址;

pattern = '[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+\.[a-z]'

匹配身份证:

pattern = '(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)'

pattern = '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'

11.介绍下垃圾回收:引用计数/分代回收/孤立引用环;

垃圾回收:python解释器对正在使用的对象保持计数,当某个对像的引用计数降为0时,垃圾收集器就可以释放

该对象,获取分配的内存。当分配对象和取消分配对象的差值高于阈值时垃圾回收才会启动。

分代回收:python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,

依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。

如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。

当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。

孤立引用环:

12.多进程与多线程的区别;CPU密集型适合用什么;

多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程共享内存空间;进程的内存是独立的,

同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现,

一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

优缺点:1.多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。

但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源。

2.多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能

造成整个进程的崩溃,因为它们共享了进程的内存资源池。

*CPU密集型适合用多进程开发

13.进程通信的方式有几种;

进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET

14.介绍下协程,为何比线程还快;

高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理

协程能保留上一次调用时的状态,管是进程还是线程,每次阻塞、切换都需要陷入系统调用,

使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题。

15.range和xrange的区别

xrange和range 的用法完全相同,但是返回的是一个生成器。

算法排序部分

16.手写快排;堆排;几种常用排序的算法复杂度是多少;快排平均复杂度多少,最坏情况如何优化;

17.手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少;

def func(x, d):

L = []

n = len(x)

if d > n:

return None

L.append(x[0])

a = d + 1

while a < n:

L.append(x[a])

a = a + d + 1

return L

list = [x for x in range(100)]

result = func(list, 10)

print(result)

我写的只考虑到从第一个元素开始组合。没有考虑从第二个,第三个元素开始......求大神提供完全正确方法。

18.手写:一个列表A=[A1,A2,…,An],要求把列表中所有的组合情况打印出来;

19.手写:用一行python写出1+2+3+…+10**8 ;

s = sum([x for x in range(1,10**8+1)])

20.手写python:用递归的方式判断字符串是否为回文;

def isHuiWen(str):

if(len(str) <2):

return True

if str[0] !=str[-1]:

return False

return isHuiWen(str[1:-1])

str = input("请输入一个字符串:")

if isHuiWen(str):

print("该字符串为回文字符串")

else:

print("该字符串不是回文")

21.单向链表长度未知,如何判断其中是否有环;

22.单向链表如何使用快速排序算法进行排序;

23.手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,

你的算法复杂度是多少;

def func(list):

if len(list) <= 1:

return list

L = sorted(list)

n = len(list) % 2

m = len(list) // 2

if n == 0:

s = (L[m] + L[m-1]) / 2

return s

s = L[m]

return s

l = [1,2,6,84,12,62,100]

print(func(l))

24.如何遍历一个内部未知的文件夹(两种树的优先遍历方式)

网络基础部分

25.TCP/IP分别在模型的哪一层;

TCP 在传输层,

IP在网络层

26.socket长连接是什么意思;

在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,

需要双方发检测包以维持此链接,一般需要自己做在线维持。

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差

数据库的连接用长连接。如果用短连接频繁的通信会造成socket错误,

而且频繁的socket创建也是对资源的浪费

27.select和epoll你了解么,区别在哪;

28.TCP UDP区别;三次握手四次挥手讲一下;

TCP协议:  (在传输之前先建立连接)面向连接(的通信服务):可靠地数据传输,失序,无差错,无丢失,无重复

用途:适用于传输内容比较大,网络情况比较好,需要提供准确的情况.比如:聊天信息,文字传输,邮件传输。

udp 协议:面向无连接的服务,不可靠,发送时由发送端自主进行,不考虑接收端。

用途:适用于网络较差,对传输准确性要求低,广播组播.比如:视频会议,广播数据。

三次握手:

1.客户端向服务器发起链接请求(问是否可以连接)

2.服务器接受到请求后进行确认(允许连接)返回报文

3.客户端收到许可,建立连接

四次挥手:

1.主动方发送报文告知被动方要断开连接

2.被动发返回报文没告知收到请求,准备断开

3.被动发发送报文给主动方告知准备就绪可以断开

4.主动方发送报文确定断开

29.TIME_WAIT过多是因为什么;

30.http一次连接的全过程:你来说下从用户发起request——到用户接收到response;

域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,

浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

--> 浏览器对页面进行渲染呈现给用户.

参考大神文章:https://www.cnblogs.com/engeng/articles/5959335.html

31.http连接方式。get和post的区别,你还了解其他的方式么;

get是从服务器上获取数据,post是向服务器传送数据。在客户端, get方式在通过URL提交数据,

数据在URL中可以看到;post方式,数据放置在HTML HEADER内提交。

对于get方式,服务器端用Request.QueryString获取变量的值,

对于post方式,服务器端用Request.Form获取提交的数据。

Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,

用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,

就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法。

32.restful你知道么;

33.状态码你知道多少,比如200/403/404/504等等;

200:操作成功。

403:访问受限,授权过期(错误提示)

404:资源,服务器未找到

504:网关超时,服务器作为网关或代理,但是没有及时从上游服务器收到请求。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容