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

史上最全 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)

    分享創造快樂