在這個(gè)項(xiàng)目中,作者 kenwoodjw 準(zhǔn)備了近 300 道 Python 面試題,同時(shí)還包含解決方案與代碼。作者主要從 Python 基礎(chǔ)、高級語句、網(wǎng)頁應(yīng)用、數(shù)據(jù)庫和測試等角度提問,讀者可只關(guān)注自己需要的領(lǐng)域。目前該項(xiàng)目已經(jīng)完成了很多基礎(chǔ)和高級面試題,本文主要摘取一些 Python 面試題供大家參考。 項(xiàng)目地址:https://github.com/kenwoodjw/python_interview_question 總體而言,項(xiàng)目有近300道面試題。雖然該項(xiàng)目剛開始創(chuàng)建,但很多Python面試題都已經(jīng)提供了解決方案。如下所示為面試題示例: 本文截取了一些面試題及解決方案:
Python 基礎(chǔ) 什么是 Python?根據(jù)Python 創(chuàng)建者 Guido van Rossum 所言,Python是一種高級編程語言,其設(shè)計(jì)的核心理念是代碼的易讀性,以及允許編程者通過若干行代碼輕松表達(dá)想法創(chuàng)意。實(shí)際上,很多開發(fā)者選擇學(xué)習(xí) Python 的首要原因是其編程的優(yōu)美性,用它編碼和表達(dá)想法非常自然。 文件操作 1.若有一個(gè)jsonline格式的文件file.txt,大小約為10K,我們的處理方式為: def get_lines():現(xiàn)在要處理一個(gè)大小為10G的file.txt文件,但是內(nèi)存只有4G。如果在只修改get_lines 函數(shù)而其他代碼保持不變的情況下,應(yīng)該如何實(shí)現(xiàn)?需要考慮的問題都有那些? 要考慮的問題有:內(nèi)存只有4G,無法一次性讀入10G文件。而分批讀入數(shù)據(jù)要記錄每次讀入數(shù)據(jù)的位置,且分批每次讀取得太小會在讀取操作上花費(fèi)過多時(shí)間。 模塊與包 2.如何輸入日期, 判斷這一天是這一年的第幾天? import datetime數(shù)據(jù)類型 3.如何反轉(zhuǎn)字符串'aStr'? 4.下面代碼的輸出結(jié)果將是什么?會報(bào)錯(cuò)嗎? list = ['a','b','c','d','e']代碼將輸出[],并不會產(chǎn)生IndexError 錯(cuò)誤。如果嘗試用超出成員的個(gè)數(shù)的index來獲取某個(gè)列表的成員,那就會報(bào)錯(cuò)。例如,嘗試獲取 list[10] 和之后的成員,會導(dǎo)致IndexError。然而當(dāng)我們嘗試獲取列表的切片時(shí),開始的index超過成員個(gè)數(shù)并不會產(chǎn)生IndexError,而是僅僅返回一個(gè)空列表。因?yàn)椴⒉粫?bào)錯(cuò),所以這種Bug很難追蹤到。 5.請寫出一段Python代碼,實(shí)現(xiàn)刪除list里面的重復(fù)元素? 用list類的sort方法可以保證順序不變: l1 = ['b', 'c', 'd', 'c', 'a', 'a']也可以這樣寫: 也可以用遍歷: l1 = ['b', 'c', 'd', 'c', 'a', 'a']企業(yè)面試題 6.設(shè)計(jì)實(shí)現(xiàn)遍歷目錄與子目錄,抓取.pyc文件 第一種方法: 第二種方法: import os7.如何反轉(zhuǎn)一個(gè)整數(shù),例如-123--> -321? Python高級 Python高級包含很多重要的模塊,例如函數(shù)、類和實(shí)例、系統(tǒng)編程、正則表達(dá)式、網(wǎng)絡(luò)編程等等。根據(jù)這些高級屬性,Python可用于數(shù)據(jù)科學(xué)、網(wǎng)頁開發(fā)、機(jī)器學(xué)習(xí)等等。 設(shè)計(jì)模式 8.對設(shè)計(jì)模式的理解,簡述你了解的設(shè)計(jì)模式? 設(shè)計(jì)模式是為我們經(jīng)常會碰到的一些編程問題構(gòu)建的可重用解決方案,它是總結(jié)性和經(jīng)優(yōu)化的。一個(gè)設(shè)計(jì)模式并不像一個(gè)類或一個(gè)庫那樣能夠直接作用于我們的代碼,反之,設(shè)計(jì)模式更為高級,它是一種在特定情形下實(shí)現(xiàn)的方法模板。常見的是工廠模式和單例模式。 單例模式應(yīng)用的場景一般發(fā)現(xiàn)在以下條件下: 資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等,如日志文件,應(yīng)用配置。控制資源的情況下,方便資源之間的互相通信。 9.生成器和迭代器的區(qū)別? 迭代器是一個(gè)更抽象的概念,任何對象,如果它的類有 next 方法和 iter 方法返回自己本身,它就是可迭代的。對于 string、list、dict、tuple 等這類容器對象,使用for循環(huán)遍歷是很方便的,for 語句實(shí)際上會對容器對象調(diào)用 iter() 函數(shù)。iter() 會返回一個(gè)定義了 next() 方法的迭代器對象,它在容器中逐個(gè)訪問容器內(nèi)元素,在沒有后續(xù)元素時(shí),next()會拋出一個(gè)StopIteration異常。 生成器(Generator)是創(chuàng)建迭代器的簡單而強(qiáng)大的工具。它們寫起來就像是正規(guī)的函數(shù),只是在需要返回?cái)?shù)據(jù)的時(shí)候使用yield語句。生成器能做到迭代器能做的所有事,而且因?yàn)樽詣觿?chuàng)建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達(dá)式取代列表解析可以同時(shí)節(jié)省內(nèi)存。除了創(chuàng)建和保存程序狀態(tài)的自動方法,當(dāng)發(fā)生器終結(jié)時(shí),還會自動拋出StopIteration異常。 10.對裝飾器的理解,你能寫出一個(gè)計(jì)時(shí)器裝飾器,它能記錄函數(shù)的執(zhí)行時(shí)間嗎? 裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對象。 import time系統(tǒng)編程 11.介紹一下你了解的進(jìn)程。 程序運(yùn)行在操作系統(tǒng)上的一個(gè)實(shí)例,就稱之為進(jìn)程。進(jìn)程需要相應(yīng)的系統(tǒng)資源:內(nèi)存、時(shí)間片、pid。創(chuàng)建進(jìn)程: 首先要導(dǎo)入multiprocessing中的Process;創(chuàng)建一個(gè)Process對象;創(chuàng)建Process對象時(shí),可以傳遞參數(shù)。 使用start()啟動進(jìn)程 結(jié)束進(jìn)程 給子進(jìn)程指定函數(shù)傳遞參數(shù)Demo import os12.談?wù)勀銓Χ噙M(jìn)程、多線程、以及協(xié)程的理解,項(xiàng)目是否用? 進(jìn)程:一個(gè)運(yùn)行的程序(代碼)就是一個(gè)進(jìn)程,沒有運(yùn)行的代碼叫程序,進(jìn)程是系統(tǒng)資源分配的最小單位,進(jìn)程擁有自己獨(dú)立的內(nèi)存空間,所有進(jìn)程間數(shù)據(jù)不共享,開銷大。線程: cpu調(diào)度執(zhí)行的最小單位,也叫執(zhí)行路徑,不能獨(dú)立存在,依賴進(jìn)程存在,一個(gè)進(jìn)程至少有一個(gè)線程,叫主線程,而多個(gè)線程共享內(nèi)存可以極大地提高了程序的運(yùn)行效率。協(xié)程: 是一種用戶態(tài)的輕量級線程,協(xié)程的調(diào)度完全由用戶控制,協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度時(shí),將寄存器上下文和棧保存到其他地方,在切回來的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧,直接操中棧則基本沒有內(nèi)核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。 |
|
|