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實踐問題。 為下一次面試做好準備。 日誌分析器。 第三部分