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