歡迎光臨
每天分享高質量文章

史上最全 python常見面試題(一)

大資料的檔案讀取

  ① 利用生成器generator

  ②迭代器進行迭代遍歷:for line in file


迭代器和生成器的區別

1)迭代器是一個更抽象的概念,任何物件,如果它的類有next方法和iter方法傳回自己本身。對於string、list、dict、tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後臺for陳述句對容器物件呼叫iter()函式,iter()是python的內建函式。iter()會傳回一個定義了next()方法的迭代器物件,它在容器中逐個訪問容器內元素,next()也是python的內建函式。在沒有後續元素時,next()會丟擲一個StopIteration異常


2)生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函式,只是在需要傳回資料的時候使用yield陳述句。每次next()被呼叫時,生成器會傳回它脫離的位置(它記憶陳述句最後一次執行的位置和所有的資料值)

區別:生成器能做到迭代器能做的所有事,而且因為自動建立了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器運算式取代串列解析可以同時節省記憶體。除了建立和儲存程式狀態的自動方法,當發生器終結時,還會自動丟擲StopIteration異常


裝飾器的作用和功能

引入日誌

函式執行時間統計

執行函式前預備處理

執行函式後的清理功能

許可權校驗等場景

快取


Global Interpreter Lock(全域性直譯器鎖)

Python程式碼的執行由Python 虛擬機器(也叫直譯器主迴圈,CPython版本)來控制,Python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有一個執行緒在執行,即在任意時刻,只有一個執行緒在直譯器中執行。對Python 虛擬機器的訪問由全域性直譯器鎖(GIL)來控制,正是這個鎖能保證同一時刻只有一個執行緒在執行。



在多執行緒環境中,Python 虛擬機器按以下方式執行:

1. 設定GIL
2. 切換到一個執行緒去執行
3. 執行:
    a. 指定數量的位元組碼指令,或者

    b. 執行緒主動讓出控制(可以呼叫time.sleep(0))
4. 把執行緒設定為睡眠狀態
5. 解鎖GIL
6. 再次重覆以上所有步驟


在呼叫外部程式碼(如C/C++擴充套件函式)的時候,GIL 將會被鎖定,直到這個函式結束為止(由於在這期間沒有Python 的位元組碼被執行,所以不會做執行緒切換)。


find和grep

grep命令是一種強大的文字搜尋工具,grep搜尋內容串可以是正則運算式,允許對文字檔案進行樣式查詢。如果找到匹配樣式,grep列印包含樣式的所有行。

find通常用來再特定的目錄下搜尋符合條件的檔案,也可以用來搜尋特定使用者屬主的檔案。



線上服務可能因為種種原因導致掛掉怎麼辦?

linux下的後臺行程管理利器 supervisor

每次檔案修改後再linux執行 service supervisord restart


如何提高python的執行效率

使用生成器;關鍵程式碼使用外部功能包(Cython,pylnlne,pypy,pyrex);針對迴圈的最佳化–儘量避免在迴圈中訪問變數的屬性


常用Linux命令

ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date


Python中的yield用法

yield簡單說來就是一個生成器,這樣函式它記住上次返 回時在函式體中的位置。對生成器第 二次(或n 次)呼叫跳轉至該函 次)呼叫跳轉至該函 數。



描述陣列、連結串列、佇列、堆疊的區別?

陣列與連結串列是資料儲存方式的概念,陣列在連續的空間中儲存資料,而連結串列可以在非連續的空間中儲存資料;

佇列和堆疊是描述資料存取方式的概念,佇列是先進先出,而堆疊是後進先出;佇列和堆疊可以用陣列來實現,也可以用連結串列實現。


你知道幾種排序,講一講你最熟悉的一種?


Python是如何進行記憶體管理的

一、垃圾回收:

python不像C++,Java等語言一樣,他們可以不用事先宣告變數型別而直接對變數進行賦值。對Python語言來講,物件的型別和記憶體都是在執行時確定的。這也是為什麼我們稱Python語言為動態型別的原因(這裡我們把動態型別可以簡單的歸結為對變數記憶體地址的分配是在執行時自動判斷變數型別並對變數進行賦值)。



二、取用計數:

Python採用了類似Windows核心物件一樣的方式來對記憶體進行管理。每一個物件,都維護這一個對指向該對物件的取用的計數。當變數被系結在一個物件上的時候,該變數的取用計數就是1,(還有另外一些情況也會導致變數取用計數的增加),系統會自動維護這些標簽,並定時掃描,當某標簽的取用計數變為0的時候,該對就會被回收。


三、記憶體池機制Python的記憶體機制以金字塔行,-1,-2層主要有作業系統進行操作,


      第0層是C中的malloc,free等記憶體分配和釋放函式進行操作;

      第1層和第2層是記憶體池,有Python的介面函式PyMem_Malloc函式實現,當物件小於256K時有該層直接分配記憶體;

      第3層是最上層,也就是我們對Python物件的直接操作;

在 C 中如果頻繁的呼叫 malloc 與 free 時,是會產生效能問題的.再加上頻繁的分配與釋放小塊的記憶體會產生記憶體碎片. Python 在這裡主要乾的工作有:

如果請求分配的記憶體在1~256位元組之間就使用自己的記憶體管理系統,否則直接使用 malloc.

這裡還是會呼叫 malloc 分配記憶體,但每次會分配一塊大小為256k的大塊記憶體.



經由記憶體池登記的記憶體到最後還是會回收到記憶體池,並不會呼叫 C 的 free 釋放掉.以便下次使用.對於簡單的Python物件,例如數值、字串,元組(tuple不允許被更改)採用的是複製的方式(深複製?),也就是說當將另一個變數B賦值給變數A時,雖然A和B的記憶體空間仍然相同,但當A的值發生變化時,會重新給A分配空間,A和B的地址變得不再相同


web框架部分 

1.django 中當一個使用者登入 A 應用伺服器(進入登入狀態),然後下次請求被 nginx 代理到 B 應用伺服器會出現什麼影響?

如果使用者在A應用伺服器登陸的session資料沒有共享到B應用伺服器,奈米之前的登入狀態就沒有了。


2.跨域請求問題django怎麼解決的(原理)

啟用中介軟體

post請求

驗證碼

表單中新增{%csrf_token%}標簽



3.請解釋或描述一下Django的架構

對於Django框架遵循MVC設計,並且有一個專有名詞:MVT

M全拼為Model,與MVC中的M功能相同,負責資料處理,內嵌了ORM框架

V全拼為View,與MVC中的C功能相同,接收HttpRequest,業務處理,傳回HttpResponse

T全拼為Template,與MVC中的V功能相同,負責封裝構造要傳回的html,內嵌了模板引擎


4.django對資料查詢結果排序怎麼做,降序怎麼做,查詢大於某個欄位怎麼做

排序使用order_by()

降序需要在排序欄位名前加-

查詢欄位大於某個值:使用filter(欄位名_gt=值)


5.說一下Django,MIDDLEWARES中介軟體的作用?

答:中介軟體是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。



你對Django的認識?

 Django是走大而全的方向,它最出名的是其全自動化的管理後臺:只需要使用起ORM,做簡單的物件定義,它就能自動生成資料庫結構、以及全功能的管理後臺。

Django內建的ORM跟框架內的其他模組耦合程度高。


應用程式必須使用Django內建的ORM,否則就不能享受到框架內提供的種種基於其ORM的便利;理論上可以切換掉其ORM模組,但這就相當於要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。

Django的賣點是超高的開發效率,其效能擴充套件有限;採用Django的專案,在流量達到一定規模後,都需要對其進行重構,才能滿足效能的要求。

Django適用的是中小型的網站,或者是作為大型網站快速實現產品雛形的工具。

Django模板的設計哲學是徹底的將程式碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理資料的可能。


Django重定向你是如何實現的?用的什麼狀態碼?

使用HttpResponseRedirect

redirect和reverse

狀態碼:302,301



ngnix的正向代理與反向代理?

正向代理 是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定標的(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容傳回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。


反向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容傳回給客戶端,就像這些內容原本就是它自己的一樣。



Tornado 的核是什麼?

Tornado 的核心是 ioloop 和 iostream 這兩個模組,前者提供了一個高效的 I/O 事件迴圈,後者則封裝了 一個無阻塞的 socket 。透過向 ioloop 中新增網路 I/O 事件,利用無阻塞的 socket ,再搭配相應的回呼 函式,便可達到夢寐以求的高效非同步執行。


Django 本身提供了 runserver,為什麼不能用來部署?

runserver 方法是除錯 Django 時經常用到的執行方式,它使用 Django 自帶的

WSGI Server 執行,主要在測試和開發中使用,並且 runserver 開啟的方式也是單行程 。



 uWSGI 是一個 Web 伺服器,它實現了 WSGI 協議、uwsgi、http 等協議。註意 uwsgi 是一種通訊協議,而 uWSGI 是實現 uwsgi 協議和 WSGI 協議的 Web 伺服器。uWSGI 具有超快的效能、低記憶體佔用和多 app 管理等優點,並且搭配著 Nginx

就是一個生產環境了,能夠將使用者訪問請求與應用 app 隔離開,實現真正的部署 。相比來講,支援的併發量更高,方便管理多行程,發揮多核的優勢,提升效能。

《Linux雲端計算及運維架構師高薪實戰班》2018年11月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

    – END –


    贊(0)

    分享創造快樂