首頁 後端開發 Python教學 軟體工程師訪談 - #EIS CLI

軟體工程師訪談 - #EIS CLI

Nov 29, 2024 am 04:55 AM

Software Engineer Interviews - #EIS CLI

介紹

這是軟體工程師訪談系列的第三篇文章。我帶來了幾年前做過的挑戰,並且實際上得到了這個職位 - 涉及其他技術面試,例如過去的經驗篩選。

如果您錯過了本系列之前的帖子,可以在這裡找到它們。

挑戰

這個挑戰也是一項帶回家的編碼任務,我必須開發一個 CLI 程式來查詢 OEIS(整數序列線上百科全書)並返回結果總數以及第一個結果的名稱查詢返回五個序列。

值得慶幸的是,OEIS 查詢系統包含 JSON 輸出格式,因此您可以透過呼叫 url 並將序列作為查詢字串傳遞來取得結果。

輸入與輸出範例:

oeis 1 1 2 3 5 7
登入後複製
登入後複製
登入後複製
Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
登入後複製
登入後複製
登入後複製

注意:此結果已過時!

解決挑戰

解決這項挑戰的計畫如下:

  • 從將作為 CLI 入口點的 Python 檔案開始
    • 它應該接收一個由空格分隔的數字列表作為參數
  • 建立一個客戶端文件,負責從 OEIS 查詢系統取得資料
  • 一個格式化程序,負責傳回為控制台格式化的輸出

由於這是一個編碼挑戰,我將使用 Poetry 來幫助我創建專案的結構,並方便任何人運行它。您可以在他們的網站上查看如何安裝和使用 Poetry。

我將首先使用以下內容建立套件:

poetry new oeis
登入後複製
登入後複製
登入後複製

這將建立一個名為 oeis 的資料夾,其中包含 Poetry 的設定檔、一個測試資料夾和一個也稱為 oeis 的資料夾,該資料夾將成為我們專案的根目錄。

我還將添加一個名為 Click 的可選包,它有助於建立 CLI 工具。這不是必需的,可以用 Python 中的其他本機工具替換,儘管不太優雅。

在專案資料夾中,執行:

poetry add click
登入後複製
登入後複製
登入後複製

這會將 click 加入為我們專案的依賴項。

現在我們可以移動到入口點檔案。如果你打開資料夾 oeis/oeis,你會看到已經有一個 __init__.py 檔案。讓我們更新它以導入 Click,以及使用以下命令調用的主函數:

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
登入後複製
登入後複製
登入後複製

這是我們 CLI 的起點。看到@click.command了嗎?這是來自 click 的包裝器,它將幫助我們將 oeis 定義為命令。

現在,還記得我們需要接收以空格分隔的數字序列嗎?我們需要將其新增為參數。 Click 有一個選項:

oeis 1 1 2 3 5 7
登入後複製
登入後複製
登入後複製

這將新增一個名為序列的參數,並且 nargs=-1 選項告訴點擊它將用空格分隔。我添加了一個列印,以便我們可以測試參數是否正確傳遞。

為了告訴 Poetry 我們有一個命令,我們需要打開 pyproject.toml 並添加以下行:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
登入後複製
登入後複製
登入後複製

這是新增一個名為 oeis 的腳本,該腳本呼叫 oeis 模組上的 oeis 函數。現在,我們運行:

poetry new oeis
登入後複製
登入後複製
登入後複製

這將讓我們呼叫腳本。讓我們來試試:

poetry add click
登入後複製
登入後複製
登入後複製

完美,我們已經按照我們的預期解析了命令和參數!讓我們繼續討論客戶端。在oeis/oeis資料夾下,建立一個名為clients的資料夾、一個名為__init__.py的檔案和一個名為oeis_client.py的檔案。

如果我們期望在這個專案中擁有其他客戶端,我們可以開發一個基本客戶端類,但由於我們只有這一個,所以這可能被認為是過度設計。在 OEIS 用戶端類別中,我們應該有一個基本 URL,這是沒有路徑的 URL,我們將使用它來查詢它:

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
登入後複製
登入後複製
登入後複製

如您所見,我們正在匯入 requests 套件。我們需要將它加入 Poetry 才能使用它:

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()
登入後複製
登入後複製

現在,客戶端有一個不會改變的基本 URL。讓我們深入研究其他方法:

  • 建置網址參數
    • 接收從 CLI 作為參數傳遞的序列,並將其轉換為以逗號分隔的數字字串
    • 使用參數建立字典,q 是我們將執行的查詢,fmt 是預期的輸出格式
    • 最後,我們傳回參數的 URL 編碼版本,這是確保我們的字串與 URL 相容的好方法
  • 查詢結果
    • 接收從 CLI 作為參數傳遞的序列,透過 build_url_params 方法建構 ur​​l 編碼的參數
    • 建立將用於查詢資料的完整 URL
    • 繼續向建置的 URL 發出請求,並引發我們未預料到的任何 HTTP 狀態
    • 傳回 JSON 資料

我們還需要更新我們的主文件,以呼叫此方法:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
登入後複製
登入後複製

這裡我們現在在方法外部建立一個客戶端實例,因此它不會在每次呼叫命令時都建立一個實例,而是在命令內部呼叫它。

執行此命令會​​產生非常非常長的回應,因為 OEIS 有數千個條目。由於我們只需要知道總大小和前五個條目,因此我們可以執行以下操作:

poetry install
登入後複製

運行這個已經比以前好多了。我們現在列印總大小以及前五個(如果存在)條目。

但我們也不需要所有這些。讓我們建立一個格式化程式來正確格式化我們的輸出。建立一個名為 formatters 的資料夾,其中包含 __init__.py 檔案和 oeis_formatter.py 檔案。

oeis 1 1 2 3 5 7
登入後複製
登入後複製
登入後複製

該文件基本上將前五個結果格式化為我們想要的輸出。讓我們在主文件中使用它:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
登入後複製
登入後複製
登入後複製

如果您執行此程式碼,您現在將得到:

poetry new oeis
登入後複製
登入後複製
登入後複製

它現在以我們期望的格式返回,但請注意它說找到了 10 個結果。這是錯誤的,如果您在 OEIS 網站上搜索,您會看到更多結果。不幸的是,OEIS API 進行了更新,結果不再傳回包含結果數量的計數。不過,該計數仍然顯示在文字格式的輸出中。我們可以用它來知道有多少個結果。

為此,我們可以更改 URL 以使用 fmt=text 和正規表示式來尋找我們想要的值。讓我們更新客戶端程式碼以獲取文字數據,並更新格式化程式以使用此數據,以便我們可以輸出它。

poetry add click
登入後複製
登入後複製
登入後複製

如您所見,我們新增了兩種新方法:

  • 取得計數
    • 將為文字 API 建立參數,並將其傳遞給使用正規表示式來尋找我們正在搜尋的數字的方法
  • 取得回應計數
    • 將使用類別 init 中內建的正規表示式來執行搜尋並取得第一組
# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
登入後複製
登入後複製
登入後複製

在這個檔案中,我們只為方法增加了一個新的參數,並用它取代了查詢結果的長度。

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()
登入後複製
登入後複製

這裡我們只是在客戶端呼叫新方法,並將資訊傳遞給格式化程式。再次運行它會產生我們期望的輸出:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
登入後複製
登入後複製

程式碼已經基本準備好了。但對於真正的挑戰,請記住盡可能使用 Git,進行小型提交,當然,添加單元測試、程式碼格式化庫、類型檢查器以及您認為需要的任何其他內容。

祝你好運!

以上是軟體工程師訪談 - #EIS CLI的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1225
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

您可以在2小時內學到多少python? 您可以在2小時內學到多少python? Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python:探索其主要應用程序 Python:探索其主要應用程序 Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

See all articles