Python高频面试题(知乎高赞完整版+详细接地气答案)_第1页
Python高频面试题(知乎高赞完整版+详细接地气答案)_第2页
Python高频面试题(知乎高赞完整版+详细接地气答案)_第3页
Python高频面试题(知乎高赞完整版+详细接地气答案)_第4页
Python高频面试题(知乎高赞完整版+详细接地气答案)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python高频面试题(知乎高赞完整版+详细接地气答案)这套题是互联网面试高频真题,贴合初级、中级Python开发面试场景,答案摒弃书面化套话,都是面试现场可以直接口述的通俗解答,覆盖基础语法、数据结构、函数、面向对象、坑点实操、性能问题等核心考点。一、Python基础核心面试题1、简述Python中可变类型和不可变类型,以及常见类型有哪些?参考答案:核心区别就是:能不能在原内存地址上直接修改数据。不可变类型:创建之后内存里的值就固定了,修改数据只会生成一个新对象,原对象不会变。常见的有:整数、浮点数、字符串、元组。可变类型:创建后可以直接在原内存地址上增删改数据,不会生成新对象。常见的有:列表、字典、集合。举个日常面试常说的例子:字符串不能直接通过下标改字符,但是列表可以随便改,这就是最直观的区别。也是函数传参、变量赋值很多坑的根源。2、==和is的区别是什么?参考答案:简单说:==比数值,is比内存地址。==是判断两个对象的内容、数值是否相等,不管内存地址一不一样。is是判断两个变量是不是指向同一个内存地址,也就是完全同一个对象。补充一个高频坑点:Python有小整数缓存机制,-5~256的整数会常驻缓存,这个范围内的数字用is判断会返回True,超出这个范围就会是False,这也是面试常问的细节。3、Python变量赋值、浅拷贝、深拷贝的区别?参考答案:1)变量赋值:本质是引用传递,两个变量完全指向同一个内存对象,改一个另一个也会变。2)浅拷贝:只拷贝最外层对象,里面的子对象还是共用同一个引用。单层数据(纯数字、字符串)浅拷贝和深拷贝没区别;嵌套数据(列表套列表、字典套字典),修改内层数据,原数据和拷贝数据都会变。3)深拷贝:完全递归拷贝所有层级的数据,会生成一个全新的独立对象,新旧数据完全隔离,互相修改互不影响。需要导入copy模块的deepcopy方法。4、解释Python中的垃圾回收机制参考答案:Python主要靠三种方式做垃圾回收,核心是解决内存泄漏和无用内存释放的问题。第一是引用计数,这是最基础的机制。每个对象都有引用计数,新增一个引用计数+1,删除引用、变量失效时计数-1,计数为0就直接回收内存。优点是实时、效率高;缺点是解决不了循环引用的问题。第二是标记清除,专门解决循环引用问题。会定期扫描内存,把互相引用但没有外部引用的对象标记为垃圾,统一清理。第三是分代回收,为了提升性能。把对象分为新生代、中代、老年代,新创建的对象扫描频率高,存活久的对象扫描频率低,不用每次都全量扫描,大幅节省性能。5、Python为什么是动态类型语言?和静态类型有什么区别?参考答案:动态类型的核心是:变量类型在运行时才确定,不用提前声明类型。写代码的时候不用定义变量是int还是str,赋值什么类型就是什么类型,运行过程中还可以随意更换变量类型。静态类型语言比如Java、C++,必须提前声明变量类型,编译阶段就会校验类型,类型不对直接报错。Python动态类型的好处是开发快、代码简洁;缺点是很多类型错误只能运行的时候才发现,大型项目容易出隐性bug。二、列表、字典、字符串高频面试题1、列表append和extend的区别?参考答案:append是整体追加,不管传入的是列表、字符串还是数字,都当作一个整体元素加到原列表末尾。extend是迭代拆分追加,只会接收可迭代对象,会把里面的每个元素拆分出来,逐个添加到原列表。举例:a=[1,2],a.append([3,4])结果是[1,2,[3,4]];a.extend([3,4])结果是[1,2,3,4]。2、字典的底层原理是什么?为什么查询速度极快?参考答案:Python字典底层是哈希表(散列表)结构。存储数据时,会对key做哈希运算,算出一个哈希值,对应哈希表的索引位置,直接把数据存在对应位置。查询数据时,同样对key做哈希,直接定位到对应索引,不需要遍历所有数据,所以字典的查、增、删时间复杂度都是O(1)。补充细节:哈希冲突的时候,Python用开放寻址法解决;且字典的key必须是不可变类型,因为可变类型无法生成固定哈希值。3、Python字符串为什么不可变?这样设计的好处是什么?参考答案:字符串设计成不可变,主要是为了安全和性能优化。第一,字符串是日常代码中使用频率最高的数据类型,不可变可以保证数据不会被意外修改,多线程场景下不用加锁,线程安全。第二,Python有字符串驻留机制,相同的字符串只会在内存中存一份,多个变量共用一个对象,大幅节省内存,提升查询和匹配效率。所以平时修改字符串,本质都是生成新字符串,原字符串不会改变。三、函数与高阶语法面试题1、讲讲Python闭包和作用域参考答案:闭包就是内层函数调用外层函数的变量,且外层函数执行结束后,内层函数依然可以持有外层变量的现象。简单理解:函数嵌套,内层用外层变量,外层返回内层函数,就是闭包。作用域分为四种:局部作用域、嵌套作用域、全局作用域、内置作用域,查找顺序由内到外。补充关键字:global用来修改全局变量,nonlocal用来修改嵌套外层函数的变量,这两个是闭包最常用的关键字。闭包的作用:可以保存函数的运行状态,不用全局变量,还能实现简单的装饰器逻辑。2、装饰器的原理、作用,手写一个通用装饰器参考答案:装饰器本质就是闭包的进阶用法,可以在不修改原函数代码、不改变原函数调用方式的前提下,给函数新增功能,符合开闭原则。常用场景:日志记录、接口权限校验、性能计时、异常捕获、缓存处理。通用装饰器代码(面试可直接默写):python

defwrapper(func):

definner(*args,**kwargs):

#执行函数前的拓展逻辑

print("函数执行前")

res=func(*args,**kwargs)

#执行函数后的拓展逻辑

print("函数执行后")

returnres

returninner

@wrapper

deftest():

print("核心业务逻辑")

test()3、lambda匿名函数的特点和使用场景参考答案:lambda是简单的匿名函数,只能写一行表达式,不能写循环、分支语句(三元运算除外),结构简洁、轻量化。主要搭配高阶函数使用:sorted、map、filter、reduce,用来快速定义简单的排序规则、映射规则、筛选规则。缺点是逻辑不能复杂,可读性差,复杂业务绝对不用lambda。四、面向对象面试题(中级高频)1、面向对象三大特性及各自作用参考答案:封装:把属性和方法封装到类内部,隐藏内部复杂逻辑,只暴露对外的调用接口,提高代码安全性和复用性。继承:子类可以复用父类的属性和方法,避免重复代码,实现代码复用,也可以重写父类方法实现个性化逻辑。多态:不同的子类重写同一个父类方法,调用同一个方法会呈现不同效果,提升代码的扩展性和灵活性。2、__init__和__new__的区别?参考答案:核心区别:__new__负责创建对象,__init__负责初始化对象。1)执行顺序:先执行__new__开辟内存创建实例对象,再执行__init__给对象赋值属性。2)返回值:__new__必须返回创建的对象,__init__没有返回值。3)使用场景:日常开发几乎不用重写__new__,只有实现单例模式、自定义对象创建逻辑时才会重写__new__方法。3、什么是单例模式?如何用Python实现单例?参考答案:单例模式就是让一个类从头到尾只创建一个实例对象,所有调用都共用同一个对象,避免重复创建对象浪费内存。常用场景:数据库连接、日志对象、配置文件读取、全局工具类。最简单的实现方式:重写__new__方法,判断是否已经创建过对象,有就直接返回已有对象,没有再创建。五、Python高频坑点&实操面试题1、函数默认参数的坑是什么?参考答案:最大的坑:默认参数是在函数定义阶段就创建完成,不是每次调用都新建,如果默认参数是可变类型(列表、字典),多次调用函数会共用同一个对象,导致数据累加错乱。错误写法:deffunc(a=[]):正确写法:用None做默认值,函数内部再初始化可变对象,避免共用内存。2、遍历列表的时候删除元素,为什么会漏删、出错?参考答案:因为遍历列表时,列表长度会随着删除元素改变,元素下标会自动前移,遍历的指针不会回溯,就会跳过部分元素,导致漏删。解决办法:要么遍历列表副本,要么倒序遍历删除,要么用列表推导式筛选。3、pass、continue、break的区别参考答案:pass:空语句,占位用,什么都不执行,只为了保证语法完整。continue:跳出本次循环,直接进入下一次循环,不终止整体循环。break:直接终止当前所在的整个循环,跳出循环体。六、进阶性能&工程面试题1、Python为什么运行速度慢?怎么优化?参考答案:慢的核心原因:1)动态类型,运行时需要频繁校验类型、解析代码;2)GIL全局解释器锁,同一时刻一个进程只能有一个线程执行CPU任务,多线程无法利用多核;3)Python是解释型语言,没有编译优化过程。常用优化手段:1)CPU密集型用多进程规避GIL限制;2)减少循环内的重复计算,多用列表推导式、内置函数;3)用局部变量代替全局变量,查询速度更快;4)核心逻辑用C、Cython、Go拓展,或者用numpy、pandas优化数据计算。2、GIL全局解释器锁是什么?有什么影响?参考答案:GIL是CPython的一把互斥锁,保证同一时刻一个Python进程只有一个线程执行字节码。影响:1)IO密集型任务:多线程完全够用,因为IO阻塞时会释放GI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论