介紹
這是軟體工程師訪談系列的第三篇文章。我帶來了幾年前做過的挑戰,並且實際上得到了這個職位 - 涉及其他技術面試,例如過去的經驗篩選。
如果您錯過了本系列之前的帖子,可以在這裡找到它們。
挑戰
這個挑戰也是一項帶回家的編碼任務,我必須開發一個 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 方法建構 url 編碼的參數
- 建立將用於查詢資料的完整 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中文網其他相關文章!

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

Python和C 在内存管理和控制方面的差异显著。1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。

選擇Python還是C 取決於項目需求:1)Python適合快速開發、數據科學和腳本編寫,因其簡潔語法和豐富庫;2)C 適用於需要高性能和底層控制的場景,如係統編程和遊戲開發,因其編譯型和手動內存管理。

Python在數據科學和機器學習中的應用廣泛,主要依賴於其簡潔性和強大的庫生態系統。 1)Pandas用於數據處理和分析,2)Numpy提供高效的數值計算,3)Scikit-learn用於機器學習模型構建和優化,這些庫讓Python成為數據科學和機器學習的理想工具。

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具