Language_Python 面试专题手册
💡 本章节共收录 197 道面试真题,建议每天复习 10-20 题。
Q1: Python多进程解决OOM问题,为什么不用多线程
【核心解析】 Python GIL导致多线程无法并行利用多核CPU;多进程可以独立内存空间,避免内存泄漏影响其他进程;多进程适合CPU密集型任务,多线程适合I/O密集型;OOM通常由内存泄漏或大对象引起,多进程可以隔离问题。
Q2: LangChain 是什么?它主要解决什么问题?
【核心解析】 LangChain 是一个用于构建基于大语言模型(LLM)应用的框架,提供链式调用、记忆、代理等功能,简化与 LLM 的交互和任务编排。
Q3: 请解释Python中的协程(Coroutine)是什么?它与线程和进程有何区别?Python中如何实现协程?
【核心解析】 协程是用户态轻量级线程,由程序自身控制调度;协程切换开销小,适合IO密集型任务;Python通过async/await关键字实现协程;协程基于事件循环运行,单线程内并发;与线程相比,协程无需锁机制,但无法利用多核。
Q4: 请简单聊聊LangChain和LangGraph,包括它们的基本概念、核心组件(如Chain、Agent、Tool、Memory等)以及典型应用场景。
【核心解析】 LangChain:用于构建LLM应用的框架,核心组件包括Prompt Template、LLM、Chain、Agent、Tool、Memory;Chain:串联多个LLM调用或工具;Agent:根据用户输入动态选择工具;Tool:封装外部API或函数;Memory:保存对话历史;LangGraph:基于LangChain的图结构框架,支持有向图定义工作流,节点为LLM或工具,边为状态转移;应用场景:聊天机器人、文档问答、自动化工作流、代码生成等。
Q5: Python 的 GIL 锁是什么?
【核心解析】 GIL是全局解释器锁,保证同一时刻只有一个线程执行Python字节码;限制多线程并行,但I/O密集型任务影响较小;可通过多进程或使用C扩展绕过GIL。
Q6: 请介绍Python的asyncio库,包括其核心概念和用法。
【核心解析】 asyncio:基于协程的异步I/O框架;核心概念:事件循环、协程(async/await)、Future、Task;用法:定义async函数,使用await挂起;事件循环运行协程;支持并发:gather、wait;适用场景:I/O密集型任务,如网络请求、文件读写;注意:CPU密集型任务需用多进程。
Q7: 请解释Python的装饰器、GIL、浅拷贝与深拷贝、yield用法以及垃圾回收机制。
【核心解析】 装饰器是返回函数的高阶函数,用于增强功能;GIL是全局解释器锁,限制多线程并行执行CPU密集型任务;浅拷贝只复制引用,深拷贝递归复制所有对象,使用copy.deepcopy;yield用于生成器,实现惰性求值;垃圾回收基于引用计数和分代回收,循环引用由gc模块处理。
Q8: 请解释 Python 中的装饰器(decorator)及其应用场景。
【核心解析】 装饰器是一种高阶函数,用于在不修改原函数代码的情况下添加功能;通过 @ 语法糖使用;常用于日志、权限校验、缓存等;可接受参数并返回包装函数;支持类装饰器
Q9: 请解释 Python 中的生成器(generator)及其与迭代器的关系。
【核心解析】 生成器使用 yield 关键字返回数据,保存函数执行状态;生成器是迭代器的一种,支持惰性求值;常用于处理大数据流或无限序列;可通过 next() 或 for 循环迭代;生成器表达式类似列表推导式但使用圆括号
Q10: 请解释 Python 中的协程(coroutine)及其与生成器的区别。
【核心解析】 协程通过 async/await 关键字实现异步编程;基于事件循环调度;与生成器不同,协程用于并发而非迭代;支持暂停和恢复执行;常用于 I/O 密集型任务
Q11: Python的八股(如GIL、装饰器、列表推导式)。
【核心解析】 GIL限制多线程并行;装饰器用于增强函数;列表推导式高效创建列表;动态类型、鸭子类型。
Q12: Python中的self关键字的作用是什么?
【核心解析】 self代表实例本身;在类的方法中必须作为第一个参数;通过self访问实例属性和方法;不是Python关键字,只是约定
Q13: Python中的生成器是什么?
【核心解析】 使用yield关键字的函数;返回生成器对象;惰性求值,节省内存;可用for循环或next()迭代;如斐波那契数列生成器
Q14: Python中的装饰器是什么?
【核心解析】 本质是函数,用于增强其他函数功能;语法糖@decorator;可接受函数作为参数并返回新函数;常用于日志、计时、权限检查
Q15: PyTorch、MindSpore、TensorFlow三个深度学习框架的区别是什么?
【核心解析】 动态图vs静态图(PyTorch动态,TensorFlow 2.x动态,MindSpore支持动态/静态);生态与社区(TensorFlow最广,PyTorch研究界流行,MindSpore华为生态);分布式训练支持;自动微分机制;部署工具(TensorFlow Serving, TorchServe, MindSpore Lite);硬件适配(GPU/昇腾/麒麟)
Q16: 有没有了解过Langchain之类的框架,并实际做过RAG的实现?
【核心解析】 Langchain用于构建LLM应用;RAG(检索增强生成)结合向量数据库;文档分块、嵌入、检索;使用Langchain的Chain和Agent;实际项目经验;处理上下文长度限制;优化检索质量
Q17: 请解释Python的装饰器、迭代器、生成器以及闭包的概念和用法。
【核心解析】 装饰器:高阶函数,用于扩展函数功能,语法@decorator;迭代器:实现__iter__和__next__方法的对象,可被for循环遍历;生成器:使用yield关键字的函数,惰性求值,节省内存;闭包:内部函数引用外部变量,形成闭包环境,常用于装饰器。
Q18: 请解释Python中的装饰器、迭代器和生成器的概念及用途。
【核心解析】 装饰器用于在不修改函数代码的情况下添加功能,基于闭包实现;迭代器是实现了__iter__和__next__方法的对象,用于遍历数据;生成器是使用yield关键字的函数,用于惰性求值,节省内存。
Q19: 请解释Python的垃圾回收机制。
【核心解析】 Python使用引用计数为主,标记-清除和分代回收为辅;引用计数:每个对象维护引用计数,为0时立即回收;标记-清除:解决循环引用,从根对象遍历标记可达对象,清除不可达对象;分代回收:将对象分为三代,年轻代回收频率高,老年代低。
Q20: 请介绍Python高并发编程的常用方法。
【核心解析】 多线程:适合I/O密集型,受GIL限制;多进程:适合CPU密集型,通过multiprocessing模块实现;异步编程:使用asyncio库,基于事件循环和协程,适合I/O密集型;协程库:如gevent,通过猴子补丁实现并发。
Q21: 了解langchain吗
【核心解析】 LangChain是一个用于构建大语言模型(LLM)应用的框架;提供模块化组件(如模型、提示、链、代理、记忆);支持多种LLM和工具集成;简化了复杂工作流(如RAG、对话系统);核心概念:Chain、Agent、Tool、Memory
Q22: Python装饰器的作用和实现原理是什么?
【核心解析】 装饰器用于在不修改函数代码的情况下增加功能;本质是返回函数的高阶函数;使用@语法糖;支持带参数装饰器;常见应用:日志、计时、权限检查
Q23: 讲讲 Python 的装饰器。
【核心解析】 高阶函数;接受函数作为参数并返回新函数;用于增强功能(日志、计时等);@语法糖;可带参数;functools.wraps保留原函数属性
Q24: Python中进程、线程、装饰器、继承的概念及区别
【核心解析】 进程是资源分配的最小单位,线程是CPU调度的最小单位;Python多线程受GIL限制,适合I/O密集型,多进程适合CPU密集型;装饰器用于在不修改原函数的情况下增加功能,本质是返回函数的高阶函数;继承允许子类复用父类属性和方法,支持多继承,需注意方法解析顺序(MRO)。
Q25: Python有没有真正意义上的线程?请解释全局GIL锁的影响。
【核心解析】 Python线程受GIL(全局解释器锁)限制,同一时刻只有一个线程执行字节码;GIL导致CPU密集型任务无法利用多核;I/O密集型任务中GIL影响较小;可通过多进程(multiprocessing)或协程(asyncio)绕过GIL;Python线程适合I/O密集型场景。
Q26: Python中is和==的区别是什么?请从内存地址和值比较的角度说明。
【核心解析】 is比较两个对象的身份标识(id),即内存地址是否相同;==比较两个对象的值是否相等,调用__eq__方法;对于小整数和短字符串,Python会缓存,可能导致is为True;自定义类可通过__eq__控制==行为。
Q27: Python中浅拷贝和深拷贝的区别是什么?请说明嵌套对象的复制机制和数据隔离。
【核心解析】 浅拷贝只复制对象本身,不复制内部子对象,子对象引用共享;深拷贝递归复制所有子对象,完全独立;copy模块提供copy()和deepcopy();对于不可变对象,浅拷贝和深拷贝效果相同。
Q28: Python多线程在什么场景下适用?请结合爬虫开发说明。
【核心解析】 多线程适合I/O密集型任务,如网络请求、文件读写;在爬虫中,多线程可并发发送HTTP请求,提高效率;由于GIL限制,CPU密集型任务多线程效果不佳,应使用多进程。
Q29: Python装饰器的应用场景有哪些?请说明静态方法、类方法、实例方法的使用。
【核心解析】 装饰器用于在不修改原函数代码的情况下增加功能;静态方法(@staticmethod)无需实例调用,类方法(@classmethod)接收类作为第一个参数,实例方法接收self;常见应用:日志、权限校验、缓存、Flask路由注册。
Q30: Django MVT架构是什么?请简述其工作原理。
【核心解析】 MVT:Model(模型)、View(视图)、Template(模板);Model定义数据结构,View处理业务逻辑,Template渲染HTML;用户请求经URL分发到View,View操作Model并返回Template响应。
Q31: Pandas中用什么函数读取文件?请举例说明。
【核心解析】 常用pd.read_csv()读取CSV文件;其他:pd.read_excel()、pd.read_json()、pd.read_sql();参数包括文件路径、分隔符、编码等。
Q32: Python的垃圾回收机制是什么?
【核心解析】 引用计数为主,标记-清除和分代回收为辅;引用计数为0时立即回收;循环引用需标记-清除;分代回收将对象分为三代,频率递减;可通过gc模块手动控制。
Q33: 请解释Python的GIL锁及其对多线程的影响,并说明如何绕过GIL实现并行计算。
【核心解析】 GIL是全局解释器锁,确保同一时刻只有一个线程执行Python字节码;影响CPU密集型任务,I/O密集型任务影响较小;绕过方法包括使用多进程、C扩展、异步编程等。
Q34: Python中变量名前加一个下划线和两个下划线有什么区别?请解释Python的访问控制机制。
【核心解析】 单下划线表示保护成员,约定不直接访问;双下划线触发名称修饰(_ClassName__attr),实现私有属性;Python没有真正的私有,仍可通过修饰后的名称访问。
Q35: 请解释Python的垃圾回收机制,包括引用计数和循环垃圾收集。
【核心解析】 主要基于引用计数,当引用计数为0时立即回收;循环引用通过标记-清除和分代收集处理;gc模块可手动触发;分代收集将对象分为三代,频率递减。
Q36: Python中深复制和浅复制的区别是什么?如何实现深复制?
【核心解析】 浅复制只复制对象本身,不复制内部子对象;深复制递归复制所有子对象;使用copy.copy()浅复制,copy.deepcopy()深复制;注意循环引用问题。
Q37: Python中可变对象和不可变对象有哪些?在函数参数传递时有何不同?
【核心解析】 不可变对象:int、str、tuple等;可变对象:list、dict、set等;函数参数传递时,不可变对象按值传递,可变对象按引用传递;修改可变对象会影响外部变量。
Q38: Python中线程与进程的区别是什么?多线程开发需要注意哪些问题?
【核心解析】 进程是资源分配最小单位,线程是CPU调度最小单位;进程间独立,线程共享内存;Python多线程受GIL限制,CPU密集型用多进程;注意线程安全、死锁、资源竞争。
Q39: Python中有哪些MySQL接口?MySQL和MongoDB的区别是什么?
【核心解析】 常用接口:mysql-connector-python、PyMySQL、SQLAlchemy ORM;MySQL是关系型数据库,支持ACID,结构化数据;MongoDB是文档型NoSQL,灵活模式,适合非结构化数据。
Q40: Python中栈和堆的区别是什么?它们在内存中的底层实现是怎样的?
【核心解析】 栈用于函数调用和局部变量,自动管理,后进先出;堆用于动态分配对象,手动管理(GC);栈内存连续,堆内存离散;栈大小有限,堆较大。
Q41: 面向过程和面向对象编程的区别是什么?
【核心解析】 面向过程以函数为中心,数据与操作分离;面向对象以对象为中心,封装、继承、多态;面向对象更易维护和扩展,适合大型项目。
Q42: Python有哪些常用库?
【核心解析】 NumPy、Pandas用于数据分析;Django、Flask用于Web开发;Requests用于HTTP请求;Matplotlib用于绘图;Scikit-learn用于机器学习。
Q43: Python 装饰器是什么?有什么作用?
【核心解析】 装饰器本质上是一个函数,用于在不修改原函数代码的情况下增加额外功能;它接受一个函数作为参数并返回一个新函数;常见用途包括日志记录、性能计时、权限校验等;使用 @ 语法糖简化调用;装饰器可以嵌套,执行顺序从内到外。
Q44: Python 中 finally 关键字的作用及使用注意事项?
【核心解析】 finally 块用于定义无论是否发生异常都会执行的代码;通常用于释放资源(如文件、锁);即使 try 或 except 中有 return 语句,finally 也会在返回前执行;注意 finally 中的 return 会覆盖 try 中的 return;避免在 finally 中抛出异常,否则可能掩盖原始异常。
Q45: Python 有哪些基本数据类型?列表中的值是否可变?
【核心解析】 基本数据类型包括数字(int、float、complex)、字符串、布尔值、列表、元组、集合、字典;列表中的值可变,支持增删改操作;元组不可变;字符串不可变;字典的键必须是不可变类型。
Q46: Python 中列表和元组的区别是什么?
【核心解析】 列表可变,元组不可变;列表用方括号,元组用圆括号;列表支持增删改,元组不支持;元组可作为字典键,列表不行;性能上元组略优。
Q47: Python 中如何声明全局变量?
【核心解析】 在函数内部使用 global 关键字声明;全局变量在模块顶层定义;函数内修改全局变量需先声明;避免滥用全局变量。
Q48: 解释 Python 中的函数闭包。
【核心解析】 闭包是嵌套函数,内部函数引用外部函数的变量;外部函数返回内部函数;闭包可以保持外部变量的状态;常用于装饰器、回调函数。
Q49: Python中类方法和实例方法的区别及应用场景
【核心解析】 类方法使用@classmethod,第一个参数cls;实例方法第一个参数self;类方法可访问类属性,实例方法可访问实例属性;类方法常用于工厂模式,实例方法操作对象状态。
Q50: Python中__new__和__init__的区别
【核心解析】 __new__用于创建实例,返回实例对象;__init__用于初始化实例,无返回值;__new__在__init__之前调用;__new__是静态方法,__init__是实例方法。
Q51: Python中深浅拷贝的区别及实现
【核心解析】 浅拷贝只复制引用,不复制对象本身;深拷贝递归复制所有对象;使用copy.copy()浅拷贝,copy.deepcopy()深拷贝;可变对象需注意。
Q52: Python中哪些数据类型可变,哪些不可变?
【核心解析】 不可变:int, float, str, tuple, frozenset;可变:list, dict, set;可变类型可修改内容,不可变类型不可修改。
Q53: Python中判断None用==还是is?为什么?
【核心解析】 用is;is比较对象身份,==比较值;None是单例,is更准确且高效。
Q54: Python中list和tuple的区别
【核心解析】 list可变,tuple不可变;list可增删改,tuple不可;tuple可作为字典键;list内存更大。
Q55: Python中什么场景下用dict?
【核心解析】 需要键值对映射;快速查找O(1);存储结构化数据;如缓存、配置。
Q56: Python中函数传入列表用什么参数*,传入字典用什么参数**?
【核心解析】 *args接收可变位置参数,**kwargs接收可变关键字参数;*用于解包列表,**用于解包字典。
Q57: Python有哪些基本数据类型
【核心解析】 数字:int、float、complex;字符串str;列表list;元组tuple;字典dict;集合set;布尔bool
Q58: Python装饰器是什么
【核心解析】 装饰器是接受函数并返回函数的可调用对象;用于在不修改原函数代码的情况下添加功能;使用@语法糖;常见用途:日志、计时、权限检查
Q59: Python中list和tuple的区别是什么?lambda函数的应用场景有哪些?
【核心解析】 list可变,tuple不可变;list支持增删改,tuple用于固定数据;lambda用于简单函数,如排序key、map/filter等
Q60: Python的GIL机制是什么?多线程和多进程有什么区别?装饰器的原理是什么?
【核心解析】 GIL:全局解释器锁,限制同一时刻只有一个线程执行Python字节码;多线程适合IO密集型,多进程适合CPU密集型;装饰器本质是函数,接收函数返回新函数,用于增强功能
Q61: 面向过程和面向对象编程的区别是什么?
【核心解析】 面向过程以函数为核心,数据与操作分离,适合简单任务;面向对象以类和对象为核心,封装、继承、多态,适合复杂系统;Python支持两种范式;面向对象更易维护和扩展。
Q62: Python中常见的数据类型有哪些?
【核心解析】 不可变类型:int, float, str, tuple, frozenset;可变类型:list, dict, set;Python动态类型;类型转换函数。
Q63: Python中常用的库有哪些?
【核心解析】 标准库:os, sys, re, json, datetime;第三方库:numpy, pandas, requests, flask, django;根据用途选择。
Q64: Python中 is 和 == 的区别是什么?
【核心解析】 is 比较对象的内存地址,== 比较对象的值;对于不可变类型如小整数、字符串,Python会进行缓存,可能导致 is 返回 True;自定义类需实现 eq 方法才能用 == 比较;is None 是检查 None 的推荐方式。
Q65: Python中深拷贝和浅拷贝的区别是什么?
【核心解析】 浅拷贝只复制对象本身,不复制内部子对象,修改子对象会影响原对象;深拷贝递归复制所有子对象,完全独立;copy模块提供 copy() 和 deepcopy() 函数;对于不可变对象,浅拷贝和深拷贝效果相同。
Q66: Python中装饰器和闭包的关系是什么?
【核心解析】 闭包是函数内部定义函数并引用外部变量,装饰器是闭包的一种应用;装饰器用于在不修改原函数代码的情况下增加功能;装饰器语法 @decorator 等价于 func = decorator(func);装饰器可以带参数,需要多层嵌套。
Q67: Python中列表、队列等容器的区别和适用场景是什么?
【核心解析】 list 是动态数组,支持随机访问,插入删除慢;deque 是双端队列,两端操作快;queue.Queue 是线程安全队列;list 适合频繁读取,deque 适合频繁两端操作,Queue 适合多线程。
Q68: Python递归默认层数限制是多少?如何修改?
【核心解析】 默认递归深度限制为1000;使用 sys.setrecursionlimit(n) 可修改;但过深递归可能导致栈溢出;建议用迭代或尾递归优化。
Q69: 请解释Python中可变数据类型和不可变数据类型的区别,并举例。
【核心解析】 不可变类型:int、float、str、tuple、frozenset等,创建后不可修改;可变类型:list、dict、set等,可原地修改;不可变类型可作为字典键,可变类型不可;函数参数传递时,不可变类型按值传递,可变类型按引用传递。
Q70: 请解释Python中类方法和实例方法的区别,并举例说明各自的应用场景。
【核心解析】 实例方法第一个参数为self,访问实例属性和方法;类方法使用@classmethod装饰,第一个参数为cls,可访问类属性和调用其他类方法;实例方法用于操作实例状态;类方法用于工厂模式、访问类变量;静态方法@staticmethod无特殊参数,用于工具函数。
Q71: 请解释Python中__new__和__init__的区别。
【核心解析】 __new__用于创建实例,返回实例对象,是静态方法;__init__用于初始化实例,无返回值;new__在__init__之前调用;通常用于控制实例创建,如单例模式;自定义元类时需重写__new。
Q72: 请解释Python中深拷贝和浅拷贝的区别,并举例。
【核心解析】 浅拷贝复制对象本身,但不复制内部子对象,子对象引用相同;深拷贝递归复制所有子对象,完全独立;使用copy.copy()浅拷贝,copy.deepcopy()深拷贝;对于不可变对象,浅拷贝和深拷贝效果相同;注意循环引用时深拷贝可能栈溢出。
Q73: 请解释Python装饰器的作用,并给出一个简单示例。
【核心解析】 装饰器用于在不修改原函数代码的情况下增加功能;本质是返回函数的高阶函数;常见用途:日志、计时、权限检查、缓存;示例:@timer def func(): pass,其中timer是装饰器;支持带参数装饰器;可叠加多个装饰器。
Q74: Python上下文管理器是什么?谈谈对它的理解。
【核心解析】 上下文管理器用于资源管理,如文件打开、锁获取等;通过__enter__和__exit__方法实现;使用with语句自动调用;也可使用contextlib.contextmanager装饰器;确保资源正确释放,即使发生异常。
Q75: Python中迭代器和生成器的区别是什么?
【核心解析】 迭代器是实现了__iter__和__next__方法的对象,可遍历;生成器是特殊的迭代器,使用yield关键字,函数返回生成器对象;生成器惰性求值,节省内存;迭代器需要手动实现,生成器自动生成。
Q76: Python中常用的原生库有哪些?请列举并说明用途。
【核心解析】 os(操作系统接口)、sys(系统参数)、json(JSON处理)、re(正则表达式)、datetime(日期时间)、math(数学函数)、random(随机数)、collections(容器数据类型)、itertools(迭代器工具)、functools(高阶函数)等。
Q77: Python中常用的框架有哪些?
【核心解析】 Web框架:Django、Flask、FastAPI;爬虫框架:Scrapy;数据分析:Pandas、NumPy;机器学习:TensorFlow、PyTorch、Scikit-learn;异步框架:aiohttp、Tornado。
Q78: Python中ORM是什么?用过哪些数据库组件?
【核心解析】 ORM(对象关系映射)将数据库表映射为Python对象,简化数据库操作;常用ORM:Django ORM、SQLAlchemy、Peewee;数据库组件:连接池、事务管理、查询构建器等;支持多种数据库如MySQL、PostgreSQL、SQLite。
Q79: Python多线程与多进程的区别是什么?为什么说GIL使得线程在CPU密集型任务中不如进程?
【核心解析】 GIL(全局解释器锁)限制同一时刻只有一个线程执行Python字节码;多线程适合I/O密集型任务,多进程适合CPU密集型任务;多进程通过fork创建独立进程,拥有独立GIL,可并行利用多核;多线程共享内存,多进程需通过IPC通信;Python的threading模块用于线程,multiprocessing模块用于进程。
Q80: Python2和Python3中声明元类的方式有何不同?请举例说明。
【核心解析】 Python2中通过__metaclass__属性或metaclass关键字参数;Python3中在类定义时使用metaclass=MetaClass;示例:Python2: class Foo(object): metaclass = MetaClass;Python3: class Foo(metaclass=MetaClass): pass
Q81: 请解释Python中的装饰器、锁、进程和并发编程。
【核心解析】 装饰器用于扩展函数功能;锁用于线程同步,如互斥锁;进程是独立运行的程序,多进程可并行执行;并发编程涉及线程、进程、协程,常用模块有threading、multiprocessing、asyncio。
Q82: 请解释爬虫中HTTP请求头(head)各参数的含义和作用。
【核心解析】 User-Agent标识客户端类型;Referer标识来源页面;Cookie用于会话保持;Authorization用于认证;Content-Type指定请求体格式;Accept指定可接受的响应类型。
Q83: Python中pandas库的常用数据类型和函数有哪些?请举例说明。
【核心解析】 常用数据类型:Series(一维带标签数组)、DataFrame(二维表格);常用函数:read_csv、head、info、describe、groupby、merge、apply、get_dummies等;get_dummies用于将分类变量转换为虚拟变量。
Q84: Python中可变数据类型和不可变数据类型有哪些?集合是可变的吗?
【核心解析】 不可变:int、float、str、tuple、frozenset;可变:list、dict、set;集合set是可变的,可以添加或删除元素,但集合中的元素必须是不可变的。
Q85: 什么是Python中的闭包?请举例说明其作用。
【核心解析】 闭包是内部函数引用了外部函数的变量,并且外部函数返回内部函数;闭包可以保留外部变量的状态,常用于装饰器、回调函数等;注意闭包中变量是延迟绑定的,循环中可能产生意外结果。
Q86: Python装饰器是什么?如何使用?请写一个简单的装饰器示例。
【核心解析】 装饰器是一个可调用对象,用于在不修改原函数代码的情况下增加功能;使用@语法糖;示例:计时装饰器、日志装饰器;装饰器可以带参数。
Q87: Python代码编译后运行效率如何?与C语言相比有何差异?
【核心解析】 Python是解释型语言,动态类型和高级数据结构导致运行速度较慢;CPython解释器将代码编译为字节码再执行;PyPy等JIT编译器可提升性能;C语言编译为机器码,执行效率远高于Python。
Q88: 请解释Python中的迭代器、生成器、装饰器、闭包、元类、深浅拷贝的概念及使用场景。
【核心解析】 迭代器是实现了__iter__和__next__方法的对象,用于遍历数据流;生成器是使用yield关键字的函数,用于惰性求值;装饰器用于在不修改函数代码的情况下增加功能;闭包是嵌套函数中内部函数引用外部变量的现象;元类是类的类,用于控制类的创建;浅拷贝只复制对象引用,深拷贝递归复制所有对象。
Q89: Python中list和tuple的区别是什么?
【核心解析】 list是可变的,支持增删改操作;tuple是不可变的,创建后不能修改;list性能略低于tuple;tuple可以作为字典的键,list不能。
Q90: Python中装饰器的作用和实现方式是什么?
【核心解析】 装饰器用于在不修改原函数的情况下增加功能;基于闭包实现;使用@语法糖;可带参数装饰器;常见应用如日志、计时、权限检查
Q91: Python中基本数据结构(列表、元组、字典、集合)的区别及操作有哪些?
【核心解析】 列表可变有序,支持增删改查;元组不可变有序,用于存储固定数据;字典键值对,键唯一;集合无序不重复,支持交并差运算;各自适用场景
Q92: Python中删除操作在内存中是如何处理的?
【核心解析】 del语句删除引用,对象引用计数减1;引用计数为0时触发垃圾回收;循环引用需gc模块处理;内存管理基于引用计数和分代回收
Q93: Python中深拷贝和浅拷贝的区别及使用场景是什么?
【核心解析】 浅拷贝只复制对象引用,不复制内部子对象;深拷贝递归复制所有子对象;使用copy.copy()进行浅拷贝,copy.deepcopy()进行深拷贝;浅拷贝适用于对象内部元素不可变或共享的场景;深拷贝适用于需要完全独立副本的场景;注意循环引用和自定义对象的拷贝行为。
Q94: Python中的闭包是什么?请举例说明其应用场景。
【核心解析】 闭包是内部函数引用了外部函数作用域中的变量;外部函数返回内部函数;闭包可以保留外部变量的状态;常用于装饰器、回调函数、延迟计算;注意闭包中变量的生命周期和内存管理。
Q95: Python的基本数据类型有哪些?
【核心解析】 不可变类型:int、float、str、tuple、frozenset;可变类型:list、dict、set;布尔类型bool是int的子类;NoneType表示空值;bytes和bytearray用于二进制数据。
Q96: 请解释Python中浅拷贝和深拷贝的区别,并举例说明如何实现。
【核心解析】 浅拷贝只复制对象本身,不复制内部子对象,子对象引用共享;深拷贝递归复制所有子对象,完全独立;使用copy模块的copy()和deepcopy();对于不可变对象,浅拷贝和深拷贝效果相同;注意循环引用问题。
Q97: 请解释Python的GIL(全局解释器锁)是什么,它对多线程程序有什么影响?如何绕过GIL的限制?
【核心解析】 GIL是CPython解释器中的互斥锁,确保同一时刻只有一个线程执行Python字节码;导致CPU密集型多线程程序无法利用多核优势;I/O密集型程序受影响较小;可通过多进程、使用C扩展(如numpy)、或使用其他Python实现(如Jython、IronPython)绕过。
Q98: 请解释Python生成器(generator)的概念、工作原理以及yield关键字的作用。
【核心解析】 生成器是使用yield关键字的函数,返回一个迭代器;每次调用next()时执行到yield并暂停,保存状态;用于惰性求值,节省内存;可通过生成器表达式创建;与迭代器协议一致。
Q99: 请解释Python中list和tuple的区别。
【核心解析】 list可变,tuple不可变;list有append、remove等方法,tuple没有;tuple可作为字典键;list通常用于同类型元素,tuple用于异构数据;性能上tuple略快。
Q100: 请解释Python中元类(metaclass)的概念及其用途。
【核心解析】 元类是创建类的类,默认是type;可用于拦截类创建过程,修改类定义;常见用途:ORM、单例模式、自动注册;通过继承type并重写__new__或__init__实现;使用metaclass关键字指定。
Q101: 解释Python中的GIL(全局解释器锁)是什么?它对多线程编程有什么影响?如何绕过GIL的限制?
【核心解析】 GIL是CPython解释器中的互斥锁,确保同一时刻只有一个线程执行Python字节码;GIL导致CPU密集型多线程程序无法利用多核优势;I/O密集型任务受GIL影响较小;可以使用多进程(multiprocessing)绕过GIL;使用C扩展(如numpy)释放GIL;Python的asyncio协程也可避免GIL问题。
Q102: Python中的作用域规则是什么?
【核心解析】 Python作用域遵循LEGB规则:Local(局部)、Enclosing(闭包)、Global(全局)、Built-in(内置);变量查找顺序由内到外;global和nonlocal关键字用于修改全局或闭包变量;函数内部变量默认是局部作用域。
Q103: 请实现一个二分查找算法,用于解决给定问题:有n个任务,每个任务每天产生a[i]个产品,需要b个产品,求最少天数。
【核心解析】 使用二分答案法,左边界为-1,右边界为足够大的数(如1e18);check函数判断mid天内能否生产至少b个产品;计算每个任务mid天总产量,除以b累加;若累加和小于b则返回True,否则False;二分结束后输出左边界+1。
Q104: Python 中并发方法有哪些?
【核心解析】 多线程:threading 模块,适合 I/O 密集型任务,受 GIL 限制;多进程:multiprocessing 模块,适合 CPU 密集型任务,绕过 GIL;异步编程:asyncio 模块,基于事件循环和协程,适合高 I/O 并发;concurrent.futures:提供线程池和进程池的高级接口。