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个数字。 您继续运行总和,然后在完成循环后将其返回。

此解决方案有效,但是有两个问题:

  1. 它并不能代表您对Python的了解以及该语言如何简化此类任务。
  2. 它不符合问题描述中的错误条件。 传递字符串会导致该函数在应返回时引发异常。

您将在下面的最终答案中处理错误情况,但首先,让我们将主要解决方案优化为更多的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)

您可以看到该函数使用了字符串模块中的三件事:

  1. .ascii_lowercase
  2. .maketrans()
  3. .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()方法,那么您已经准备就绪。

但是,还有其他几种情况需要考虑:

  1. 您可以完全绘制空白。 在这种情况下,您可能会以与下一个相同的方式解决此问题,这是可以接受的答案。
  2. 您可能还记得标准库具有执行所需功能的功能,但不记得详细信息。

如果您做的是正常工作,并且遇到任何一种情况,那么您只需做一点研究就可以了。 但是在面试的情况下,这将帮助您的案件大声疾呼这个问题。

向面试官寻求具体帮助远比仅仅忽略它更好。 尝试类似的操作,“我认为有一个函数可以将一组字符映射到另一组字符。 您能帮我记住它的名字吗?”

在面试的情况下,通常最好承认自己不知道什么,而不是试图虚张声势。

延续:

  • Python实践问题。 为下一次面试做好准备。 凯撒的密码。 第2部分
  • Python实践问题。 为下一次面试做好准备。 日志分析器。 第三部分
Sidebar