面试Python开发的这道题超简单,我却搞砸了!

2024-04-27 05:58

本文主要是介绍面试Python开发的这道题超简单,我却搞砸了!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题图 | Shutterstock / studiostoks

这道算法题明明超简单……

上午10点,在T公司的会议室里,小R正在参加一场他准备了好几天的技术面试。

整体来说,他在这场面试中的表现还不错。无论坐在小R对面的面试官提出什么问题,他都能侃侃而谈、对答如流。从单体应用聊到微服务,从虚拟机聊到云计算,每一块小R都说得滴水不漏。就在他慢慢认为自己胜券在握,可以通过这家自己憧憬已久的公司面试时,对面的面试官突然说道:“技术问题我问得差不多了。最后有一道编程题,希望你可以做一下。”

说完,面试官低头从包里拿出了一台笔记本电脑,递给了小R。小R有些紧张地接过电脑,发现屏幕上是一道算法题。

题目  冒泡排序算法

请用Python语言实现冒泡排序算法,把较大的数字放在后面。注意:默认所有的偶数都比奇数大。

>>> numbers = [23, 32, 1, 3, 4, 19, 20, 2, 4]
>>> magic_bubble_sort(numbers)
[1, 3, 19, 23, 2, 4, 4, 20, 32]

“冒泡排序,这不是所有排序算法里最简单的一种吗?虽然加了一点儿变化,但看起来没有什么难度啊。”小 R 一边在心里这么想着,一边打开编辑器开始写代码。

五分钟后,他把笔记本递给面试官,说道:“写完了!”

代码清单1-1就是他写的代码。

代码清单1-1   小R写的冒泡排序函数

def magic_bubble_sort(numbers):j = len(numbers) - 1while j > 0:for i in range(j):if numbers[i] % 2 == 0 and numbers[i + 1] % 2 == 1:numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]continueelif (numbers[i + 1] % 2 == numbers[i] % 2) and numbers[i] > numbers[i + 1]:numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]continuej -= 1return numbers

这段代码没有任何多余的逻辑,可以通过所有的测试用例。面试官看着小R演示完函数功能后,盯着代码似乎想说点儿什么,但最后只是微微点了点头,说:“好,今天的面试就到这儿吧。有后续面试我再通知你。”

小R高高兴兴地回到家,一心觉得这次面试稳了,可没想到,他后来却再也没接到任何后续面试通知。

1

问题出在哪里?

究竟是哪里出了问题呢?小R思来想去,觉得自己答问题时表现挺好,最有可能出问题的是最后一道编程题,肯定漏掉了什么边界情况没处理。

于是他找到一位有着十年编程经验的前辈小Q,凭着记忆把题目和自己的答案还原给对方看。

“题目大概就是这样,这是我当时写的代码。Q哥,你帮忙看看,我是不是有什么情况没考虑到?”小R问道。

小Q盯着他写的代码,足足两分钟没说一句话。然后突然开口道:“小R啊,你这个函数功能实现得没毛病,就是实在太难看懂了。"

“总共就10行代码。难看懂?怎么会呢?”小R在心里犯起了嘀咕。这时,前辈小Q说道:“这样,你把笔记本给我,我来给你稍微改改这段代码,然后你再看看。”

于是,三分钟后,小Q把把修改过的代码递了过来,如代码清单1-2所示。

代码清单1-2  小Q修改后的冒泡排序函数

def magic_bubble_sort(numbers: List[int]):"""有魔力的冒泡排序算法,默认所有的偶数都比奇数大:param numbers: 需要排序的列表,函数将会直接修改原始列表"""stop_position = len(numbers) - 1while stop_position > 0:for i in range(stop_position):current, next_ = numbers[i], numbers[i + 1] current_is_even, next_is_even = current % 2 == 0, next_ % 2 == 0should_swap = False# 交换位置的两个条件:# - 前面是偶数,后面是奇数# - 前面和后面同为奇数或者偶数,但是前面比后面大if current_is_even and not next_is_even:should_swap = Trueelif current_is_even == next_is_even and current > next_:should_swap = Trueif should_swap:numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]stop_position -= 1return numbers

①注意:此处变量名是next_而非next,这是因为已经有一个内置函数用了next这个名字。PEP8规定在这种情况下,应该给变量名增加 _ 后缀来避免冲突

小R盯着这段代码,发现它的核心逻辑和之前没有任何不同。但不知为何,这段代码看上去就是比自己写的代码更舒服。小R若有所思,好像一下明白了没通过面试的原因。

故事讲完了。看上去,前辈小Q只是在小R的代码之上做了些“无关痛痒”的改动,但正是这些“无关痛痒”的改动,改善了代码的观感,提升了整个函数的可读性。

2

“无关痛痒”的改动

和小R写的代码相比,前辈小Q的新代码主要进行了以下改进:

  1. 变量名变成了可读的、有意义的名字,比如在旧代码里,“停止位”是无意义的j,新代码里变成了stop_position。

  2. 增加了有意义的临时变量,比如current/next_ 代表前一个/后一个元素、{}_is_even代表元素是否为偶数、should_swap代表是否应该交换元素。

  3. 多了一点儿恰到好处的指引性注释,比如说明交换元素顺序的详细条件。

这些变化让整段代码变得更易读,也让整个算法变得更好理解。所以,哪怕是一段不到10行代码的简单函数,对变量和注释的不同处理方式,也会让代码发生质的变化。

本文摘自《Python工匠:案例、技巧与工程实践》

71688a333d4831f45cf1b1b9a1e49388.png

简介:本书基于广受好评的“Python工匠”系列开源文章。全书从工程实践角度出发,通过剖析核心知识、展示典型案例与总结实用技巧,帮助大家系统进阶Python,写好工程代码,做好实践项目。

这篇关于面试Python开发的这道题超简单,我却搞砸了!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939672

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3