目录

一、性能与效率篇🚀

1、提高 Python 执行效率的方法你用过哪些?

2、什么是鸭子类型(Duck Typing)?

二、基础语法与特性篇🛠️

3、*args 和 **kwargs 的区别是什么?

4、read, readline, readlines 的区别是什么?

5、用过哪些第三方包?

三、框架与架构篇🌐

6、 Django、Flask、Tornado 三大框架各自的应用场景?

7、什么是 RESTful API?谈谈你的理解。

四、语言本质篇🧠

8、Python 是强语言类型还是弱语言类型?

9、谈一下什么是解释性语言,什么是编译性语言?

10、 说一下字典(dict)和 JSON 的区别?

🎯 结语


一、性能与效率篇🚀

1、提高 Python 执行效率的方法你用过哪些?

🗣️ 推荐话术
“Python 作为解释型语言,在执行效率上确实不如 C/C++,但在实际工程中,我通常从以下几个维度进行优化:

  1. 算法与数据结构层面
    • 这是最根本的。比如将列表查找 O(n)O(n) 优化为字典/集合查找 O(1)O(1) 。
    • 使用内置函数(如 summap)和 list comprehension,因为它们底层是 C 实现的,比纯 Python 循环快得多。
  2. 并发模型层面
    • 如果是 CPU 密集型 任务(如复杂计算),由于 GIL 锁的存在,我会使用 multiprocessing 多进程来利用多核 CPU。
    • 如果是 I/O 密集型 任务(如爬虫、DB 操作),我会使用 asyncio 协程或多线程,避免阻塞等待。
  3. 工具与扩展层面
    • 对于极耗时的热点代码,我会考虑用 Cython 将其编译为 C 扩展,或者使用 NumPy 进行向量化计算。
    • 在部署时,也可以尝试 PyPy 解释器,它带有 JIT 编译,对长运行程序有显著提速。”

💡 加分项:提到“先使用 cProfile 进行性能分析,找到瓶颈再优化”,体现工程化思维。


2、什么是鸭子类型(Duck Typing)?

🗣️ 推荐话术
“鸭子类型是 Python 动态类型系统的核心哲学,源自那句名言:‘如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子。’

  • 核心含义:在 Python 中,判断一个对象能不能用,不看它继承自哪个类,也不看它有没有实现某个接口,只看它是否拥有对应的方法或属性
  • 优势:这极大地降低了代码耦合度。我们不需要定义严格的 Interface 或 Abstract Base Class,只要对象行为符合预期,就可以直接传递使用。”

📝 代码演示

class Duck:
    def speak(self): print("Quack")

class Person:
    def speak(self): print("Hello")

def make_speak(obj):
    # 不关心 obj 是什么类,只要有 speak 方法就行
    obj.speak() 

make_speak(Duck())   # OK
make_speak(Person()) # OK

二、基础语法与特性篇🛠️

3、*args 和 **kwargs 的区别是什么?

🗣️ 推荐话术
“它们主要用于处理可变数量的参数,区别在于接收参数的形式:

  1. *args (Arguments)
    • 用于接收任意数量的位置参数
    • 在函数内部,它们会被打包成一个元组 (tuple)
  2. **kwargs (Keyword Arguments)
    • 用于接收任意数量的关键字参数
    • 在函数内部,它们会被打包成一个字典 (dict)

注意点:在函数定义时,参数顺序必须是:普通参数 -> *args -> 默认参数 -> **kwargs。”


4、readreadlinereadlines 的区别是什么?

🗣️ 推荐话术
“这三个方法都用于读取文件,主要区别在于返回值类型内存占用

  1. read():一次性读取整个文件内容到一个字符串中。适合小文件,大文件会爆内存。
  2. readline():每次只读取一行。适合逐行处理大文件,节省内存。
  3. readlines():一次性读取所有行,返回一个列表,每个元素是一行字符串。适合需要随机访问某一行数据的场景。

最佳实践:在处理超大日志文件时,我最推荐直接使用 for line in f: 迭代文件对象,这比 readline 更 Pythonic 且内存效率最高。”


5、用过哪些第三方包?

🗣️ 推荐话术
(建议根据您简历上的项目经验挑选 3-4 个重点说,不要只报菜名)

“我常用的库主要分为几类:

  • 网络请求Requests 是我用得最多的 HTTP 客户端;如果是异步场景会用 Httpx 或 Aiohttp
  • 数据处理Pandas 和 NumPy 是数据清洗和分析的标配。
  • Web 开发Django 用于快速构建大型后台,Flask 或 FastAPI 用于构建微服务接口。
  • 任务队列:在之前的项目中,我用 Celery + Redis 处理过异步邮件发送和耗时报表生成。
  • 其他Loguru 做日志处理,Pydantic 做数据校验。”

三、框架与架构篇🌐

6、 Django、Flask、Tornado 三大框架各自的应用场景?

🗣️ 推荐话术
“这三者代表了不同的设计理念:

  1. Django
    • 特点:‘大而全’(Batteries included),自带 ORM、Admin、Auth 等全套组件。
    • 场景:适合快速开发内容管理系统(CMS)、电商后台、企业级复杂应用。追求开发效率和标准化。
  2. Flask
    • 特点:‘微框架’,核心轻量,功能靠插件扩展。
    • 场景:适合微服务、小型 API 接口、原型验证,或者对技术栈有高度定制需求的项目。
  3. Tornado
    • 特点:原生支持异步非阻塞 I/O,擅长处理长连接。
    • 场景:高并发即时通讯(IM)、WebSocket 推送、实时聊天室。
    • (补充):现在高性能异步场景,很多人也开始转向 FastAPI 或 Sanic。”

7、什么是 RESTful API?谈谈你的理解。

🗣️ 推荐话术
“RESTful 是一种软件架构风格,核心思想是将所有事物视为资源(Resource),通过统一的接口对资源进行操作。我的理解主要包含以下几点:

  1. 资源定位:使用 URI(URL)唯一标识资源,如 /users/123
  2. 无状态:每次请求必须包含所有必要信息,服务端不保存客户端上下文。
  3. 统一接口(HTTP 动词)
    • GET:获取资源。
    • POST:新建资源。
    • PUT/PATCH:更新资源。
    • DELETE:删除资源。
  4. 表现层分离:数据传输格式通常为 JSON,与具体实现语言无关。

实战细节:在设计 API 时,我会严格遵循 HTTP 状态码规范(如 201 Created, 404 Not Found),并采用版本号控制(如 /api/v1/users)以保证兼容性。”


四、语言本质篇🧠

8、Python 是强语言类型还是弱语言类型?

🗣️ 推荐话术
“这是一个常考的概念辨析题。Python 是 强类型(Strongly Typed) 且 动态类型(Dynamically Typed) 的语言。

  • 强类型:意味着类型安全,不允许隐式的、不安全的类型转换。
    • 例子"1" + 1 会直接报错 TypeError,不会像 JavaScript 那样自动变成 "11"。必须显式转换 int("1") + 1
  • 动态类型:变量在运行时才绑定类型,无需声明。
    • 例子x = 1 (int),随后 x = "hello" (str) 是合法的。

总结:Java 是强类型 + 静态类型;JS 是弱类型 + 动态类型;而 Python 兼具了动态的灵活性和强类型的安全性。”


9、谈一下什么是解释性语言,什么是编译性语言?

🗣️ 推荐话术
“这两者的主要区别在于代码执行前的处理方式

  1. 编译性语言(如 C, C++, Go)
    • 源代码在执行前,需要通过编译器一次性翻译成机器码(二进制文件)。
    • 优点:执行效率极高。
    • 缺点:跨平台性差(Windows 编译的程序不能在 Linux 跑)。
  2. 解释性语言(如 Python, JS)
    • 源代码不需要预编译成机器码,而是由解释器逐行读取、翻译并执行。
    • 优点:跨平台性好,开发调试灵活。
    • 缺点:运行速度相对较慢。

深度理解:其实 Python 介于两者之间。它先将源码 .py 编译成字节码 .pyc,然后由 Python 虚拟机(PVM)解释执行。所以它比纯解释语言快一点,但仍慢于 C。”


10、 说一下字典(dict)和 JSON 的区别?

🗣️ 推荐话术
“虽然它们长得像,但本质完全不同:

  1. 本质不同
    • Dict:是 Python 中的一种内存数据结构(对象)。
    • JSON:是一种数据交换格式(文本字符串),独立于语言。
  2. 键的限制
    • Dict:键可以是任何不可变类型(如 intstrtuple)。
    • JSON:键必须是字符串
  3. 值的限制
    • Dict:值可以是任意 Python 对象(包括自定义类、函数等)。
    • JSON:值只能是基本类型(String, Number, Boolean, Null, Array, Object)。

转换:我们需要通过 json.dumps() 将 Dict 序列化为 JSON 字符串,通过 json.loads() 反序列化回来。注意转换过程中,Dict 的整数键会被强制转为字符串。”


🎯 结语

这 10 道题涵盖了 Python 开发者从入门到进阶的核心知识体系。

  • 初级开发应重点掌握语法、文件操作和基础概念。
  • 中高级开发则需在性能优化、框架选型原理及架构设计上展现深度。

希望这篇整理能帮助大家在面试中脱颖而出!如果觉得有用,欢迎点赞 👍、收藏 ⭐、关注 ➕,后续我会持续更新更多大厂面试真题解析。

互动话题:你在面试中还遇到过哪些奇葩的 Python 问题?欢迎在评论区留言讨论!👇

更多推荐