第一部分(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
'''
第一題
v = b'0b1111011'
print(int(v,2))第二題:
print("轉換為二進制為:", bin(18))第三題:
八進制轉換成十進制:v = “011”?
print(int("011",8))第四題:print(oct(v))第五題:
v = '0x12'
print(int(v,16))第六題:
v = 87
print(hex(v))
'''
- 請編寫一個函數實現將IP地址轉換成一個整數。
如 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
- python遞歸的最大層數?
第一種:
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
>>> v1 = 1 or 3
>>> v1
1
>>> v2 = 1 and 3
>>> v2
3
>>> v3 = 0 and 2 and 1
>>> v3
0
>>> v4 = 0 and 2 or 1
>>> v4
1
>>> v5 = 0 and 2 or 1 or 4
>>> v5
1
>>> v6 = 0 or False and 1
>>> v6
False'''
對于python而言
1. 在不加括號時候,and優先級大于or
2. x or y的值只可能是x或y,x為真就是x,x為假就是y
3. x and y的值只可能是x或y,x為真就是y,x為假就是x
'''
- ascii、unicode、utf-8、gbk 區別?
'''
1. ascii 8位一個字節2. unicode英文:32位 四個字節中文:32位 四個字節
3. utf-8英文:8位 一個字節中文:16位 兩個字節
4. gbk:英文:8位 一個字節中文:16位 兩個字節python3中:str 在內存中是unicode編碼bytes類型對于英文:str:表現形式:s = 'alex'編碼方式:010101010 unicodebytes:表現形式:s = b'alex'編碼方式:000101010 utf-8 gbk對于中文:str:表現形式:s = '中國'編碼方法:010101010 unicodebytes:表現形式:s = b' x\e91\e91\e01\e21\e31\e32'編碼方式:000101010 utf-8 gbkencode 編碼,如何將str --> bytes使用方法:str.encode('utf-8')decode 解碼,如何將bytes --> str使用方法:bytes.decode('utf-8')
'''
- 字節碼和機器碼的區別?
'''
機器碼:機器語言字節碼:匯編語言'''
- 三元運算規則以及應用場景?
a = 10
b = 20
x = a if a < b else b# 為真時的結果 if 判斷條件 else 為假時的結果(注意,沒有冒號)
- 列舉 Python2和Python3的區別?
'''
1. 2中print "字符串" 被 3中的 print()取代
2. 2中input得到的是int類型,raw_input得到的是str類型,而3中只有input且是str類型
3. 2中字符串以8-bit字符串存儲,3中字符串以16-bit unicode字符串存儲
4. 2中try:passexcept Exception,e:pass3中try:passexcept Exception as e:pass
'''
- 用一行代碼實現數值交換:
? a = 1
b = 2
a,b = b,a
- Python3和Python2中 int 和 long的區別?
'''
python2中有long類型
python3中沒有long類型,只有int類型
'''
- xrange和range的區別?
'''
在python2中:xrange 返回的是一個迭代值(生成器)range 返回的是一個列表在python3中:range 返回的是一個迭代值(生成器)'''
- 文件操作時:xreadlines和readlines的區別?
'''
xreadlines()則直接返回一個iter(file)迭代器,在Python 2.3之后已經不推薦這種表示方法了readlines()是把文件的全部內容讀到內存,并解析成一個list,當文件的體積很大的時候,需要占用很多內存,使用該方法是一種不明智的做法。
'''
- 列舉布爾值為False的常見值?
# 0,None,空(空容器),Flase
- 字符串、列表、元組、字典每個常用的5個方法?
'''
字符串:split,切片,for循環,成員運算,strip,len,replace,lower(),upper(),find()列表: append(),for循環,pop(),排序,join,insert(),切片,len(),count()增:刪:改:查:
元組:查:index()count()len()比較:cmp(tuple1,tuple2) 比較兩個元組元素;len(tuple):計算元組元素個數;max(tuple):返回元組中元素最大值。;min(tuple):返回元組中元素最小值。tuple(seq):將列表轉換為元組'''
- lambda表達式格式以及應用場景?
# lambda arges1 [arges2...]: 表達式
lambda x: x+2
- pass的作用?
# 相當于填充代碼
- *args和**kwargs作用
'''*args 作為形參,當用戶傳入多個位置參數時,其值都存在args中(以元組的形式)**kwargs 作為形參,當用戶傳入多個關鍵字參數時,其值都存在kwargs中(以鍵值對的形式存儲)'''
- is和==的區別
# is 是判斷內存地址的(身份運算符)# == 是判斷值是否相等'''
內存地址相同,值一定相等;值相等,內存地址不一定相等。'''
- 簡述Python的深淺拷貝以及應用場景?
'''
普通拷貝
a 是 b的普通拷貝,則a發生改變 b也發生改變。b發生改變,a也發生改變淺拷貝
a 是 b的淺拷貝,則a中的不可變數據類型發生改變,b不會變。a中可變類型發生改變,b也會隨之改變深拷貝
a 是 b的深拷貝,a,b無關'''# 淺拷貝
import copy
copy.copy()# 深拷貝
import copy
copy.deepcopy()
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的值。