面试题之第一部分(Python基础篇) 80题
第一部分(python基礎篇)80題
為什么學習Python?==*==
# 1. python應用于很多領域,比如后端,前端,爬蟲,機器學習(人工智能)等方面,幾乎能涵蓋各個開發語言的領域,同時它相對于其他語言而言,簡潔。通過什么途徑學習的Python?==*==
# 通過自學,網上看視頻資料,網上買書的方法學習Python和Java、PHP、C、C#、C++等其他語言的對比?==*==
''' python 1. 簡單————Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語一樣,盡管這個英語的要求非常嚴格。Python的這種偽代碼本質是它最大的優點之一。它使你能夠專注于解決問題而不是去搞明白語言本身。 2. 易學————就如同你即將看到的一樣,Python極其容易上手。前面已經提到了,Python有極其簡單的語法。 3. 免費、開源————Python是FLOSS(自由/開放源碼軟件)之一。簡單地說,你可以自由地發布這個軟件的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用于新的自由軟件中。FLOSS是基于一個團體分享知識的概念。這是為什么Python如此優秀的原因之一——它是由一群希望看到一個更加優秀的Python的人創造并經常改進著的。 4. 高層語言————當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節。 5. 可移植性————由于它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工作在不同平臺上)。如果你小心地避免使用依賴于系統的特性,那么你的所有Python程序無需修改就可以在下述任何平臺上面運行。這些平臺包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至還有PocketPC、Symbian以及Google基于linux開發的Android平臺。 6. 解釋性————這一點需要一些解釋。一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你運行你的程序的時候,連接/轉載器軟件把你的程序從硬盤復制到內存中并且運行。而Python語言寫的程序不需要編譯成二進制代碼。你可以直接從源代碼 運行 程序。在計算機內部,Python解釋器把源代碼轉換成稱為字節碼的中間形式,然后再把它翻譯成計算機使用的機器語言并運行。事實上,由于你不再需要擔心如何編譯程序,如何確保連接轉載正確的庫等等,所有這一切使得使用Python更加簡單。由于你只需要把你的Python程序拷貝到另外一臺計算機上,它就可以工作了,這也使得你的Python程序更加易于移植。 7. 面向對象————Python既支持面向過程的編程也支持面向對象的編程。在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在“面向對象”的語言中,程序是由數據和功能組合而成的對象構建起來的。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實現面向對象編程。 8. 可擴展性————如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。 9. 可嵌入性————你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。 10. 豐富的庫————Python標準庫確實很龐大。它可以幫助你處理各種工作,包括正則表達式、文檔生成、單元測試、線程、數據庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界面)、Tk和其他與系統有關的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。缺點: 1. 運行速度慢,相比于C++/C運行速度偏慢,不過對于用戶而言,機器上運行速度是可以忽略的。2. 構架選擇太繁雜,沒有像C#這樣的官方.net構架,也沒有像ruby由于歷史較短,構架開發的相對集中,所以人人都有不同的方案。C:優點:1. 簡潔緊湊、靈活方便?2. 運算符豐富3. 數據結構豐富4. C是結構式語言5. C語法限制不太嚴格,程序設計自由度大6. C語言允許直接訪問物理地址,可以直接對硬件進行操作7. C語言程序生成代碼質量高,程序執行效率高8. C語言適用范圍大,可移植性好9. C語言有一個突出的優點就是適合于多種操作系統,如DOS、UNIX,也適用于多種機型10. 有效地將一個較復雜的程序系統設計任務分解成許多易于控制和處理的子任務,便于開發和維護缺點:運算符和運算優先級過多,不便于記憶,語法定義不嚴格,編程自由度大,對新手不友好。更多對比請參考:https://www.jianshu.com/p/7c8fdedf352e'''簡述解釋型和編譯型編程語言?
# 同聲翻譯:解釋性語言# 谷歌翻譯:編譯性語言# 個人感覺他是想考察你是否對其他的語言有所了解,同時也想看看你對python的理解有多深Python解釋器種類以及特點?==*==
''' 1. CPythonc語言開發的 使用最廣的解釋器 2. IPython基于cpython之上的一個交互式計時器 交互方式增強 功能和cpython一樣 3. PyPy目標是執行效率 采用JIT技術 對python代碼進行動態編譯,提高執行效率 4. JPython運行在Java上的解釋器 直接把python代碼編譯成Java字節碼執行 5. IronPython運行在微軟 .NET 平臺上的解釋器,把python編譯成. NET 的字節碼 '''位和字節的關系?
# 1字節(Bytes) = 8位(bit)b、B、KB、MB、GB 的關系?
''' 1B = 8b 1KB = 1024B 1MB = 1024KB 1GB = 1024MB '''請至少列舉5個 PEP8 規范(越多越好) ==*==
''' 1. 代碼排版2. 文檔排版3. 避免多余空格4. 注釋5. 命令風格6. 編碼建議'''通過代碼實現如下轉換:
二進制轉換成十進制:v = “0b1111011”?
十進制轉換成二進制:v = 18?
八進制轉換成十進制:v = “011”?
十進制轉換成八進制:v = 30?
十六進制轉換成十進制:v = “0x12”?
十進制轉換成十六進制:v = 87
如 10.3.9.12 轉換規則為:
? 10 00001010
? 3 00000011?
? 9 00001001
? 12 00001100?
再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?
IP = "10.3.9.12"def addr2dec(addr):"將點分十進制IP地址轉換成十進制整數"items = [int(x) for x in addr.split(".")]# return sum([items[i] << [24, 16, 8, 0][i] for i in range(4)])return sum([items[i]*2**[24,16,8,0][i] for i in range(4)])print(addr2dec(IP)) # 167971084第一種:
def foo(n):print(n)n += 1foo(n)if __name__ == '__main__':foo(1)# 998第二種:
import syssys.setrecursionlimit(100000)def foo(n):print(n)n += 1foo(n)if __name__ == '__main__':foo(1)# 3221左右v1 = 1 or 3?
v2 = 1 and 3?
v3 = 0 and 2 and 1
? v4 = 0 and 2 or 1
? v5 = 0 and 2 or 1 or 4
? v6 = 0 or False and 1
? a = 1
b = 2
28. Python垃圾回收機制?
python里每一個東西都是對象,它們的核心就是一個結構體:PyObject
typedef struct_object {int ob_refcnt;struct_typeobject *ob_type; } PyObject;PyObject是每個對象必有的內容,其中ob_refcnt就是做為引用計數。當一個對象有新的引用時,它的ob_refcnt就會增加,當引用它的對象被刪除,它的ob_refcnt就會減少
#define Py_INCREF(op) ((op)->ob_refcnt++) //增加計數 #define Py_DECREF(op) \ //減少計數if (--(op)->ob_refcnt != 0) \; \else \__Py_Dealloc((PyObject *)(op))當引用計數為0時,該對象生命就結束了。
引用計數機制的優點:
- 簡單
- 實時性:一旦沒有引用,,內存就會直接釋放了。不用像其他機制等到特定時機。實時性還帶來一個好處:處理回收內存的時間分攤到了平時
引用計數機制的缺點:
維護引用計數消耗資源
循環引用
list1 = [] list2 = [] list1.append(list2) list2.append(list1)list1與list2相互引用,如果不存在其他對象對它們的引用,list1與list2的引用計數也仍然為1,所占用的內存永遠無法被回收,這將是致命的。
對于如今的強大硬件,缺點1尚可接受,但是循環引用導致內存泄露,注定python還將引入新的回收機制。(標記清除和分代收集)參考連接:https://www.cnblogs.com/pinganzi/p/6646742.html#_label6
29. Python的可變類型和不可變類型?
''' 可變類型:列表,字典,集合不可變類型:整型,浮點型,字符串'''求結果:
v = dict.fromkeys(['k1','k2'],[]) v['k1'].append(666) print(v) v['k1'] = 777 print(v) {'k1': [666], 'k2': [666]} {'k1': 777, 'k2': [666]}原因:k1和k2指向的是同一個列表,也就是同一塊內存空間。求結果
def num():return [lambda x:i*x for i in range(4)]print([m(2) for m in num()]) [6, 6, 6, 6] 原因:只有到需要計算i的值時,才會真正計算i的值類似的題目:
flist = [] for i in range(3):def foo(x):print(x + i)flist.append(foo)for f in flist:f(2) 4 4 4 原因:只有到需要計算i的值時,才會真正去算i的值。轉載于:https://www.cnblogs.com/plf-Jack/p/11093713.html
總結
以上是生活随笔為你收集整理的面试题之第一部分(Python基础篇) 80题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 清空所有commit记录
- 下一篇: BigDecimal 与double 转