1. 為什么學習Python?
- 全球主流的編輯語言
Python , 是一種面向?qū)ο蟮慕忉屝陀嬎銠C程序設計語言,具有豐富和強大的庫,Python 已經(jīng)成為繼Java,C++之后的的第三大語言。 特點:簡單易學、免費開源、高層語言、可移植性強、面向?qū)ο?、可擴展性、可嵌入型、豐富的庫、規(guī)范的代碼等。 - 無所不能的編程語言
Python除了極少的事情不能做之外,其他基本上可以說全能,Python可以做系統(tǒng)運維、云計算開發(fā)、圖形處理、金融分析、游戲開發(fā)、數(shù)學處理數(shù)據(jù)庫編程、網(wǎng)絡編程、WEB編程、PYMO引擎、黑客編程、爬蟲開發(fā)、機器學習、人工智能等等。 - 企業(yè)越來越熱衷的語言
Python強大的生態(tài)圈注定它了應用廣泛,國內(nèi)的豆瓣、搜狐、金山、通訊、盛大、網(wǎng)易、百度、阿里、土豆、新浪等,國外:谷歌、NASA、YOUTU、FACEBOOK、紅帽等企業(yè)都在廣泛應用。 - 國家政策推動支持
國務院發(fā)布了《新一代人工智能發(fā)展規(guī)劃》,人工智能正式納入國家發(fā)展戰(zhàn)略,開啟了國內(nèi)人工智能產(chǎn)業(yè)發(fā)展的新篇章。2017年P(guān)ython還被列入全國計算機等級考試,山東省小學課程加入了Python,浙江省、北京市、山東省已把Python納入信息技術(shù)課程和高考的內(nèi)容體系。
2. 通過什么學習Python?
通過網(wǎng)上各種學習視頻,比如小甲魚,慕課的七月老師以及各大Python的交流論壇等。
3. Python和Java、PHP、C、C#、C++等其他語言的對比?
- python語言,是一種面向?qū)ο?、直譯式計算機程序設計語言,Python語法簡潔而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,它能夠很輕松的把用其他語言制作的各種模塊(尤其是C/C++)輕松地聯(lián)結(jié)在一起。常見的一種應用情形是,使用python快速生成程序的原型(有時甚至是程序的最終界面),然后對其中有特別要求的部分,用更合適的語言改寫。
- Python是完全面向?qū)ο蟮恼Z言。函數(shù)、模塊、數(shù)字、字符串都是對象。并且完全支持繼承、重載、派生、多繼承,有益于增強源代碼的復用性。Python支持重載運算符和動態(tài)類型。相對于Lisp這種傳統(tǒng)的函數(shù)式編程語言,Python對函數(shù)式設計只提供了有限的支持。有兩個標準庫(functools, itertools)提供了Haskell和Standard ML中久經(jīng)考驗的函數(shù)式程序設計工具。Python本身被設計為可擴充的。并非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程序員能夠輕松地使用C語言、C++、Cython來編寫擴充模塊。
- Python編譯器本身也可以被集成到其它需要腳本語言的程序內(nèi)。因此,很多人還把Python作為一種“膠水語言”(glue language)使用。使用Python將其他語言編寫的程序進行集成和封裝。
4.簡述解釋型和編譯型編程語言?
1. 概念
- 編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然后,可直接運行這個程序。
- 解釋型語言:把做好的源程序翻譯一句,然后執(zhí)行一句,直至結(jié)束!
2. 區(qū)別
- 編譯型語言,執(zhí)行速度快、效率高;依賴編譯器、跨平臺性差些。如C、C++、Delphi、Pascal,F(xiàn)ortran。
- 解釋型語言,執(zhí)行速度慢、效率低;依賴解釋器、跨平臺性好。如Java、Basic。
3. python
- Python 的采用了類似Java的編譯模式,先將Python程序編譯成Python字節(jié)碼,然后由一個專門的Python字節(jié)碼解釋器負責解釋執(zhí)行字節(jié)碼。
- python是解釋型語言,它通過python解釋器實現(xiàn)向底層語言的映射。我們知道python虛擬機是由C語言編寫的,所以python程序會轉(zhuǎn)化為C程序而執(zhí)行。比如,python中的所有對象都會在C中有對應的PyObject結(jié)構(gòu)體。python的list、dict等數(shù)據(jù)類型也要在C中有對應的表示。而像生成器、迭代器等語法結(jié)構(gòu)需要相應的支持。
5. python解釋器種類及特點?
Python是一門解釋器語言,代碼想運行,必須通過解釋器執(zhí)行,Python存在多種解釋器,分別基于不同語言開發(fā),每個解釋器有不同的特點,但都能正常運行Python代碼,以下是常用的五種Python解釋器:
- CPython
當 從Python官方網(wǎng)站下載并安裝好Python2.7后,就直接獲得了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發(fā)的,所以叫 CPython,在命名行下運行python,就是啟動CPython解釋器,CPython是使用最廣的Python解釋器。 - IPython
IPython是基于CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強,但是執(zhí)行Python代碼的功能和CPython是完全一樣的,好比很多國產(chǎn)瀏覽器雖然外觀不同,但內(nèi)核其實是調(diào)用了IE。 - PyPy
PyPy是另一個Python解釋器,它的目標是執(zhí)行速度,PyPy采用JIT技術(shù),對Python代碼進行動態(tài)編譯,所以可以顯著提高Python代碼的執(zhí)行速度。 - Jython
Jython是運行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。 - IronPython
IronPython和Jython類似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼。
在Python的解釋器中,使用廣泛的是CPython,對于Python的編譯,除了可以采用以上解釋器進行編譯外,技術(shù)高超的開發(fā)者還可以按照自己的需求自行編寫Python解釋器來執(zhí)行Python代碼,十分的方便!
6. 位和字節(jié)的關(guān)系?
- 最小的存儲單位稱為位(bit):只能容納兩個值(0或1)之一,不能在一個位中存儲更多的信息。位是計算機存儲的基本單位。
- 字節(jié)(byte)是常用的計算機存儲單位。
字節(jié)的標準定義:一個字節(jié)均為8位。由于上述所講每個位或者是0或者是1,所以一個8位的字節(jié)包含256種可能的0,1組合。 - 對于一種給定的計算機設計,字(word)是自然的存儲單位。
一個英文字符和英文標點占用一個字節(jié),一個中文字符和中文標點占用2個字節(jié)。
7. b、B、KB、MB、GB 的關(guān)系?
- utf-8中一個字母或者數(shù)字等于一個字節(jié),一個漢字等于3個字節(jié),表情等于4個字節(jié)
b 比特bit / 位
B——字節(jié)
KB——千比特
MB——兆比特
GB——吉比特
1 B = 8b (8個bit/ 位) 一個字節(jié)(byte)等于8位(bit)
1 kB = 1024 B (kB - kilobajt)
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)
英文和數(shù)字占一個字節(jié)
中文占一個字符,也就是兩個字節(jié)
字符 不等于 字節(jié)。
字符(char)是 Java 中的一種基本數(shù)據(jù)類型,由 2 個字節(jié)組成,范圍從 0 開始,到 2^16-1。
字節(jié)是一種數(shù)據(jù)量的單位,一個字節(jié)等于 8 位。所有的數(shù)據(jù)所占空間都可以用字節(jié)數(shù)來衡量。例如一個字符占 2 個字節(jié),一個 int 占 4 個字節(jié),一個 double 占 8 個字節(jié) 等等。
1字符=2字節(jié);
1Byte=8bit
1k=2^10;b:位;B:字節(jié)1kb=1024 位1kB=1024 字節(jié)。
8. 請至少列舉5個 PEP8 規(guī)范(越多越好)。
-
代碼編排
- 縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
- 每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的后邊敲回車。
- 類和top-level函數(shù)定義之間空兩行;類中的方法定義之間空一行;函數(shù)內(nèi)邏輯無關(guān)段落之間空一行;其他地方盡量不要再空行。
-
文檔編排
- 模塊內(nèi)容的順序:模塊說明和docstring—import—globals&constants—其他定義。其中import部分,又按標準、三方和自己編寫順序依次排放,之間空一行。
- 不要在一句import中多個庫,比如import os, sys不推薦。
- 如果采用from XX import XX引用庫,可以省略‘module.’,都是可能出現(xiàn)命名沖突,這時就要采用import XX。
-
空格的使用
- 總體原則,避免不必要的空格。
- 各種右括號前不要加空格。
- 逗號、冒號、分號前不要加空格。
- 函數(shù)的左括號前不要加空格。如Func(1)。
- 序列的左括號前不要加空格。如list[2]。
- 操作符左右各加一個空格,不要為了對齊增加空格。
- 函數(shù)默認參數(shù)使用的賦值符左右省略空格。
- 不要將多句語句寫在同一行,盡管使用‘;’允許。
- if/for/while語句中,即使執(zhí)行語句只有一句,也必須另起一行。
-
注釋
- 總體原則,錯誤的注釋不如沒有注釋。所以當一段代碼發(fā)生變化時,第一件事就是要修改注釋!
- 注釋必須使用英文,最好是完整的句子,首字母大寫,句后要有結(jié)束符,結(jié)束符后跟兩個空格,開始下一句。如果是短語,可以省略結(jié)束符。
- 塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔。
- 行注釋,在一句代碼后加注釋。比如:x = x + 1 # Increment x
但是這種方式盡量少使用。 - 避免無謂的注釋。
-
文檔描述
- 為所有的共有模塊、函數(shù)、類、方法寫docstrings;非共有的沒有必要,但是可以寫注釋(在def的下一行)。
- 如果docstring要換行,用三引號。
-
命名規(guī)范
- 總體原則,新編代碼必須按下面命名風格進行,現(xiàn)有庫的編碼盡量保持風格。
- 盡量單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。
- 模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。
- 包命名盡量短小,使用全部小寫的方式,不可以使用下劃線。
- 類的命名使用CapWords的方式,模塊內(nèi)部使用的類采用_CapWords的方式。
- 異常命名使用CapWords+Error后綴的方式。
- 全局變量盡量只在模塊內(nèi)有效,類似C語言中的static。實現(xiàn)方法有兩種,一是all機制;二是前綴一個下劃線。
- 函數(shù)命名使用全部小寫的方式,可以使用下劃線。
- 常量命名使用全部大寫的方式,可以使用下劃線。
- 類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。
- 類的屬性有3種作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。
- 類的屬性若與關(guān)鍵字名字沖突,后綴一下劃線,盡量不要使用縮略等其他方式。
- 為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下劃線。比如:類Foo中聲明__a,訪問時,只能通過Foo._Foo__a,避免歧義。如果子類也叫Foo,那就無能為力了。
- 類的方法第一個參數(shù)必須是self,而靜態(tài)方法第一個參數(shù)必須是cls。
-
編碼建議
- 編碼中考慮到其他python實現(xiàn)的效率等問題,比如運算符‘+’在CPython(Python)中效率很高,都是Jython中卻非常低,所以應該采用.join()的方式。
- 盡可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優(yōu)于if x。
- 使用基于類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception。
- 異常中不要使用裸露的except,except后跟具體的exceptions。
- 異常中try的代碼盡可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要優(yōu)于
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
- 使用startswith() and endswith()代替切片進行序列前綴或后綴的檢查。比如:
Yes: if foo.startswith('bar'):優(yōu)于
No: if foo[:3] == 'bar': - 使用isinstance()比較對象的類型。比如
Yes: if isinstance(obj, int): 優(yōu)于
No: if type(obj) is type(1): - 判斷序列空或不空,有如下規(guī)則
Yes: if not seq:
if seq:
優(yōu)于
No: if len(seq)
if not len(seq)- 字符串不要以空格收尾。
- 二進制數(shù)據(jù)判斷使用 if boolvalue的方式。