概念理解類題目:php
1.請說一下你對迭代器和生成器的區別?python
(1)迭代器是一個更抽象的概念,任何對象,若是它的類有next方法和iter方法返回本身自己。對於string、list、dict、tuple等這類容器對象,使用for循環遍歷是很方便的。在後臺for語句對容器對象調用iter()函數,iter()是python的內置函數。iter()會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內元素,next()也是python的內置函數。在沒有後續元素時,next()會拋出一個StopIteration異常。程序員
(2)生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在須要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最後一次執行的位置和全部的數據值)web
區別:生成器能作到迭代器能作的全部事,並且由於自動建立了iter()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析能夠同時節省內存。除了建立和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常。面試
2.什麼是線程安全?正則表達式
線程安全是在多線程的環境下,可以保證多個線程同時執行時程序依舊運行正確, 並且要保證對於共享的數據能夠由多個線程存取,可是同一時刻只能有一個線程進行存取。多線程環境下解決資源競爭問題的辦法是加鎖來保證存取操做的惟一性。redis
3.什麼是私有變量?數據庫
小寫和一個前導下劃線 _private_value緩存
Python 中不存在私有變量一說,如果遇到須要保護的變量,使用小寫和一個前導下劃線。但這只是程序員之間的一個約定,用於警告說明這是一個私有變量,外部類不要去訪問它。但實際上,外部類仍是能夠訪問到這個變量。安全
4.內置變量
小寫,兩個前導下劃線和兩個後置下劃線 class
兩個前導下劃線會致使變量在解釋期間被改名。這是爲了不內置變量和其餘變量產生衝突。用戶定義的變量要嚴格避免這種風格。以避免致使混亂。
5.函數和方法
整體而言應該使用,小寫和下劃線。但有些比較老的庫使用的是混合大小寫,即首單詞小寫,以後每一個單詞第一個字母大寫,其他小寫。但如今,小寫和下劃線已成爲規範。
私有方法:小寫和一個前導下劃線 更多的面試題還有筆記解析和配套視頻請加++++python交流裙:點擊進入,免費領取學習資料大全適合在校大學生,小白,想轉行,想經過這個找工做的加入。裙裏有大量學習資料,有大神解答交流問題
這裏和私有變量同樣,並非真正的私有訪問權限。同時也應該注意通常函數不要使用兩個前導下劃線(當遇到兩個前導下劃線時,Python 的名稱改編特性將發揮做用)。
特殊方法:小寫和兩個前導下劃線,兩個後置下劃線
這種風格只應用於特殊函數,好比操做符重載等。
函數參數 : 小寫和下劃線,缺省值等號兩邊無空格
6.類
類老是使用駝峯格式命名,即全部單詞首字母大寫其他字母小寫。類名應該簡明,精確,並足以從中理解類所完成的工做。常見的一個方法是使用表示其類型或者特性的後綴,例如:
SQLEngine,MimeTypes對於基類而言,可使用一個 Base 或者 Abstract 前綴BaseCookie,AbstractGroup
7.模塊和包
除特殊模塊 init 以外,模塊名稱都使用不帶下劃線的小寫字母。
如果它們實現一個協議,那麼一般使用lib爲後綴,例如:
1 2 3 |
|
8.Python是如何進行內存管理的?
(1)垃圾回收:python不像C++,Java等語言同樣,他們能夠不用事先聲明變量類型而直接對變量進行賦值。對Python語言來說,對象的類型和內存都是在運行時肯定的。這也是爲何咱們稱Python語言爲動態類型的緣由(這裏咱們把動態類型能夠簡單的歸結爲對變量內存地址的分配是在運行時自動判斷變量類型並對變量進行賦值)。
(2)引用計數:Python採用了相似Windows內核對象同樣的方式來對內存進行管理。每個對象,都維護這一個對指向該對對象的引用的計數。當變量被綁定在一個對象上的時候,該變量的引用計數就是1,(還有另一些狀況也會致使變量引用計數的增長),系統會自動維護這些標籤,並定時掃描,當某標籤的引用計數變爲0的時候,該對就會被回收。
(3)內存池機制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的地址變得再也不相同。
函數方法使用類題目
1.Python裏面如何生成隨機數?
答:random模塊
隨機整數:random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個範圍在(start,stop,step)之間的隨機整數,不包括結束值。
隨機實數:random.random( ):返回0到1之間的浮點數
random.uniform(a,b):返回指定範圍內的浮點數。
2.有沒有一個工具能夠幫助查找python的bug和進行靜態的代碼分析?
答:PyChecker是一個python代碼的靜態分析工具,它能夠幫助查找python代碼的bug,會對代碼的複雜度和格式提出警告
Pylint是另一個工具能夠進行codingstandard檢查
3.如何在一個function裏面設置一個全局的變量?
答:解決方法是在function的開始插入一個global聲明:
1 2 3 4 5 6 7 8 |
|
4.單引號,雙引號,三引號的區別
答:單引號和雙引號是等效的,若是要換行,須要符號(),三引號則能夠直接換行,而且能夠包含註釋
若是要表示Let’s go 這個字符串
1 2 3 4 5 6 7 8 9 10 |
|
這就是單引號和雙引號均可以表示字符串的緣由了
5.find和grep的區別?
grep命令是一種強大的文本搜索工具,grep搜索內容串能夠是正則表達式,容許對文本文件進行模式查找。若是找到匹配模式, grep打印包含模式的全部行。
find一般用來在特定的目錄下搜索符合條件的文件,也能夠用來搜索特定用戶屬主的文件。
6.使用 has 或 is 前綴命名布爾元素
1 2 |
|
7.用複數形式命名序列
1 |
|
8. 用顯式名稱命名字典
1 |
|
9.python 中 yield 的用法?
答: yield簡單說來就是一個生成器,這樣函數它記住上次返回時在函數體中的位置。對生成器第二次(或n次)調用跳轉至該函次)調用跳轉至該函數。
爬蟲和數據庫
1、你用過的爬蟲框架或者模塊有哪些?談談他們的區別或者優缺點?
Python自帶:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模塊都作與請求URL相關的操做,但他們提供不一樣的功能。
urllib2.:urllib2.urlopen能夠接受一個Request對象或者url,(在接受Request對象時候,並以此能夠來設置一個URL 的headers),urllib.urlopen只接收一個url。
urllib 有urlencode,urllib2沒有,所以老是urllib,urllib2常會一塊兒使用的緣由。
scrapy是封裝起來的框架,他包含了下載器,解析器,日誌及異常處理,基於多線程,twisted的方式處理,對於固定單個網站的爬取開發,有優點,可是對於多網站爬取 100個網站,併發及分佈式處理方面,不夠靈活,不便調整與括展。
request 是一個HTTP庫,它只是用來,進行請求,對於HTTP請求,他是一個強大的庫,下載,解析所有本身處理,靈活性更高,高併發與分佈式部署也很是靈活,對於功能能夠更好實現。
2、scrapy和scrapy-redis有什麼區別?爲何選擇redis數據庫?
scrapy是一個Python爬蟲框架,爬取效率極高,具備高度定製性,可是不支持分佈式。而scrapy-redis一套基於redis數據庫、運行在scrapy框架之上的組件,可讓scrapy支持分佈式策略,Slaver端共享Master端redis數據庫裏的item隊列、請求隊列和請求指紋集合。
爲何選擇redis數據庫,由於redis支持主從同步,並且數據都是緩存在內存中的,因此基於redis的分佈式爬蟲,對請求和數據的高頻讀取效率很是高。
3、數據庫的優化?
1. 優化索引、SQL 語句、分析慢查詢;
2. 設計表的時候嚴格根據數據庫的設計範式來設計數據庫;
3. 使用緩存,把常常訪問到的數據並且不須要常常變化的數據放在緩存中,能節約磁盤IO;
4. 優化硬件;採用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;
5. 採用MySQL 內部自帶的表分區技術,把數據分層不一樣的文件,可以提升磁盤的讀取效率;
6. 垂直分表;把一些不常常讀的數據放在一張表裏,節約磁盤I/O;
7. 主從分離讀寫;採用主從複製把數據庫的讀操做和寫入操做分離開來;
8. 分庫分表分機器(數據量特別大),主要的的原理就是數據路由;
9. 選擇合適的表引擎,參數上的優化;
10. 進行架構級別的緩存,靜態化和分佈式;
11. 不採用全文索引;
12. 採用更快的存儲方式,例如 NoSQL存儲常常訪問的數據。
更多精彩看文中哦