Python»Python实践问题。 准备下一次面试
您是Python开发人员在面试之前磨练过自己的技能吗? 如果是这样,本文将引导您完成一系列旨在模拟常见编码测试场景的实用Python任务。 在开发了自己的解决方案之后,将指导您完成答案,以便您可以优化代码,打动面试官并获得理想的工作!
在本文中,您将学习如何:
- 编写面试式任务的代码
- 在面试中讨论您的决定
- 处理被忽略的细节
- 讨论设计决策和权衡
本文面向中级Python开发人员。
Python练习1:整数范围的和
让我们从热身开始。 在第一个练习任务中,您将编写代码以添加整数列表。 每个练习任务都包含对问题的描述。 该描述是直接从存储库中的框架文件中获取的,以使您在处理解决方案时更容易记住。
问题描述
这是您的第一个问题:
# integersums.py """ Sum of Integers Up To n Write a function, add_it_up(), that takes a single integer as input and returns the sum of the integers from zero to the input parameter. The function should return 0 if a non-integer is passed in. """
解
对于此问题,您将考虑几种不同的解决方案。 第一个不是那么好:
# integersums.py def first(n): num = 1 sum = 0 while num < n + 1: sum = sum + num num = num + 1 return sum
在此解决方案中,您手动创建一个while循环以执行1n个数字。 您继续运行总和,然后在完成循环后将其返回。
此解决方案有效,但是有两个问题:
- 它并不能代表您对Python的了解以及该语言如何简化此类任务。
- 它不符合问题描述中的错误条件。 传递字符串会导致该函数在应返回时引发异常。
您将在下面的最终答案中处理错误情况,但首先,让我们将主要解决方案优化为更多的Python风格。
while时首先要考虑的是循环。 Python具有用于遍历列表和范围的强大机制。 通常不需要创建自己的应用程序,这里肯定是这种情况。 您可以将while循环替换为重复range()的循环:
# integersums.py def better(n): sum = 0 for num in range(n + 1): sum += num return sum
您可以看到for … range()构造替换了while循环并缩短了代码。 要注意的一件事是range()增大了,但不包括给定的数字,因此您需要在此处使用n +1。
这是一个好举动! 它删除了一些样板范围循环代码,并使您的意图更加清晰。 但是您可以在这里做更多的事情。
总结整数列表是Python擅长的另一件事:
# integersums.py def even_better(n): return sum(range(n + 1))
哇! 使用内置的sum()模块,您可以将其简化为一行代码! 虽然代码高尔夫通常不会产生最易读的代码,但在这种情况下,您会获得双赢:更短,更易读的代码。
但是,仍然存在一个问题。 此代码仍然无法正确处理错误情况。 要解决此问题,您可以将以前的代码包装在try …除外中:
# integersums.py def add_it_up(n): try: result = sum(range(n + 1)) except TypeError: result = 0 return result
这样可以解决问题并正确处理错误情况。
有时,访调员会以固定的限制提出此问题,例如“打印前九个整数的和”。 “以这种方式解决问题后,将打印出一种正确的解决方案(45)。
但是,如果您提供此答案,则应该继续逐步解决问题的代码。 技巧的答案是开始答案的好地方,但不是结束的最佳地方。
如果要扩展此问题,请尝试添加其他下限add_it_up(),以提供更大的灵活性!
Python练习2:凯撒密码
下一个问题分为两个部分。 输入文本时,您将创建一个功能代码以计算凯撒密码。 对于此问题,可以使用Python标准库的任何部分进行转换。
提示:str类中有一个函数可使此任务更加容易!
问题描述
# caesar.py """ Caesar Cipher A Caesar cipher is a simple substitution cipher in which each letter of the plain text is substituted with a letter found by moving n places down the alphabet. For example, assume the input plain text is the following: abcd xyz If the shift value, n, is 4, then the encrypted text would be the following: efgh bcd You are to write a function that accepts two arguments, a plain-text message and a number of letters to shift in the cipher. The function will return an encrypted string with all letters transformed and all punctuation and whitespace remaining unchanged. Note: You can assume the plain text is all lowercase ASCII except for whitespace and punctuation. """
请记住,问题的这一部分实际上是关于如何使用标准库的。 如果您了解如何在没有库的情况下进行转换,请保持这种想法! 稍后您将需要它!
解
这是上述凯撒密码问题的解决方案。
此解决方案使用标准库中的.translate()类。 如果您一直在努力解决此问题,那么您可能需要暂停一下,考虑如何在解决方案中使用.translate()。
好的,现在您已经准备好,让我们来看一下这个解决方案:
1 # caesar.py 2 import string 3 4 def caesar(plain_text, shift_num=1): 5 letters = string.ascii_lowercase 6 mask = letters[shift_num:] + letters[:shift_num] 7 trantab = str.maketrans(letters, mask) 8 return plain_text.translate(trantab)
您可以看到该函数使用了字符串模块中的三件事:
- .ascii_lowercase
- .maketrans()
- .translate()
在前两行中,您将创建一个包含所有小写字母的变量(仅适用于该程序的ASCII),然后创建一个掩码,即一组相同的字母,只是移位了。 切片语法并不总是很明显,因此让我们在现实世界中看一下:
>>>
>>> import string >>> x = string.ascii_lowercase >>> x 'abcdefghijklmnopqrstuvwxyz' >>> x[3:] 'defghijklmnopqrstuvwxyz' >>> x[:3] 'abc'
你可以看到x[3:] 这些都是第三个字母“ c”之后的所有字母,而x[:3] 因为它只是前三个字母。
解决方案中的第6行,字母[shift_num:] +字母[:shift_num],创建一个由shift_num移位的字母列表,末尾的字母环绕在前面。 一旦有了要匹配的字母和掩码列表,就可以调用.maketrans()创建转换表。
然后,将转换表传递给字符串方法.translate()。 它将所有字符与具有相应掩码字符的字母匹配,而将所有其他字符保留下来。
这个问题是了解和使用标准库的练习。 在面试中的某个时候,您可能会被问到这个问题。 如果您遇到这种情况,最好花点时间考虑可能的答案。 如果您在这种情况下还记得.translate()方法,那么您已经准备就绪。
但是,还有其他几种情况需要考虑:
- 您可以完全绘制空白。 在这种情况下,您可能会以与下一个相同的方式解决此问题,这是可以接受的答案。
- 您可能还记得标准库具有执行所需功能的功能,但不记得详细信息。
如果您做的是正常工作,并且遇到任何一种情况,那么您只需做一点研究就可以了。 但是在面试的情况下,这将帮助您的案件大声疾呼这个问题。
向面试官寻求具体帮助远比仅仅忽略它更好。 尝试类似的操作,“我认为有一个函数可以将一组字符映射到另一组字符。 您能帮我记住它的名字吗?”
在面试的情况下,通常最好承认自己不知道什么,而不是试图虚张声势。
延续:
- Python实践问题。 为下一次面试做好准备。 凯撒的密码。 第2部分
- Python实践问题。 为下一次面试做好准备。 日志分析器。 第三部分