2018最新python基礎面試題

1.異常:又語法異常,邏輯異常(又分爲可預知異常if…else 處理,不可預知異常try…except處理)
2.異步IO/同步IO:
(1)同步:
所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。
例如:普通B/S模式(同步):提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事

(2)異步:
異步的概念和同步相對。當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。
例如: ajax請求(異步): 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

同步IO和異步IO的區別就在於:數據拷貝的時候進程是否阻塞
摘自簡述同步IO和異步IO的區別
3.棧和隊列的區別:
棧的插入和刪除操作都是在一端進行的,而隊列的操作卻是在兩端進行的。
棧是先進後出,隊列是先進先出。
棧只允許在表尾一端進行插入和刪除,隊列只允許在表尾一端進行插入,在表頭一端進行刪除。
4.網頁緩慢的原因,處理方法(網站優化的關鍵技術:頁面靜態化和緩存)
原因:請求來回訪問數據庫,請求數據庫頻繁,加載緩慢。
處理方法:頁面靜態化,使用緩存,sql的優化
5.SQL注入:所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。 [1] 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.
6.DNS是什麼:
DNS 是域名系統 (Domain Name System) 的縮寫,簡單的理解一下,我們要訪問百度,然後在瀏覽器中輸入百度的地址就可以訪問百度的網站了。
(百度百科:DNS(Domain Name System,域名系統),萬維網上作爲域名和IP地址相互映射的一個分佈式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議運行在UDP協議之上,使用端口號53。在RFC文檔中RFC 2181對DNS有規範說明,RFC 2136對DNS的動態更新進行說明,RFC 2308對DNS查詢的反向緩存進行說明。)
7.數據分析:數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。這一過程也是質量管理體系的支持過程。在實用中,數據分析可幫助人們作出判斷,以便採取適當行動。
8.get,post區別:
(1)GET請求,請求的數據會附加在URL之後,以?分割URL和傳輸數據,多個參數用& 連接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之後再傳輸。
POST 請求:POST 請求會把請求的數據放置在 HTTP 請求包的包體中。上面的 item=bandsaw就是實際的傳輸數據。
因此,GET請求的數據會暴露在地址欄中,而POST請求則不會。
(2)傳輸數據的大小
在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。
對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。
(3)安全性
POST的安全性比GET的高。這裏的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露再URL上,因爲登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到了。除此之外,
GET請求提交的數據還可能會造成Cross-site request frogery攻擊。
9.Ajax:ajax(異步的javascript 和xml) 能夠刷新局部網頁數據而不是重新加載整個網頁。
10.序列化:我們把變量從內存中變成可存儲或傳輸的過程稱之爲序列化;(轉化爲json,對象,列表,字典等等)python-序列化
11.垃圾收機制:
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用問題,通過“分代回收”(generation collection)以空間換時間的方法提高垃圾回收效率。
(1) 引用計數
PyObject是每個對象必有的內容,其中ob_refcnt就是做爲引用計數。當一個對象有新的引用時,它的ob_refcnt就會增加,當引用它的對象被刪除,它的ob_refcnt就會減少.引用計數爲0時,該對象生命就結束了。
優點:簡單,實時性
缺點:維護引用計數消耗資源,循環引用
(2)標記-清除機制
基本思路是先按需分配,等到沒有空閒內存的時候從寄存器和程序棧上的引用出發,遍歷以對象爲節點、以引用爲邊構成的圖,把所有可以訪問到的對象打上標記,然後清掃一遍內存空間,把所有沒標記的對象釋放。
(3)分代技術
分代回收的整體思想是:將系統中的所有內存塊根據其存活時間劃分爲不同的集合,每個集合就成爲一個“代”,垃圾收集頻率隨着“代”的存活時間的增大而減小,存活時間通常利用經過幾次垃圾回收來度量。
Python默認定義了三代對象集合,索引數越大,對象存活時間越長。
舉例:
當某些內存塊M經過了3次垃圾收集的清洗之後還存活時,我們就將內存塊M劃到一個集合A中去,而新分配的內存都劃分到集合B中去。當垃圾收集開始工作時,大多數情況都只對集合B進行垃圾回收,而對集合A進行垃圾回收要隔相當長一段時間後才進行,這就使得垃圾收集機制需要處理的內存少了,效率自然就提高了。在這個過程中,集合B中的某些內存塊由於存活時間長而會被轉移到集合A中,當然,集合A中實際上也存在一些垃圾,這些垃圾的回收會因爲這種分代的機制而被延遲。
12.如何理解面向對象:
在我理解,面向對象是向現實世界模型的自然延伸,這是一種“萬物皆對象”的編程思想。在現實生活中的任何物體都可以歸爲一類事物(舉例子,貓狗歸爲動物等等),而每一個個體都是一類事物的實例。面向對象的編程是以對象爲中心,以消息爲驅動,所以程序=對象+消息。

也可以這樣理解面向對象:
面向對象是一種設計思想,符合人們的思考習慣,把執行者變成指揮者,簡化功能,把複雜的事情簡單化

想完成一個事,找具有這樣功能的對象
如果能找到,調用這個對象的功能,完成這個事
如果找不到,創建具有這樣功能的對象,再調用完成這個事

面向對象有三大特徵:封裝,繼承,多態

13.神魔是Python:
Python是一種解釋性語言。Python代碼在運行之前不需要編譯。其它解釋性語言還包括PHP和Ruby。
Python是動態類型語言,指的是在聲明變量時,不需要說明變量的類型。
Python非常適合面向對象的編程(OOP),因爲它支持通過組合(composition)與繼承(inheritance)的方式定義類(class)。
Python中沒有訪問說明符(類似C++中的public和private),這麼設計的依據是“大家都是成年人了”。
14.迭代器,生成器,裝飾器:
在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。生成器是迭代器,是一種只能迭代一次的迭代器。生成器不會將所有值存儲在內存中,它們會動態生成值。裝飾器,功能就是在運行原來功能基礎上,加上一些其它功能,比如權限的驗證,比如日誌的記錄等等。不修改原來的代碼,進行功能的擴展。比如java中的動態代理,python的註解裝飾器,其實python的裝飾器,是修改了代碼。

拓展:
迭代器創建方式:iter()函數----通過 iter() 函數獲得一個 Iterator 對象;
生成器創建方式:(1)只要把一個列表生成式的 [ ] 改成 ( );(2)保存的自定義的算法 yield;
生成器的第一種方式, 保存的是算法,可以通過循環,每次獲取下一個值;
生成器的第二種方式, 保存的自定義的算法,在函數中,如果有yield關鍵字,第一次函數之 後,返回的就是生成器對象,以後通過for,next獲取候,代碼到yield會生成器的下一個值的時阻塞,將yield後的值返回;

可迭代的類型:列表,字典,字符串,range。
比如你的計算機內存是10G,現在有一個列表6個G的數據,還有一個列表5個G的數據,還有一個100個G的數據,可以將他們變成迭代器,減少佔用的內存。
凡是可作用於 for 循環的對象都是 Iterable 類型;
凡是可作用於 next() 函數的對象都是 Iterator 類型
集合數據類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函數獲得一個 Iterator 對象。
目的是在使用集合的時候,減少佔用的內存
裝飾器的最終寫法

def outer(func):
    # 寫一些邏輯代碼
    def inner(*args,**kwargs):
        # 寫一些邏輯代碼
        ret = func(*args, **kwargs)
        # 寫一些邏輯代碼
        return ret
    return inner

15.算法排序,不在數據庫裏面咋排序
16.數據結構
17.多進程和多線程區別:
進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。

(1),簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
(2) 線程的劃分尺度小於進程,使得多線程程序的併發性高。
(3)另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
(4)線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
(5)從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
18.ORM,全稱(Object-Relationship-Mapping),對象關係映射百度百科
19.文件讀寫文件讀寫
20.session和cookies:
cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
session會在一定時間內保存在服務器上。當訪問增多,會比較佔用服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個 cookie。
建議:
將登陸信息等重要信息存放爲SESSION
其他信息如果需要保留,可以放在COOKIE中
21.csrf是什麼,xss是什麼:介紹
22.悲觀鎖樂觀鎖
悲觀鎖:假定會發生併發衝突,屏蔽一切可能違反數據完整性的操作
樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反數據完整性。
23.sql的優化
對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引;應儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描;應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描;應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描;.in 和 not in 也要慎用,否則會導致全表掃描;
24.左連接,右連接,全連接的關係
左連接, 左邊的表不加限制,返回包括左表中的所有記錄和右表中聯結字段相等的記錄右連接),右邊的表不加限制,返回包括右表中的所有記錄和左表中聯結字段相等的記錄全連接,左右兩邊的表都不加限制,只返回兩個表中聯結字段相等的行
介紹
25.reset和checkout的區別
git reset – files 用來撤銷最後一次git add files,你也可以用git reset 撤銷所有暫存區域文件。
git checkout – files 把文件從暫存區域複製到工作目錄,用來丟棄本地修改。
鏈接
26.爲什麼用mvt:
解耦降低各功能模塊之間的耦合性,方便變更,更容易重構代碼,最大程度上實現代碼的重用
鏈接
27.http和HTTPS之間的關係
https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
28.深淺拷貝的理解鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章