Python经典面试题及详细答案(企业真实版)_第1页
Python经典面试题及详细答案(企业真实版)_第2页
Python经典面试题及详细答案(企业真实版)_第3页
Python经典面试题及详细答案(企业真实版)_第4页
Python经典面试题及详细答案(企业真实版)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

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

文档简介

Python经典面试题及详细答案(企业真实版)一、Python基础核心面试题1、简述Python中可变和不可变数据类型,分别有哪些?答案:核心区别:数据在内存中是否可以原地修改,修改后内存地址不变即为可变类型,地址改变即为不可变类型。1.不可变数据类型:字符串、数字、元组这类数据一旦创建,内存中的值无法修改。如果对变量进行赋值、拼接、修改操作,会直接开辟新的内存空间,生成新的数据,变量指向新地址。示例:python

a=10

print(id(a))

a=20

print(id(a))#地址发生改变

s="abc"

s+="d"#并非原地修改,而是生成新字符串2.可变数据类型:列表、字典、集合这类数据可以在原有内存地址上直接增删改查数据,不会开辟新内存,变量的内存地址始终不变。示例:python

lst=[1,2,3]

print(id(lst))

lst.append(4)

print(id(lst))#地址不变2、==和is的区别是什么?答案:1.==:判断两个变量的值是否相等,默认调用对象的__eq__方法,只比对数据内容。2.is:判断两个变量是否指向同一个内存地址,也就是完全同一个对象,比对的是id内存地址。核心结论:-is成立,==一定成立;-==成立,is不一定成立。补充小知识点:Python有小整数池、字符串驻留机制,[-5,256]的整数、合法标识符字符串会被缓存,多个变量赋值会指向同一内存地址,所以小数值数字、短字符串常出现is为True的情况。示例:python

a=[1,2,3]

b=[1,2,3]

print(a==b)#True值相等

print(aisb)#False内存地址不同3、Python中注释方式有几种?各自的用法?答案:三种注释方式,适配不同场景:1.单行注释:以#开头,仅对当前行生效,常用于代码单行说明。2.多行注释:三单引号'''''',可包裹多行内容,常用于函数、类的功能说明。3.多行注释:三双引号"""""",用法和三单引号一致,是项目中最常用的文档注释格式。注意:三引号注释如果在函数、类首行,会被识别为文档字符串,可通过__doc__属性获取,普通#注释无法被获取。4、pass、break、continue的区别?答案:1.pass:空语句,无任何执行效果,仅占位。用于语法必须有代码块,但暂时无逻辑可写的场景,防止程序报错。2.break:终止当前所在的整个循环或switch语句,直接跳出循环,后续循环不再执行。3.continue:终止本次循环,跳过本次剩余代码,直接进入下一次循环迭代,不会跳出整体循环。二、列表、字典、字符串高频面试题5、列表和元组的区别?为什么元组不可变?答案:1.核心区别:-列表(list):可变、有序、可重复、支持增删改查,用[]定义;-元组(tuple):不可变、有序、可重复、不支持元素修改,用()定义。2.元组不可变的本质:元组创建后,内部元素的内存引用地址不可修改。如果元组内嵌套列表、字典等可变对象,嵌套对象的内容可以修改,因为修改的是可变对象自身,不是元组的引用地址。示例:python

t=(1,2,[3,4])

t[2].append(5)

print(t)#(1,2,[3,4,5])可以修改嵌套列表3.使用场景:-频繁增删数据用列表;-固定不变的数据、配置参数、函数返回多值用元组,更安全、占用内存更小、运行速度更快。6、字典的key可以是哪些数据类型?为什么列表不能当key?答案:1.字典key的要求:必须是不可变、可哈希的数据类型合法key:数字、字符串、元组非法key:列表、字典、集合2.列表不能当key的原因:字典底层是哈希表存储,存储数据时会对key做哈希运算,生成唯一哈希值确定存储位置。列表是可变类型,内容可以随时修改,修改后哈希值会改变,会导致字典无法定位原有数据,破坏哈希表结构,因此不允许作为key。7、Python如何实现列表去重?多种方法对比优缺点答案:方法1:利用集合set去重python

lst=[1,2,2,3,3,4]

new_lst=list(set(lst))优点:代码极简、速度最快;缺点:会打乱原有顺序,Python3.7以下版本不保留插入顺序。方法2:遍历列表手动去重(保留顺序)python

lst=[1,2,2,3,3,4]

new_lst=[]

foriinlst:

ifinotinnew_lst:

new_lst.append(i)优点:完美保留原列表顺序,兼容性强;缺点:数据量大时效率偏低。方法3:字典键去重(高效保序)python

lst=[1,2,2,3,3,4]

new_lst=list(dict.fromkeys(lst))优点:高效、自动保留原顺序,是企业最常用的保序去重方式。三、函数与参数、闭包、装饰器8、函数位置参数、关键字参数、默认参数、可变参数的区别?答案:1.位置参数:调用函数时,实参顺序、数量必须和形参完全一致,按位置一一对应。2.关键字参数:调用时通过「形参名=值」传参,顺序可随意,无需对应位置。3.默认参数:定义函数时给形参设置默认值,调用时不传参则使用默认值。重点坑点:默认参数必须指向不可变对象,禁止使用列表、字典作为默认参数,会出现数据累加残留问题。4.可变参数:-*args:接收任意多个位置参数,打包成元组;-**kwargs:接收任意多个关键字参数,打包成字典。参数优先级规则:位置参数>*args>默认参数>**kwargs9、简述闭包的概念、作用和使用场景答案:1.闭包定义:嵌套函数中,内层函数引用外层函数的局部变量,且外层函数返回内层函数,这样的内层函数就是闭包。2.核心特性:外层函数的局部变量不会随着外层函数执行结束而销毁,会被内层函数持有保存。3.主要作用:-保存函数运行状态,实现数据常驻;-避免全局变量滥用,封装私有数据;-为装饰器提供底层支撑。4.简单示例:python

defouter(num):

definner():

print(num+10)

returninner

f=outer(5)

f()#1510、什么是装饰器?作用是什么?手写一个通用装饰器答案:1.装饰器本质:基于闭包实现的函数高阶工具,是一个接收函数为参数、返回新函数的函数。2.核心作用:不修改原函数代码、不修改原函数调用方式,为函数新增额外功能(开闭原则)。3.常用场景:日志记录、运行时间统计、权限校验、接口限流、缓存处理。4.通用装饰器代码(支持任意参数、有返回值函数):python

defdecorator(func):

defwrapper(*args,**kwargs):

#执行函数前的拓展逻辑

print("函数开始执行")

res=func(*args,**kwargs)

#执行函数后的拓展逻辑

print("函数执行结束")

returnres

returnwrapper

@decorator

deftest(a,b):

returna+b

print(test(1,2))四、面向对象编程OOP面试题11、简述Python面向对象三大特性答案:1.封装:将属性和方法封装到类中,隐藏内部实现细节,仅对外提供访问接口,提高代码安全性、复用性。可通过私有属性、私有方法限制外部直接访问。2.继承:子类继承父类的属性和方法,减少重复代码,实现代码复用,支持单继承和多继承。3.多态:不同子类重写父类同名方法,调用同一方法时,根据对象类型执行不同逻辑,提高代码灵活性和扩展性。Python是动态多态,无需显式声明,自动适配。12、__init__、__new__、__str__方法的区别和作用答案:1.__new__:创建对象的方法,负责开辟内存空间,生成对象实例。优先于__init__执行,是类的静态方法,掌控对象的创建过程。2.__init__:初始化对象的方法,对象创建完成后,给对象的属性赋值。仅负责初始化,不创建对象,实例化类时自动触发。3.__str__:打印对象时自动触发,必须返回字符串,用于自定义对象的打印格式,否则打印默认的内存地址信息。执行顺序:__new__先创建对象→__init__初始化属性→打印对象触发__str__13、类属性和实例属性的区别?答案:1.类属性:直接定义在类体中,属于类所有,所有实例对象共享,内存中仅存储一份,修改类属性会影响所有实例。适合存储所有对象共用的数据。2.实例属性:在__init__中通过self.xxx定义,属于单个实例独有,每个对象独立存储,修改单个对象的实例属性不会影响其他对象。适合存储对象独有数据。五、Python进阶与坑点面试题14、Python深浅拷贝的区别?答案:针对多层嵌套数据(列表嵌套列表、字典嵌套字典),拷贝逻辑完全不同:1.浅拷贝(copy):只拷贝最外层数据,内层嵌套数据仅复制引用地址。修改原数据的内层内容,拷贝后的数据会同步变化。适用场景:单层简单数据(无嵌套)。2.深拷贝(deepcopy):逐层递归拷贝所有数据,完全开辟新内存,原数据和拷贝数据彻底独立,修改任意一方互不影响。适用场景:多层嵌套复杂数据。补充:赋值操作不是拷贝,只是变量引用传递,完全共享同一内存数据。15、Python的垃圾回收机制是什么?答案:Python采用引用计数为主、标记清除+分代回收为辅的垃圾回收机制,自动回收无用内存。1.引用计数:每个对象维护一个引用计数器,变量引用对象则计数+1,变量删除/赋值则计数-1,计数为0时立即回收内存。优点是实时、高效。2.弊端:无法解决循环引用问题(两个对象互相引用,计数永远不为0)。3.标记清除:专门解决循环引用问题,定期扫描内存,标记存活对象,清除无引用的循环垃圾对象。4.分代回收:根据对象存活时间分为0、1、2三代,存活越久的对象越稳定,扫描频率越低,大幅提升回收效率。16、解释PythonGIL全局解释器锁答案:1.GIL定义:全局解释器锁,是CPython解释器的一把互斥锁,同一时刻一个进程内只能有一个线程执行Python代码。2.核心影响:Python多线程在CPU密集型任务中无法利用多核优势,无法实现真正并行,只能实现并发;IO密集型任务(网络请求、文件读写、等待)阻塞时会释放GIL,多线程效率极高。3.解决方案:-CPU密集型:使用多进程,每个进程有独立GIL,可利用多核并行;-IO密集型:使用多线程/协程,效率更高、开销更小。六、实操编程面试题17、反转字符串、反转列表(多种方法)答案:python

#1.切片反转(最简)

s="abcdef"

print(s[::-1])

lst=[1,2,3,4]

print(lst[::-1])

#2.列表内置方法(原地反转)

lst.reverse()

#3.手动遍历反转

defreverse_str(s):

res=""

foriins:

res=i+res

returnres18、写一个代码统计字符串中每个字符出现的次数答案:python

s="aabbbccdeeeee"

count_dict={}

forcharins:

ifcharincount_dict:

count_dict[char]+=1

else:

count_dict[char]=1

print(count_dict)

#极简写法

fromcollectionsimportCounter

print(dict(Counter(s)))19、实现冒泡排序算法答案:python

defbubble_sort(lst):

n=len(lst)

foriinrange(n-1):

#标记本轮是否交换,优化效率

flag=False

forjinrange(n-1-i):

iflst[j]>lst[j+1]:

lst[j],lst[j+1]=lst[j+1],lst[j]

flag=True

ifno

温馨提示

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

最新文档

评论

0/150

提交评论