Python爬蟲面試題170道:2019版【1】


語言特性
1.談談對 Python 和其他語言的區別

語言特點:簡潔、優雅,省略了各種大括號和分號,還有一些關鍵字,類型說明;
語言類型:解釋型語言,運行的時候是一行一行的解釋,並運行,所以調試代碼很方便,開發效率很高;
第三方庫:python是開源的,並且python的定位時任由其發展,應用領域很多比如Web,運維,自動化測試,爬蟲,數據分析,人工智能。Python具有非常完備的第三方庫;
Python和Java相比
Python比Java要簡單。Python是函數為一等公民的語言,而Java是類為一等公民的語言。Python是弱類型語言,而Java是強類型語言.;
Python和C相比
對於使用:
Python的類庫齊全並且使用簡潔,很少代碼實現的功能用C可能要很復雜對於速度;
Python的運行速度相較於C,絕對是很慢了。Python和CPython解釋器都是C語言編寫的

2.簡述解釋型和編譯型編程語言

編譯性和解釋型語言
解釋型:就是邊解釋邊執行;
編譯性:編譯后再執行

3.Python 的解釋器種類以及相關特點?

CPython
c語言開發的 使用最廣的解釋器
IPython
基於cpython之上的一個交互式計時器 交互方式增強 功能和cpython一樣
PyPy
目標是執行效率 采用JIT技術 對python代碼進行動態編譯,提高執行效率
JPython
運行在Java上的解釋器 直接把python代碼編譯成Java字節碼執行
IronPython
運行在微軟 .NET 平台上的解釋器,把python編譯成. NET 的字節碼

4.說說你知道的Python3 和 Python2 之間的區別?

按照當前時間點(Python 2.7 和 Python3.6),從宏觀上介紹下Python 3和Python 2的區別,並舉一些對應常見的例子:
1. 統一了字符編碼支持。
2. 增加了新的語法。print/exec等成為了函數,格式化字符串變量,類型標注,添加了nonlocal、yield fromasync/awaityield for關鍵詞和__annotations__、__context__、__traceback__、__qualname__等dunder方法。
3. 修改了一些語法。metaclass,raise、map、filter以及dict的items/keys/values方法返回迭代對象而不是列表,描述符協議,保存類屬性定義順序,保存關鍵字參數順序
4. 去掉了一些語法。cmp、<>(也就是!=)、xrange(其實就是range)、不再有經典類
5. 增加一些新的模塊。concurrent.futures、venv、unittest.mock、asyncio、selectors、typing等
6. 修改了一些模塊。主要是對模塊添加函數/類/方法(如functools.lru_cache、threading.Barrier)或者參數。
7. 模塊改名。把一些相關的模塊放進同一個包里面(如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放進了http里面,urllib, urllib2, urlparse, robotparse放進了urllib里面),個例如SocketServer改成了socketserver,Queue改成queue等
8. 去掉了一些模塊或者函數。gopherlib、md5、contextlib.nested、inspect.getmoduleinfo等。去掉的內容的原因主要是2點:1. 過時的技術產物,已經沒什么人在用了;2. 出現了新的替代產物后者被證明存在意義不大。理論上對於開發者影響很小。
9. 優化。重新實現了dict可以減少20%-25%的內存使用;提升pickle序列化和反序列化的效率;collections.OrderedDict改用C實現;通過os.scandir對glob模塊中的glob()及iglob()進行優化,使得它們現在大概快了3-6倍等.. 這些都是喜大普奔的好消息,同樣開發者不需要感知,默默的就會讓結果變得更好。
10. 其他。構建過程、C的API、安全性等方面的修改,通常對於開發者不需要關心。

5.Python3 和 Python2 中 int 和 long 區別?

python2中有long類型
python3中沒有long類型,只有int類型

6.xrange 和 range 的區別?

xrange用於返回xrange對象,而range用於返回一個數組。不管那個范圍多大,xrange都使用同樣的內存。
注意:python3中沒有xrange。

python3中演示:

>>> range(10)
range(0, 10)

>>> type(range(10))
<class 'range'>

編碼規范

 7.什么是 PEP8?

1. 變量
常量:大寫加下划線 USER_CONSTANT。
私有變量 : 小寫和一個前導下划線 _private_value。
Python 中不存在私有變量一說,若是遇到需要保護的變量,使用小寫和一個前導下划線。但這只是程序員之間的一個約定,用於警告說明這是一個私有變量,外部類不要去訪問它。但實際上,外部類還是可以訪問到這個變量。
內置變量 : 小寫,兩個前導下划線和兩個后置下划線 __class__兩個前導下划線會導致變量在解釋期間被更名。這是為了避免內置變量和其他變量產生沖突。用戶定義的變量要嚴格避免這種風格。以免導致混亂。


2. 函數和方法

總體而言應該使用,小寫和下划線。但有些比較老的庫使用的是混合大小寫,即首單詞小寫,之后
每個單詞第一個字母大寫,其余小寫。但現在,小寫和下划線已成為規范。
私有方法 :小寫和一個前導下划線,這里和私有變量一樣,並不是真正的私有訪問權限。同時也應該注意一般函數不要使用兩個前導下划線(當遇到兩個前導下划線時,Python 的名稱改編特性將發揮作用)。
特殊方法 :小寫和兩個前導下划線,兩個后置下划線這種風格只應用於特殊函數,比如操作符重載等。
函數參數 : 小寫和下划線,缺省值等號兩邊無空格



3. 類

類總是使用駝峰格式命名,即所有單詞首字母大寫其余字母小寫。類名應該簡明,精確,並足以從中理解類所完成的工作。

 

4. 模塊和包

 

 除特殊模塊 __init__ 之外,模塊名稱都使用不帶下划線的小寫字母。


5. 關於參數

5.1 不要用斷言來實現靜態類型檢測。斷言可以用於檢查參數,但不應僅僅是進行靜態類型檢測。Python 是動態類型語言,靜態類型檢測違背了其設計思想。斷言應該用於避免函數不被毫無意義的調用。

5.2 不要濫用 *args 和 **kwargs。*args 和 **kwargs 參數可能會破壞函數的健壯性。它們使簽名變得模糊,而且代碼常常開始在不應該的地方構建小的參數解析器。

 

6. 其他


6.1 使用 has 或 is 前綴命名布爾元素
is_connect = True
has_member = False
6.2 用復數形式命名序列
members = ['user_1', 'user_2']
6.3 用顯式名稱命名字典
person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
6.4 避免通用名稱
諸如 list, dict, sequence 或者 element 這樣的名稱應該避免。
6.5 避免現有名稱
諸如 os, sys 這種系統已經存在的名稱應該避免。


7. 一些數字
一行列數 : PEP 8 規定為 79 列。根據自己的情況,比如不要超過滿屏時編輯器的顯示列數。
一個函數 : 不要超過 30 行代碼, 即可顯示在一個屏幕類,可以不使用垂直游標即可看到整個函數。
一個類 : 不要超過 200 行代碼,不要有超過 10 個方法。一個模塊 不要超過 500 行。

8.了解 Python 之禪么?

 import this
"The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!"

9.了解 dosctring 么?

就是函數方法的內置解釋,隨便import一個模塊,比如re正則,輸出re.__doc__就出現類似help(re)的文檔內容,不過比help()簡短多了。

10.了解類型注解么?

Python解釋器會在運行的時候動態判斷變量和參數的類型,這樣的好處是編寫代碼速度很快,很靈活,但是壞處也很明顯,不好維護,可能代碼寫過一段時間重新看就很難理解了,因為那些變量、參數、函數返回值的類型,全都給忘記了。
而且當你在讀別人的代碼的時候,也無法一眼看出變量或者參數的類型,經常要自己推敲,這樣給學習帶來了很大的障礙。
所以Python3里有了這個新特性,可以給參數、函數返回值和變量的類型加上注解,不過這個僅僅是注釋而已,對代碼的運行來說沒有任何影響,變量的真正類型還是會有Python解釋器來確定,你所做的只是在提高代碼的可讀性,僅此而已。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM