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