十二月 21, 2025
16 分钟阅读

初级后端开发工程师(Python)面试题:完整指南

interview
career-advice
job-search
entry-level
初级后端开发工程师(Python)面试题:完整指南
MB

Milad Bonakdar

作者

掌握Python后端开发,通过涵盖Python基础、Django/Flask、数据库、API等的必备面试题。为初级后端开发工程师面试做好充分准备。


介绍

本综合指南包含 30 个关于 Python 后端开发的重要面试问题。这些问题旨在帮助初级后端开发人员准备面试,内容涵盖 Python、Web 框架 (Django/Flask)、数据库和通用后端架构中的关键概念。每个问题都包含详细的答案、稀有度评估和难度等级。

无论您是刚开始您的职业生涯还是希望转行到后端开发,本指南都将帮助您建立信心并掌握基础知识。


Python 基础 (10 个问题)

1. Python 中 listtuple 的区别是什么?

答案:

  • list: 可变的(可以更改),用方括号 [] 定义,比元组慢。
  • tuple: 不可变的(不能更改),用括号 () 定义,比列表快,可以用作字典键。

例子:

# 列表
my_list = [1, 2, 3]
my_list[0] = 10  # 允许

# 元组
my_tuple = (1, 2, 3)
# my_tuple[0] = 10  # TypeError: 'tuple' object does not support item assignment

稀有度: 常见 难度: 简单


2. 解释 is== 的区别

答案:

  • ==: 检查值是否相等(对象是否具有相同的值?)。
  • is: 检查引用是否相等(变量是否指向内存中的完全相同的对象?)。

例子:

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)  # True (值相同)
print(a is b)  # False (内存中不同的对象)

c = a
print(a is c)  # True (相同的对象)

稀有度: 常见 难度: 简单


3. 什么是 Python 装饰器,它们是如何工作的?

答案: 装饰器是 Python 中的一种设计模式,允许用户在不修改其结构的情况下向现有对象添加新功能。装饰器通常在您要装饰的函数定义之前调用。

例子:

def my_decorator(func):
    def wrapper():
        print("在函数被调用之前发生了一些事情。")
        func()
        print("在函数被调用之后发生了一些事情。")
    return wrapper

@my_decorator
def say_hello():
    print("你好!")

say_hello()
# 输出:
# 在函数被调用之前发生了一些事情。
# 你好!
# 在函数被调用之后发生了一些事情。

稀有度: 常见 难度: 中等


4. *args**kwargs 的区别是什么?

答案:

  • *args: 允许您将可变数量的非关键字参数传递给函数。它将它们收集到一个元组中。
  • **kwargs: 允许您将可变数量的关键字参数传递给函数。它将它们收集到一个字典中。

例子:

def example_function(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

example_function(1, 2, 3, name="Alice", age=30)
# 输出:
# args: (1, 2, 3)
# kwargs: {'name': 'Alice', 'age': 30}

稀有度: 常见 难度: 简单


5. 解释列表推导式

答案: 列表推导式提供了一种创建列表的简洁方法。常见的应用是创建新列表,其中每个元素都是对另一个序列或可迭代对象的每个成员应用某些操作的结果,或者创建满足特定条件的那些元素的子序列。

例子:

# 传统方式
squares = []
for x in range(10):
    squares.append(x**2)

# 列表推导式
squares = [x**2 for x in range(10)]

稀有度: 常见 难度: 简单


6. 什么是生成器和 yield 关键字?

答案: 生成器是创建迭代器的一种简单方法。它们是返回一个对象(迭代器)的函数,我们可以迭代该对象(一次一个值)。yield 关键字的用法类似于 return,不同之处在于该函数将返回一个生成器。

例子:

def simple_generator():
    yield 1
    yield 2
    yield 3

for value in simple_generator():
    print(value)
# 输出: 1, 2, 3

优点: 内存效率高(惰性求值)。

稀有度: 中等 难度: 中等


7. Python 中的内存管理是如何工作的?

答案: Python 使用私有堆空间来管理内存。所有 Python 对象和数据结构都位于私有堆中。程序员无权访问此私有堆。解释器负责处理此 Python 私有堆。 Python 还有一个内置的垃圾收集器,它可以回收所有未使用的内存,以便将其提供给堆空间。

稀有度: 中等 难度: 中等


8. 什么是全局解释器锁 (GIL)?

答案: 全局解释器锁 (GIL) 是一种互斥锁,用于保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。这种锁是必要的,主要是因为 CPython 的内存管理不是线程安全的。

影响: 它限制了多线程 Python 程序在单个 CPU 核心上运行,这可能成为 CPU 密集型任务的瓶颈。

稀有度: 中等 难度: 困难


9. 解释深拷贝和浅拷贝的区别

答案:

  • 浅拷贝: 创建一个新对象,该对象存储对原始元素的引用。因此,浅拷贝不会创建嵌套对象的副本,而是只复制嵌套对象的引用。
  • 深拷贝: 创建一个新对象,并递归地添加原始元素中存在的嵌套对象的副本。

例子:

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)
deep = copy.deepcopy(original)

original[0][0] = 'X'
print(shallow[0][0]) # 'X' (受影响)
print(deep[0][0])    # 1 (未受影响)

稀有度: 中等 难度: 中等


10. Python 的内置数据类型有哪些?

答案:

  • 数值: int, float, complex
  • 序列: list, tuple, range
  • 文本: str
  • 映射: dict
  • 集合: set, frozenset
  • 布尔: bool
  • 二进制: bytes, bytearray, memoryview

稀有度: 常见 难度: 简单


Web 框架 (Django/Flask) (10 个问题)

11. 比较 Django 和 Flask

答案:

  • Django: “自带电池”的框架。包括 ORM、身份验证、管理面板等。适用于大型、复杂的应用程序。遵循 MVT(模型-视图-模板)模式。
  • Flask: 微框架。简约、灵活。您可以选择所需的工具(ORM、身份验证等)。适用于较小的应用程序、微服务,或者当您需要细粒度控制时。

稀有度: 常见 难度: 简单


12. 什么是 MVC 模式(以及 Django 中的 MVT)?

答案:

  • MVC(模型-视图-控制器): 一种架构模式,将应用程序分为三个主要逻辑组件:模型(数据)、视图(用户界面)和控制器(处理输入)。
  • MVT(模型-视图-模板): Django 的变体。
    • 模型: 数据结构(数据库)。
    • 视图: 业务逻辑(类似于 MVC 中的控制器)。
    • 模板: 呈现层(类似于 MVC 中的视图)。

稀有度: 常见 难度: 中等


13. 解释 Django ORM

答案: Django ORM(对象关系映射)允许您使用 Python 代码而不是 SQL 与数据库(如 SQLite、PostgreSQL 和 MySQL)进行交互。您可以将数据模型定义为 Python 类,Django 会处理数据库表的创建和查询。

例子:

# 模型
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

# 查询
Person.objects.filter(first_name="John")

稀有度: 常见 难度: 中等


14. 什么是 Django 中的迁移?

答案: 迁移是 Django 将您对模型所做的更改(添加字段、删除模型等)传播到数据库模式的方式。它们被设计为大部分是自动的,但您需要知道何时进行迁移、何时运行它们以及您可能遇到的常见问题。

命令:

  • makemigrations:根据模型更改创建新的迁移。
  • migrate:将迁移应用到数据库。

稀有度: 常见 难度: 简单


15. Flask 如何处理路由?

答案: Flask 使用 @app.route() 装饰器将函数绑定到 URL。

例子:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return '你好,世界!'

@app.route('/user/<username>')
def show_user_profile(username):
    return f'用户 {username}'

稀有度: 常见 难度: 简单


16. 什么是 Flask 蓝图?

答案: 蓝图是一种将 Flask 应用程序组织成模块的方式。它们允许您将相关的路由、模板和静态文件组合在一起。这对于扩展 Flask 应用程序至关重要。

稀有度: 中等 难度: 中等


17. 解释 Django 中间件的概念

答案: 中间件是一个钩子框架,用于处理 Django 的请求/响应。它是一个轻量级的、低级别的“插件”系统,用于全局更改 Django 的输入或输出。每个中间件组件负责执行一些特定的功能。

例子: AuthenticationMiddleware, SessionMiddleware, CsrfViewMiddleware。

稀有度: 中等 难度: 中等


18. 如何在 Flask 中处理会话?

答案: Flask 使用签名 cookie 来存储会话内容。用户可以查看 cookie 的内容,但不能修改它,除非他们知道用于签名的密钥。

例子:

from flask import session

@app.route('/login', methods=['POST'])
def login():
    session['username'] = request.form['username']
    return redirect(url_for('index'))

稀有度: 中等 难度: 中等


19. settings.py 在 Django 中的用途是什么?

答案: settings.py 是 Django 项目的主要配置文件。它包含项目的所有配置,包括数据库设置、已安装的应用程序、中间件、模板设置、静态文件路径和安全密钥。

稀有度: 常见 难度: 简单


20. 如何防止 Django 中的 CSRF 攻击?

答案: Django 内置了防止跨站请求伪造 (CSRF) 的保护。它使用为每个用户会话生成的 CSRF 令牌。此令牌必须包含在每个 POST 请求中(通常作为隐藏表单字段)。服务器在处理请求之前验证令牌。

稀有度: 中等 难度: 中等


数据库和通用后端 (10 个问题)

21. SQL vs NoSQL

答案:

  • SQL(关系型): 结构化数据,预定义的模式,表、行、列。适用于复杂的查询和事务 (ACID)。示例:PostgreSQL、MySQL。
  • NoSQL(非关系型): 非结构化或半结构化数据,动态模式,文档、键值对。适用于可伸缩性、快速原型设计和大型数据集。示例:MongoDB、Redis。

稀有度: 常见 难度: 简单


22. 什么是 API?

答案: API 代表应用程序编程接口。它是一组规则和协议,允许不同的软件应用程序相互通信。在后端开发中,我们通常构建 RESTful API 或 GraphQL API,以允许前端(Web、移动)与后端数据和逻辑进行交互。

稀有度: 常见 难度: 简单


23. 解释 RESTful API 原则

答案:

  • 客户端-服务器: 关注点分离。
  • 无状态: 请求之间服务器上不存储客户端上下文。
  • 可缓存: 响应必须将自身定义为可缓存或不可缓存。
  • 统一接口: 标准化的通信方式(HTTP 方法:GET、POST、PUT、DELETE)。
  • 分层系统: 客户端通常无法判断它是直接连接到最终服务器,还是连接到沿途的中间服务器。

稀有度: 常见 难度: 中等


24. 什么是 HTTP 状态代码?举例说明。

答案: Web 服务器在 Internet 上给出的标准响应代码。

  • 2xx 成功: 200 OK, 201 Created。
  • 3xx 重定向: 301 Moved Permanently, 304 Not Modified。
  • 4xx 客户端错误: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found。
  • 5xx 服务器错误: 500 Internal Server Error, 502 Bad Gateway。

稀有度: 常见 难度: 简单


25. 什么是数据库索引?

答案: 索引是一种数据结构技术,用于快速定位和访问数据库中的数据。索引是使用一些数据库列创建的。它提高了数据库表中数据检索操作的速度,但代价是需要额外的写入和存储空间来维护索引数据结构。

稀有度: 中等 难度: 中等


26. 解释数据库中 ACID 属性的概念

答案:

  • 原子性: 事务中的所有操作都成功,或者每个操作都回滚。
  • 一致性: 数据库在成功提交事务后正确更改状态。
  • 隔离性: 使事务能够独立于彼此且对彼此透明地运行。
  • 持久性: 确保在发生系统故障时,已提交事务的结果或影响仍然存在。

稀有度: 中等 难度: 中等


27. 什么是 Docker,为什么要使用它?

答案: Docker 是一个用于在容器中开发、交付和运行应用程序的平台。容器是轻量级的、可移植的和自给自足的单元,包括运行应用程序所需的一切(代码、运行时、系统工具、库)。 它解决了“在我的机器上可以工作”的问题,并确保不同环境(开发、暂存、生产)之间的一致性。

稀有度: 常见 难度: 中等


28. 什么是单元测试?

答案: 单元测试是一种软件测试方法,其中测试软件的各个单元或组件。目的是验证软件代码的每个单元是否按预期执行。在 Python 中,通常使用 unittest 框架或 pytest

稀有度: 常见 难度: 简单


29. 什么是 Git,为什么它很重要?

答案: Git 是一个分布式版本控制系统。它跟踪软件开发期间源代码中的更改。它允许多个开发人员同时处理同一个项目,管理代码的不同版本(分支),并在必要时恢复到以前的状态。

稀有度: 常见 难度: 简单


30. 如何保护后端 API 的安全?

答案:

  • 身份验证: 验证用户是谁(JWT、OAuth)。
  • 授权: 验证用户被允许做什么(角色/权限)。
  • HTTPS: 加密传输中的数据。
  • 输入验证: 清理所有输入以防止 SQL 注入和 XSS。
  • 速率限制: 防止滥用/DDoS。
  • CORS: 限制哪些域可以访问您的 API。

稀有度: 中等 难度: 中等

Newsletter subscription

真正有效的每周职业建议

将最新见解直接发送到您的收件箱

Decorative doodle

在招聘人员面前脱颖而出,获得梦想工作

加入成千上万通过AI驱动的简历改变职业生涯的人,这些简历可以通过ATS并给招聘经理留下深刻印象。

立即开始创建

分享这篇文章

将简历撰写时间减少90%

普通求职者需要花费3小时以上来格式化简历。我们的AI在15分钟内完成,让您以12倍的速度进入申请阶段。