Python 后端开发工程师需要掌握的不仅是 Python 语言本身,还涉及 Web 框架、数据库、缓存、RESTful API 设计、微服务、消息队列、安全性等多个方面。本文整理了常见的 Python 后端开发面试问题,并给出了详细的解答,帮助你在面试中脱颖而出。
1. Python 语言基础
1.1 Python 的数据类型有哪些?
Python 的主要数据类型:
- 数字类型:
int
,float
,complex
- 序列类型:
list
,tuple
,range
- 映射类型:
dict
- 集合类型:
set
,frozenset
- 文本类型:
str
- 二进制类型:
bytes
,bytearray
,memoryview
1.2 Python 是如何管理内存的?
Python 采用 垃圾回收机制(Garbage Collection,GC),主要方式:
- 引用计数(Reference Counting)
- 标记清除(Mark and Sweep)
- 分代回收(Generational GC)
可以手动调用垃圾回收:
import gc
gc.collect()
1.3 Python 解释器有哪些?
- CPython(官方默认实现)
- PyPy(支持 JIT 编译,加速执行)
- Jython(Python 运行在 JVM 上)
- IronPython(Python 运行在 .NET 平台)
2. Python 进阶
2.1 Python 的 GIL(全局解释器锁)是什么?
GIL(Global Interpreter Lock)限制了同一时刻只有一个线程能执行 Python 字节码,导致多线程不能提高 CPU 密集型任务的性能。
解决方案:
- 使用多进程(
multiprocessing
模块) - 使用 C 扩展
- 使用 JIT(如 PyPy)
2.2 Python 的 *args
和 **kwargs
有什么作用?
*args
用于接收可变数量的位置参数。**kwargs
用于接收可变数量的关键字参数。
def demo(*args, **kwargs):
print(args) # 元组
print(kwargs) # 字典
demo(1, 2, 3, name="Alice", age=25)
3. Python 后端框架
3.1 Flask 和 Django 的区别?
特性 | Flask | Django |
---|---|---|
适用场景 | 轻量级 Web 应用、API | 大型项目、全栈开发 |
组件 | 需要手动集成数据库、ORM | 自带 ORM、Admin、Auth |
灵活性 | 高(可自由选择组件) | 低(自带组件) |
3.2 用 Flask 实现一个简单的 API
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/hello', methods=['GET'])
def hello():
return jsonify({'message': 'Hello, World!'})
if __name__ == '__main__':
app.run(debug=True)
3.3 Django ORM 常见操作
from myapp.models import User
# 创建用户
user = User.objects.create(name="Alice", age=25)
# 查询
users = User.objects.filter(age__gt=20)
# 更新
User.objects.filter(name="Alice").update(age=26)
# 删除
User.objects.filter(name="Alice").delete()
4. 数据库
4.1 SQL 和 NoSQL 的区别?
特性 | SQL | NoSQL |
---|---|---|
结构 | 关系型数据库 | 文档、键值存储 |
事务支持 | ACID | CAP 理论 |
适用场景 | 结构化数据 | 海量数据存储(如日志) |
4.2 Python 连接 MySQL
import pymysql
conn = pymysql.connect(host="localhost", user="root", password="password", database="test_db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
cursor.close()
conn.close()
5. 缓存
5.1 Redis 常见数据结构
string
list
set
hash
zset
5.2 Python 操作 Redis
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'Alice')
print(r.get('name')) # 输出: Alice
6. 消息队列
6.1 RabbitMQ vs Kafka
特性 | RabbitMQ | Kafka |
---|---|---|
适用场景 | 任务队列 | 日志处理、大数据流 |
持久化 | 支持 | 强调分布式存储 |
延迟 | 低 | 高吞吐 |
6.2 Python 操作 RabbitMQ
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hello', body='Hello, RabbitMQ!')
connection.close()
7. RESTful API 设计
7.1 RESTful API 的特点
- 使用 HTTP 方法(GET、POST、PUT、DELETE)
- 无状态性
- 资源通过 URI 表示
- 返回 JSON 或 XML
7.2 Flask RESTful API 设计
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
return jsonify({"message": "User created", "data": data}), 201
8. 安全性
8.1 如何防止 SQL 注入?
使用参数化查询
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
8.2 如何防止 XSS 攻击?
- 对用户输入进行 HTML 转义
- 使用 CSP(内容安全策略)
- 避免直接插入用户输入的 HTML 代码
9. 测试
9.1 Python 单元测试
import unittest
def add(a, b):
return a + b
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
if __name__ == '__main__':
unittest.main()
10. Docker
10.1 用 Docker 运行 Python Web 应用
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
总结
本文整理了 Python 后端开发面试中的常见问题,涵盖基础知识、Web 开发、数据库、缓存、消息队列、安全性、测试等多个方面,希望能帮助你更好地准备面试!