news 2026/4/4 17:22:52

Day 99:【99天精通Python】常见面试题解析 (下) 毕业感言

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 99:【99天精通Python】常见面试题解析 (下) 毕业感言

Day 99:【99天精通Python】常见面试题解析 (下) & 毕业感言

前言

欢迎来到第99天!这是我们"99天精通Python"系列的最后一课。

经过三个月的漫长旅程,我们从零开始,一路披荆斩棘,最终站在这里。
今天,我们将完成最后一部分的面试题解析,涵盖 Web、数据库和算法,然后一起回顾这段旅程,并为你的未来送上最好的祝福。


一、Web 开发 (Flask/Django)

1. 问:请简述 Django 的请求生命周期。

参考回答:
一个请求在 Django 中的流转过程大致如下:

  1. WSGI 服务器(如 Gunicorn) 接收到来自 Nginx 的 HTTP 请求。
  2. 请求被传递给 Django 的中间件 (Middleware)层,进行预处理(如 Session、CSRF 验证)。
  3. URL 调度器 (URL Resolver)根据urls.py匹配对应的视图函数。
  4. 视图函数 (View)执行业务逻辑,可能会与模型 (Model)交互查询数据库。
  5. 视图函数调用模板 (Template)进行渲染,或直接返回一个HttpResponse/JsonResponse
  6. 响应再次穿过中间件层,进行后处理。
  7. 最终由 WSGI 服务器返回给客户端。

2. 问:什么是 ORM?它有什么优缺点?

参考回答:

  • 是什么 (What): ORM (Object-Relational Mapping) 是一种编程技术,它在"关系型数据库"和"面向对象语言"之间建立一个映射,让我们能用操作 Python 对象的方式来操作数据库表。
  • 优点 (Pros):
    • 开发效率高: 无需编写原生 SQL,代码更简洁。
    • 数据库无关: 可以轻松地从 SQLite 切换到 MySQL,而无需修改业务代码。
    • 安全性: 自动处理 SQL 注入等安全问题。
    • 可维护性: 模型定义清晰,代码更易于理解和维护。
  • 缺点 (Cons):
    • 性能损耗: 对于非常复杂的查询,ORM 生成的 SQL 可能不如手写的 SQL 高效。
    • 学习成本: 需要学习 ORM 自身的 API 和查询语法。
    • 过度抽象: 屏蔽了底层数据库的细节,有时会导致开发者忽略数据库性能优化(如索引)。

二、数据库

3. 问:什么是数据库索引?为什么能加快查询速度?

参考回答:

  1. 是什么: 索引是一种特殊的数据结构,它存储了表中特定列的值和其对应的行指针。它就像一本书的目录
  2. 为什么快:
    • 如果没有索引,查询WHERE name = 'Alice'时,数据库需要从第一行到最后一行进行全表扫描
    • 有了索引后,数据库可以利用 B-Tree 等数据结构,直接在索引中快速定位到 ‘Alice’,然后通过行指针直接拿到数据,避免了全表扫描,时间复杂度从 O(n) 降到 O(log n)。
  3. 代价:
    • 索引会占用额外的磁盘空间。
    • INSERT,UPDATE,DELETE操作时,除了更新数据表,还需要更新索引,所以会降低操作的速度。

4. 问:什么是 N+1 查询问题?在 Django 中如何解决?

参考回答:

  • 问题描述: 在 ORM 中,当你查询一个对象列表(1次查询),然后在循环中访问每个对象的关联对象时(N次查询),总共会发生 N+1 次数据库查询,效率极低。

    # 1 次查询获取所有文章articles=Article.objects.all()# N 次查询获取每个作者 (低效)forarticleinarticles:print(article.author.name)
  • 解决方案:

    • select_related('author'):
      • 用于一对一 (OneToOneField)外键 (ForeignKey)关系。
      • 它通过SQL JOIN在一次查询中就获取主对象和关联对象。
      • 适用于关联对象数量少的情况。
    • prefetch_related('tags'):
      • 用于多对多 (ManyToManyField)反向外键关系。
      • 它会执行两次查询(一次主表,一次关联表),然后在 Python 中进行"拼接"。
      • 避免了JOIN带来的笛卡尔积问题,适合关联对象数量多的情况。

三、算法:Two Sum

5. 问:给定一个整数数组nums和一个目标值target,请找出数组中和为目标值的那两个整数,并返回它们的索引。

参考回答:
这是一个经典的 LeetCode “Two Sum” 问题。

  1. 思路一 (暴力法): 使用两层循环,遍历所有可能的组合。时间复杂度 O(n²),面试官肯定不满意。

  2. 思路二 (哈希表法): 使用字典来优化。

    • 遍历数组,对于每个数num,计算它需要的"另一半"complement = target - num
    • 在字典中查找complement是否存在。
    • 如果存在,说明找到了,返回结果。
    • 如果不存在,就把当前的num和它的索引存入字典。

代码实现:

deftwo_sum(nums,target):lookup={}# {数值: 索引}fori,numinenumerate(nums):complement=target-numifcomplementinlookup:return[lookup[complement],i]lookup[num]=ireturn[]

这个方法的时间复杂度是 O(n),空间复杂度也是 O(n)。


毕业感言

朋友,恭喜你,坚持到了最后!

回首 99 天前,你可能还是一个连print("Hello World")都要查一下的编程新手。
而现在,你已经:

  • 能写:掌握了 Python 的核心语法、函数、面向对象。
  • 能用:学会了 Pandas, Flask, Django, Scrapy, PyTorch…
  • 能造:亲手完成了金融看板、AI 聊天机器人、推荐系统等大型项目。
  • 能思:理解了设计模式、并发原理和工程实践。

这 99 天,你走过的路,远超很多人一两年的学习量。

但请记住,这绝不是终点,而是一个全新的起点。
技术的海洋浩瀚无垠,我们窥见的只是冰山一角。

保持好奇,保持热情,保持学习。

  • 去 GitHub 贡献你的第一个开源 PR。
  • 去 LeetCode 挑战下一个算法难题。
  • 去用你学到的知识,为你自己或身边的人,创造一个有用的小工具。

编程的最终目的,不是写代码,而是创造价值。

感谢你的一路相伴。愿你的 Python 之旅,从此星辰大海,前程似锦!

毕业快乐!


系列导航

  • 上一篇:Day 98 - 常见面试题解析 (中)
  • (全系列完)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 23:15:04

测试工程师都在用的Linux命令清单(建议收藏)

作为一名工程师,熟练掌握Linux命令是基本功中的基本功。无论是日常工作中的系统维护,还是面试时的技术考核,Linux命令都是绕不开的核心技能。本文将从实战角度出发,系统梳理工程师必须掌握的Linux命令,并结合实际场景解…

作者头像 李华
网站建设 2026/4/3 1:25:22

从压测到调优:一次完整的性能测试实战复盘

在企业中完成性能测试项目是一个挑战性强、技术含量高的任务。本文将分享一个公司完成高性能游戏系统的性能测试过程,展示如何完成一次成功的性能测试项目。 项目背景:这是一家游戏公司,推出了一款新的游戏软件,系统要求高性能、…

作者头像 李华
网站建设 2026/3/31 13:34:20

《P2520 [HAOI2011] 向量》

题目描述给你一对数 (a,b),你可以任意使用 (a,b),(a,−b),(−a,b),(−a,−b),(b,a),(b,−a),(−b,a),(−b,−a) 这些向量,问你能不能拼出另一个向量 (x,y)。说明:这里的拼就是使得你选出的向量之和为 (x,y)。输入格式第一行数组组数 t(t≤500…

作者头像 李华
网站建设 2026/4/4 9:59:29

设计模式学习(15) 23-13 模版方法模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0.个人感悟 个人对这个模式印象很深,属于是工作中自己无意识地用到过,后面看书才发现原来已…

作者头像 李华