python面試題【黑鐵 IV】(python面試題基礎(chǔ))
轉(zhuǎn)載: ?https://www.cnblogs.com/xiugeng/p/9712775.html

1.Python和Java、PHP、C、C#、C++等其他語言的對比?
Python:輕量級、易學(xué)、自由/開放源碼軟件、可移植性、支持面向?qū)ο蟆⒇S富的庫、規(guī)范的代碼。 Java:優(yōu)點:開源性,功能強(qiáng)大,庫多 缺點:編譯速度 比較慢,不完全 PHP:優(yōu)點:性能很強(qiáng),配合簡單,穩(wěn)定,容易部署。 缺點:函數(shù)命名不規(guī)范,駝峰法和下劃線,傳參位置不一。 C: 優(yōu)點:能操縱底層,能細(xì)粒度優(yōu)化性能。 缺點:1、是面向過程的,2、運(yùn)行時類型檢查不可用,3、不提供命名空間功能,4、構(gòu) 造函數(shù)和析構(gòu)函數(shù)不可用。 C#: 優(yōu)點: 強(qiáng)大的.NET Framework托管代碼集合類,較簡單的語言特性。WEB應(yīng)用程序 開發(fā)速度快。 缺點:底層和高性能不合適,Windows平臺以外支持有限。 C++: 優(yōu)點:性能比較高,可進(jìn)化型。 缺點: 難學(xué),門檻高
2.簡述解釋型和編譯型編程語言?
編譯型語言: 使用專門的編譯器,針對特定的平臺,將高級語言源代碼一次性的編譯成可被該平臺硬件執(zhí)行的機(jī)器碼,并包裝成該平臺所能識別的可執(zhí)行性程序的格式。 特點: 在編譯型語言寫的程序執(zhí)行之前,需要一個專門的編譯過程,把源代碼編譯成機(jī)器語言的文件. 執(zhí)行方式: 源代碼 ———> 編譯(一次編譯) ———>目標(biāo)代碼———>執(zhí)行(多次執(zhí)行)———>輸出 解釋型語言: 使用專門的解釋器對源程序逐行解釋成特定平臺的機(jī)器碼并立即執(zhí)行。 特點: 解釋型語言不需要事先編譯,其直接將源代碼解釋成機(jī)器碼并立即執(zhí)行,所以只要某一平臺提供了相應(yīng)的解釋器即可運(yùn)行該程序。 執(zhí)行方式: 源代碼 ———> 解釋器(每次執(zhí)行都需要解釋)———>輸出 編譯型: C c++, c# 解釋型: python PHP ruby, java
3.Python解釋器種類以及特點?
CPython 官方版本的解釋器:CPython。這個解釋器是用C語言開發(fā)的,所以叫CPython。在命令行下運(yùn)行python就是啟動CPython解釋器。CPython是使用最廣且被的Python解釋器。 IPython IPython是基于CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強(qiáng),但是執(zhí)行Python代碼的功能和CPython是完全一樣的。 CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。 PyPy PyPy是另一個Python解釋器,它的目標(biāo)是執(zhí)行速度。PyPy采用JIT技術(shù),對Python代碼進(jìn)行動態(tài)編譯(注意不是解釋),所以可以顯著提高Python代碼的執(zhí)行速度。 絕大部分Python代碼都可以在PyPy下運(yùn)行,但是PyPy和CPython有一些是不同的,這就導(dǎo)致相同的Python代碼在兩種解釋器下執(zhí)行可能會有不同的結(jié)果。如果你的代碼要放到PyPy下執(zhí)行,就需要了解PyPy和CPython的不同點。 Jython Jython是運(yùn)行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。 IronPython IronPython和Jython類似,只不過IronPython是運(yùn)行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼。
4.位和字節(jié)的關(guān)系?
位:"位(bit)"是電子計算機(jī)中最小的數(shù)據(jù)單位。每一位的狀態(tài)只能是0或1。 字節(jié):8個二進(jìn)制位構(gòu)成1個"字節(jié)(Byte)",它是存儲空間的基本計量單位。1個字節(jié)可以儲存1個英文字母或者半個漢字,換句話說,1個漢字占據(jù)2個字節(jié)的存儲空間。
5.b、B、KB、MB、GB 的關(guān)系?
b 比特bit / 位 B——字節(jié) 1 B = 8b(8個bit/ 位)一個字節(jié)(byte)等于8位(bit) KB——千比特 1 kB = 1024 B (kB - kilobajt) MB——兆比特 1 MB = 1024 kB (MB - megabajt) GB——吉比特 1 GB = 1024 MB (GB - gigabajt)
請至少列舉5個 PEP8 規(guī)范(越多越好)。
https://legacy.python.org/dev/peps/pep-0008/
python遞歸的最大層數(shù)?
import sys sys.getrecursionlimit() # 獲取最大遞歸層數(shù) 默認(rèn)是1000(0-999) sys.setrecursionlimit(1200) # 設(shè)置最大遞歸層數(shù)
12、求結(jié)果:
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
>>>print(1 or 3) 1 >>>print(1 and 3) 3 >>>print(0 and 2 and 1) 0 >>>print(0 and 2 or 1) 1 >>>print(0 and 2 or 1 or 4) 1 >>>print(0 or False and 1) False
13、ascii、unicode、utf-8、gbk 區(qū)別?
字節(jié)碼和機(jī)器碼的區(qū)別?
機(jī)器碼(machine code),學(xué)名機(jī)器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的數(shù)據(jù)。 通常意義上來理解的話,機(jī)器碼就是計算機(jī)可以直接執(zhí)行,并且執(zhí)行速度最快的代碼。 用機(jī)器語言編寫程序,編程人員要首先熟記所用計算機(jī)的全部指令代碼和代碼的涵義。手編程序時,程序員得自己處理每條指令和每一數(shù)據(jù)的存儲分配和輸入輸出,還得記住編程過程中每步所使用的工作單元處在何種狀態(tài)。這是一件十分繁瑣的工作,編寫程序花費(fèi)的時間往往是實際運(yùn)行時間的幾十倍或幾百倍。而且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。現(xiàn)在,除了計算機(jī)生產(chǎn)廠家的專業(yè)人員外,絕大多數(shù)的程序員已經(jīng)不再去學(xué)習(xí)機(jī)器語言了。 機(jī)器語言是微處理器理解和使用的,用于控制它的操作二進(jìn)制代碼。8086到Pentium的機(jī)器語言指令長度可以從1字節(jié)到13字節(jié)。盡管機(jī)器語言好像是很復(fù)雜的,然而它是有規(guī)律的。存在著多至100000種機(jī)器語言的指令。這意味著不能把這些種類全部列出來。總結(jié):機(jī)器碼是電腦CPU直接讀取運(yùn)行的機(jī)器指令,運(yùn)行速度最快,但是非常晦澀難懂,也比較難編寫,一般從業(yè)人員接觸不到。 字節(jié)碼(Bytecode)是一種包含執(zhí)行程序、由一序列 op 代碼/數(shù)據(jù)對 組成的二進(jìn)制文件。字節(jié)碼是一種中間碼,它比機(jī)器碼更抽象,需要直譯器轉(zhuǎn)譯后才能成為機(jī)器碼的中間代碼。 通常情況下它是已經(jīng)經(jīng)過編譯,但與特定機(jī)器碼無關(guān)。字節(jié)碼通常不像源碼一樣可以讓人閱讀,而是編碼后的數(shù)值常量、引用、指令等構(gòu)成的序列。 字節(jié)碼主要為了實現(xiàn)特定軟件運(yùn)行和軟件環(huán)境、與硬件環(huán)境無關(guān)。字節(jié)碼的實現(xiàn)方式是通過編譯器和虛擬機(jī)器。編譯器將源碼編譯成字節(jié)碼,特定平臺上的虛擬機(jī)器將字節(jié)碼轉(zhuǎn)譯為可以直接執(zhí)行的指令。字節(jié)碼的典型應(yīng)用為Java bytecode。 字節(jié)碼在運(yùn)行時通過JVM(JAVA虛擬機(jī))做一次轉(zhuǎn)換生成機(jī)器指令,因此能夠更好的跨平臺運(yùn)行。 總結(jié):字節(jié)碼是一種中間狀態(tài)(中間碼)的二進(jìn)制代碼(文件)。需要直譯器轉(zhuǎn)譯后才能成為機(jī)器碼。
15、三元運(yùn)算規(guī)則以及應(yīng)用場景? 三元運(yùn)算又稱三目運(yùn)算,是對簡單的條件語句的簡寫: 為真時的結(jié)果 if 判斷條件 else 為假時的結(jié)果(注意,沒有冒號) x = x+1 if x%2==1 else x 16、列舉 Python2和Python3的區(qū)別? Python2默認(rèn)的字符編碼是ASCII,默認(rèn)的文件編碼也是ASCII ; python3默認(rèn)的字符編碼是unicode,默認(rèn)的文件編碼是utf-8。 在python2里,將string處理為原生的bytes類型。 python3把字符串的編碼改成了unicode, 還把str和bytes做了明確區(qū)分, str就是unicode格式的字符,bytes是單純二進(jìn)制。 print語句沒有了,取而代之的是print()函數(shù)。 在python 2.x中/除法整數(shù)相除的結(jié)果是一個整數(shù),把小數(shù)部分完全忽略掉,浮點數(shù)除法會保留小數(shù)點的部分得到一個浮點數(shù)的結(jié)果。 在python 3.x中/除法不再這么做了,對于整數(shù)之間的相除,結(jié)果也會是浮點數(shù)。 捕獲異常的語法由 except exc, var 改為 except exc as var。 Python 2.x 中反引號``相當(dāng)于repr函數(shù)的作用 Python 3.x 中去掉了``這種寫法,只允許使用repr函數(shù) Py3.X去除了long類型,現(xiàn)在只有一種整型——int,但它的行為就像2.X版本的long 在 Python 2 中 有range()和xrange() ,一般使用xrange()創(chuàng)建迭代對象。 在 Python 3 中,range() 是像 xrange()那樣實現(xiàn),xrange()內(nèi)置函數(shù)已經(jīng)刪除。 17、用一行代碼實現(xiàn)數(shù)值交換: ? a = 1 ? b = 2 >>>a=1 >>>b=2 >>>a, b = b, a >>>a 2 >>>b 1 18、Python3和Python2中 int 和 long的區(qū)別? python2有非浮點數(shù)準(zhǔn)備的int和long類型。int類型最大值不能超過sys.maxint,而且這個最大值是平臺相關(guān)的。
可以通過在數(shù)字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數(shù)字范圍更大。
python3里,只有一種整數(shù)類型int,大多數(shù)情況下,和python2中的長整型類似。 19、xrange和range的區(qū)別? python2里,有兩種方法獲得一定范圍內(nèi)的數(shù)字:range(),返回一個列表,還有xrange(),返回一個迭代器。 python3里,range()返回迭代器,xrange()不再存在。 20、文件操作時:xreadlines和readlines的區(qū)別?(python2.3) 返回類型不同: readlines()讀取所有行然后把它們作為一個字符串列表返回。 xreadlines返回的是生成器 readline()方法讀取整行,包括行結(jié)束符,并作為字符串返回; 每次讀取一行,返回的是一個字符串對象,保持當(dāng)前行的內(nèi)存 21、列舉布爾值為False的常見值? bool(0) bool(None) bool("") bool(()) bool([]) bool({}) 22、字符串、列表、元組、字典每個常用的5個方法? 字符串:索引、查找find('e')、移除空白strip()、長度len()、替換replace('h', 'H') 列表:切片[1:4]、追加append()、插入insert()、修改li[2]="修改"、刪除remove和pop 元組:索引ages[3]、切片name[0:2]、長度len()、創(chuàng)建tuple、刪除del 字典:keys()返回包含字典所有key的列表;values()返回包含字典所有value列表;items()返回一個包含所有鍵值的列表;get()查看字典key對應(yīng)的值;len()查看字典長度。 23、lambda表達(dá)式格式以及應(yīng)用場景? lambda函數(shù)就是可以接受任意多個參數(shù)(包括可選參數(shù))并且返回單個表達(dá)式值得函數(shù)。 語法:lambda [arg1 [,arg2,.....argn]]:expression def calc(x,y): return x*y # 將上述一般函數(shù)改寫為匿名函數(shù): lambda x,y:x*y 應(yīng)用:1.lambda函數(shù)比較輕便,即用即仍,適合完成只在一處使用的簡單功能。 2.匿名函數(shù),一般用來給filter,map這樣的函數(shù)式編程服務(wù) 3.作為回調(diào)函數(shù),傳遞給某些應(yīng)用,比如消息處理。 24、pass的作用? 1、空語句 do nothing 2、保證格式完整 3、保證語義完整 25、*arg和**kwarg作用 *args代表位置參數(shù),它會接收任意多個參數(shù)并把這些參數(shù)作為元組傳遞給函數(shù)。 **kwargs代表的關(guān)鍵字參數(shù),允許你使用沒有事先定義的參數(shù)名。 位置參數(shù)一定要放在關(guān)鍵字參數(shù)的前面。 作用:使用*args和**kwargs可以非常方便的定義函數(shù),同時可以加強(qiáng)擴(kuò)展性,以便日后的代碼維護(hù)。 26、is和==的區(qū)別 ==是python標(biāo)準(zhǔn)操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等; is也被叫做同一性運(yùn)算符,這個運(yùn)算符比較判斷的是對象間的唯一身份標(biāo)識,也就是id是否相同。 27、簡述Python的深淺拷貝以及應(yīng)用場景? 導(dǎo)入模塊:import copy 淺拷貝:copy.copy 深拷貝:copy.deepcopy 淺拷貝指僅僅拷貝數(shù)據(jù)集合的第一層數(shù)據(jù),深拷貝指拷貝數(shù)據(jù)集合的所有層。
所以對于只有一層的數(shù)據(jù)集合來說深淺拷貝的意義是一樣的,比如字符串,數(shù)字,還有僅僅一層的字典、列表、元祖等. 應(yīng)用: 淺拷貝在拷貝大量數(shù)據(jù)且不需要改變內(nèi)部元素的值的時候,能大量的減少內(nèi)存的使用; 深拷貝在拷貝大量數(shù)據(jù)的時候,需要在前后內(nèi)部元素的內(nèi)容進(jìn)行改變的時候,可以修改拷貝出來的模板 28、Python垃圾回收機(jī)制? 1、回收計數(shù)引用為0的對象,釋放其占用空間 2、循環(huán)垃圾回收器。釋放循環(huán)引用對象 29、Python的可變類型和不可變類型? 可變類型:list、dict、set、可變集合 不可變類型:string、int、float、tuple、不可變集合 30、求結(jié)果: # Python 字典 fromkeys() 函數(shù)用于創(chuàng)建一個新字典,以序列 seq 中元素做字典的鍵,value 為字典所有鍵對應(yīng)的初始值。 # dict.fromkeys(seq, value) v = dict.fromkeys(['k1', 'k2'], []) print(v) # {'k1': [], 'k2': []} v['k1'].append(666) print(v) # {'k1': [666], 'k2': [666]} v['k1'] = 777 print(v) # {'k1': 777, 'k2': [666]} 31、求結(jié)果: def num(): return [lambda x:i*x for i in range(4)] # lambda表達(dá)式 print([m(2) for m in num()]) # 列表生成式 """ [6, 6, 6, 6] """ a = [i+1 for i in range(10)] print(a) """ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] """ 32、列舉常見的內(nèi)置函數(shù)? abs() # 取絕對值 dict() # 把數(shù)據(jù)轉(zhuǎn)為字典 help() # 幫助 min() # 找出最小值 max() # 找出最大值 setattr() # 設(shè)置屬性值 bool() # 判斷True or False(bool(0)、bool(Flase)、bool([])) all() # 可循環(huán)的數(shù)據(jù)集合每個元素bool()均為True;或者空列表也是True any() # 任意一個值是True即返回True dir() # 打印當(dāng)前程序里的所有變量 hex() # 轉(zhuǎn)換為16進(jìn)制數(shù) slice() # 提前定義切片規(guī)則 divmod() # 傳入兩個變量a、b,得到a//b結(jié)果和余數(shù)a%b sorted() # 列表排序sorted(li)等同于li.sort() 用法:sorted(iterable, key) ascii(2) # 只能返回ascii碼 enumerate([3,2,13,4]) # 返回列表的索引 input('dasd') oct(10) # 轉(zhuǎn)八進(jìn)制 staticmethod() # bin(10) # 轉(zhuǎn)二進(jìn)制 open() # 文件打開 str() # 轉(zhuǎn)字符串 isinstance() ord('a') # 返回97,ascii碼中'a'位置 chr(97) # 返回'a',輸入97位置返回ascii碼對應(yīng)字符 sum([1,4,5,-1,3,0]) # 計算列表求和 pow(100,2) # 返回x的y次方,10000 callable() # 查看函數(shù)是否可以調(diào)用,還可用于判斷變量是否是函數(shù) format() vars() # 打印變量名和對應(yīng)的值 locals() # 打印函數(shù)的局部變量(一般在函數(shù)內(nèi)運(yùn)行) globals() # 打印全局變量 repr() # 顯示形式變?yōu)樽址?compile() # 編譯代碼 complex() # 將一個數(shù)變?yōu)閺?fù)數(shù) ''' >>> complex(3,5) (3,5j) ''' round(1.2344434,2) # 指定保留幾位小數(shù) 輸出1.23 # delattr, hasattr, getattr, setattr # 面向?qū)ο笾袘?yīng)用 hash() # 把一個字符串變?yōu)橐粋€數(shù)字 memoryview() # 大數(shù)據(jù)復(fù)制時內(nèi)存映射 set() # 把一個列表變?yōu)榧?''' >>> set([12,5,1,7,9]) {1, 5, 7, 9, 12} ''' 33、filter、map、reduce的作用? filter() # 將符合條件的值過濾出來 map(lambda x:x*x , [1,2,3,4,5]) # 根據(jù)提供的函數(shù)對指定序列做映射 reduce(function, iterable[, initializer]) # 對參數(shù)序列中元素進(jìn)行累積 34、一行代碼實現(xiàn)9*9乘法表 print("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10))) 35、如何安裝第三方模塊?以及用過哪些第三方模塊? 36、至少列舉8個常用模塊都有那些? 1、sys:用于提供對解釋器相關(guān)的訪問以及維護(hù),并有很強(qiáng)的交互功能 2、time: 時間模塊 3、os:用于提供操作系統(tǒng)模塊 4、ashlib:用于加密相關(guān)的操作 5、random:生成隨機(jī)變量 6、pickle:用于python特有的類和pthon的數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換 7、datetime:date和time的結(jié)合體 8、re:正則表達(dá)式模塊 37、re的match和search區(qū)別? re.match 從頭開始匹配 re.search 匹配包含 match與search函數(shù)功能一樣,match匹配字符串開始的第一個位置,search是在字符串全局匹配第一個符合規(guī)則的。 38、什么是正則的貪婪匹配? >>>re.search('ab*c', 'abcaxc') <_sre.SRE_Match object; span=(0, 3), match='abc'> >>>re.search('ab\D+c', 'abcaxc') <_sre.SRE_Match object; span=(0, 6), match='abcaxc'> 貪婪匹配:正則表達(dá)式一般趨向于最大長度匹配,也就是所謂的貪婪匹配。 非貪婪匹配:就是匹配到結(jié)果就好,就少的匹配字符。 39、求結(jié)果:? a. [ i % 2 for i in range(10) ]? b. ( i % 2 for i in range(10) ) >>>a = [ i % 2 for i in range(10)] >>>a [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] >>>b= ( i % 2 for i in range(10) ) >>>b #是生成器表達(dá)式(generator)
簡單地說,就是基于已有的函數(shù)定義新的函數(shù)。 所謂高階函數(shù),就是以函數(shù)作為輸入?yún)?shù),返回也是函數(shù)。 62、列舉面向?qū)ο笾袔щp下劃線的特殊方法,如:__new__、__init__ __dict__:查出一個字典,所有實例共享的變量和函數(shù),dir()的子集 __name__:查看類的名字(這里的類名是字符串類型的) __doc__:顯示注釋 __module__:類定義所在的模塊 __init__:為對象定制自己獨(dú)有的特征 __base__:只查看從左到右繼承的第一個子類 __bases__:查看所有繼承的父類 __get__():調(diào)用一個屬性時,觸發(fā) __set__():為一個屬性賦值時,觸發(fā) __delete__():采用del刪除屬性時,觸發(fā) __getitem__(self,key):返回鍵對應(yīng)的值 __setitem__(self,key,value):設(shè)置給定鍵的值 __delitem__(self,key):刪除給定鍵對應(yīng)的元素 __str__,__repr__:改變對象的字符串顯示 __format__:自定制格式化字符串
__call__:方法由對象后加括號觸發(fā),即:對象() 或者 類()() 63、如何判斷是函數(shù)還是方法? 函數(shù):函數(shù)是封裝了一些獨(dú)立的功能,可以直接調(diào)用,python內(nèi)置了許多函數(shù),同時可以自建函數(shù)來使用。 方法:方法和函數(shù)類似,同樣封裝了獨(dú)立的功能,但是方法是需要通過對象來調(diào)用的,表示針對這個對象要做的操作,使用時采用點方法。 64、靜態(tài)方法和類方法區(qū)別? 綁定方法:綁定給誰,就應(yīng)該由誰來調(diào)用,誰來調(diào)用就會把調(diào)用者當(dāng)作第一個參數(shù)自動傳入 綁定到對象的方法:在類內(nèi)定義的沒有被任何裝飾器修飾的,自動將對象當(dāng)做第一個參數(shù)傳入(屬于類的函數(shù),類可以調(diào)用,但是必須按照函數(shù)的規(guī)則來,沒有自動傳值那么一說) 綁定到類的方法:在類內(nèi)定義的被裝飾器@classmethod修飾的方法。自動將類當(dāng)做第一個參數(shù)傳入(其實對象也可以調(diào)用,但仍將類作為第一個參數(shù)傳入) 非綁定方法:在類中用@staticmethod裝飾器裝飾的方法。不與類或?qū)ο蠼壎ǎ惡蛯ο蠖伎梢哉{(diào)用,但是沒有自動傳值那么一說。 65、列舉面向?qū)ο笾械奶厥獬蓡T以及應(yīng)用場景 1. __doc__ #輸出:類的描述信息 2. __module__ 和 __class__ __module__ 表示當(dāng)前操作的對象在那個模塊 __class__ 表示當(dāng)前操作的對象的類是什么 3. __init__ 構(gòu)造方法,通過類創(chuàng)建對象時,自動觸發(fā)執(zhí)行。 4. __del__ 析構(gòu)方法,當(dāng)對象在內(nèi)存中被釋放時,自動觸發(fā)執(zhí)行。 5. __call__ 對象后面加括號,觸發(fā)執(zhí)行。即: 對象() 或 類()() class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 執(zhí)行 __init__ obj() # 執(zhí)行 __call__ 6. __dict__ 類或?qū)ο笾械乃谐蓡T 7. __str__ 如果一個類中定義了__str__方法,那么在打印 對象 時,默認(rèn)輸出該方法的返回值。 8. __getitem__ __setitem__ __delitem__ 類似字典一樣索引的操作,以上分別表示獲取,設(shè)置,刪除。(當(dāng)在類外面做了這些操作后觸發(fā)這些函數(shù),甚至可刪除不存在的數(shù)據(jù)) class Foo(object): def __getitem__(self, key): print('__getitem__',key) def __setitem__(self, key, value): print('__setitem__',key,value) def __delitem__(self, key): print('__delitem__',key) obj = Foo() result = obj["k1"] # 自動觸發(fā)執(zhí)行 __getitem__ obj['k2'] = 'wupeiqi' # 自動觸發(fā)執(zhí)行 __setitem__ del obj['k1'] # 自動觸發(fā)執(zhí)行 __delitem__ __getitem__ k1 __setitem__ k2 wupeiqi __delitem__ k1 9. __new__ 用來將類實例化的 def __new__(cls,*args,**kwargs): #重構(gòu)__new__方法:在實例化之前做些事情 print("Foo --new--") return object.__new__(cls) #繼承父類的__new__方法(此時cls是一個對象) 66、1、2、3、4、5 能組成多少個互不相同且無重復(fù)的三位數(shù) li = [1, 2, 3, 4, 5] new_li = [] for i in li : for j in li: for m in li: if i != j and i != m and j != m: num_str = str(i)+str(j)+str(m) num = int(num_str) new_li.append(num) new_set = set(new_li) new_list = list(new_set) new_list.sort() print(new_list) print(len(new_list)) # 60 5*4*3 67、什么是反射?以及應(yīng)用場景? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力(自省)。 python面向?qū)ο笾械姆瓷洌和ㄟ^字符串的形式操作對象相關(guān)的屬性。python中的一切事物都是對象(都可以使用反射) 四個實現(xiàn)反射的函數(shù): hasattr(object,name) # 判斷object中有沒有一個name字符串對應(yīng)的方法或?qū)傩?getattr(object, name, default=None) # 獲取屬性 setattr(x, y, v) # 設(shè)置屬性 delattr(x, y) # 刪除屬性 實現(xiàn)可插拔機(jī)制,常用于web框架的CBV配置文件獲取類。 68、metaclass作用?以及應(yīng)用場景?*** 元類是類的類,是類的模板。 元類作用:是控制如何創(chuàng)建類的,正如類是創(chuàng)建對象的模板一樣,而元類的主要目的是為了控制類的創(chuàng)建行為。 69、用盡量多的方法實現(xiàn)單例模式。 # 單例:即單個實例,指的是同一個類實例化多次的結(jié)果指向同一個對象,用于節(jié)省內(nèi)存空間 # 如果我們從配置文件中讀取配置來進(jìn)行實例化,在配置相同的情況下,就沒必要重復(fù)產(chǎn)生對象浪費(fèi)內(nèi)存了 #settings.py文件內(nèi)容如下 HOST='1.1.1.1' PORT=3306 #方式一:定義一個類方法實現(xiàn)單例模式 import settings class Mysql: __instance=None def __init__(self,host,port): self.host=host self.port=port @classmethod def singleton(cls): if not cls.__instance: cls.__instance=cls(settings.HOST,settings.PORT) return cls.__instance obj1=Mysql('1.1.1.2',3306) obj2=Mysql('1.1.1.3',3307) print(obj1 is obj2) #False obj3=Mysql.singleton() obj4=Mysql.singleton() print(obj3 is obj4) #True #方式二:定制元類實現(xiàn)單例模式 import settings class Mymeta(type): def __init__(self,name,bases,dic): #定義類Mysql時就觸發(fā) # 事先先從配置文件中取配置來造一個Mysql的實例出來 self.__instance = object.__new__(self) # 產(chǎn)生對象 self.__init__(self.__instance, settings.HOST, settings.PORT) # 初始化對象 # 上述兩步可以合成下面一步 # self.__instance=super().__call__(*args,**kwargs) super().__init__(name,bases,dic) def __call__(self, *args, **kwargs): #Mysql(...)時觸發(fā) if args or kwargs: # args或kwargs內(nèi)有值 obj=object.__new__(self) self.__init__(obj,*args,**kwargs) return obj return self.__instance class Mysql(metaclass=Mymeta): def __init__(self,host,port): self.host=host self.port=port obj1=Mysql() # 沒有傳值則默認(rèn)從配置文件中讀配置來實例化,所有的實例應(yīng)該指向一個內(nèi)存地址 obj2=Mysql() obj3=Mysql() print(obj1 is obj2 is obj3) obj4=Mysql('1.1.1.4',3307) #方式三:定義一個裝飾器實現(xiàn)單例模式 import settings def singleton(cls): #cls=Mysql _instance=cls(settings.HOST,settings.PORT) def wrapper(*args,**kwargs): if args or kwargs: obj=cls(*args,**kwargs) return obj return _instance return wrapper @singleton # Mysql=singleton(Mysql) class Mysql: def __init__(self,host,port): self.host=host self.port=port obj1=Mysql() obj2=Mysql() obj3=Mysql() print(obj1 is obj2 is obj3) #True obj4=Mysql('1.1.1.3',3307) obj5=Mysql('1.1.1.4',3308) print(obj3 is obj4) #False 70、裝飾器的寫法以及應(yīng)用場景。 import datetime def log(func): # 裝飾器接受一個函數(shù)作為參數(shù),并返回一個函數(shù) def wrapper(*args, **kw): print('call %s(): ' % func.__name__) return func(*args, **kw) return wrapper @log # 運(yùn)用@語法把裝飾器放置在函數(shù)定義處 def now(): print(datetime.datetime.now()) now() """ call now(): 2018-03-20 23:00:05.201096 """ # 應(yīng)用場景:Django的csrf,緩存,登錄認(rèn)證,F(xiàn)alsk中的許多裝飾器 71、異常處理寫法以及如何主動跑出異常(應(yīng)用場景) try: """執(zhí)行語句""" except: #異常類型 """觸發(fā)異常后執(zhí)行的語句""" finally: """有沒有異常都執(zhí)行的語句""" # 主動拋出異常 raise #異常類實例 72、什么是面向?qū)ο蟮膍ro 對于你定義的每一個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的所有基類的線性順序列表。 python會在MRO列表上從左到右開始查找基類,直到找到第一個匹配這個屬性的類為止。 73、isinstance作用以及應(yīng)用場景? isinstance(obj,cls)檢查obj是否是類 cls 的對象 74、寫代碼并實現(xiàn): Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice. Example:? Given nums = [2, 7, 11, 15], target = 9, ?Because nums[0] + nums[1] = 2 + 7 = 9,? return [0, 1] 75、json序列化時,可以處理的數(shù)據(jù)類型有哪些?如何定制支持datetime類型? json只能支持int\str\list\tuple\dict import json, datetime from json import JSONEncoder class ComplexEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') else: return super(ComplexEncoder, self).default(obj) d = {'name': 'alex', 'data': datetime.datetime.now()} print(json.dumps(d, cls=ComplexEncoder)) # {"name": "alex", "data": "2018-09-28 14:49:42"} 76、json序列化時,默認(rèn)遇到中文會轉(zhuǎn)換成unicode,如果想要保留中文怎么辦? import json a = json.dumps({"ddf": "你好"}, ensure_ascii=False) print(a) # {"ddf": "你好"} 77、什么是斷言?應(yīng)用場景? assert斷言——聲明其布爾值必須為真判定,發(fā)生異常則為假。 info = {} info['name'] = 'egon' info['age'] = 18 # if 'name' not in info: # raise KeyError('必須有name這個key') # # if 'age' not in info: # raise KeyError('必須有age這個key') # 用assert取代上述代碼: assert ('name' in info) and ('age' in info) 設(shè)置一個斷言目的就是要求必須實現(xiàn)某個條件。 78、有用過with statement嗎?它的好處是什么? with語句的作用是通過某種方式簡化異常處理,它是所謂的上下文管理器的一種 用法舉例如下: with open('output.txt', 'w') as f: f.write('Hi there!') 當(dāng)你要成對執(zhí)行兩個相關(guān)的操作的時候,這樣就很方便,以上便是經(jīng)典例子,with語句會在嵌套的代碼執(zhí)行之后,自動關(guān)閉文件。
這種做法的還有另一個優(yōu)勢就是,無論嵌套的代碼是以何種方式結(jié)束的,它都關(guān)閉文件。
如果在嵌套的代碼中發(fā)生異常,它能夠在外部exception handler catch異常前關(guān)閉文件。
如果嵌套代碼有return/continue/break語句,它同樣能夠關(guān)閉文件。 79、使用代碼實現(xiàn)查看列舉目錄下的所有文件。 import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) print(BASE_DIR) print(os.listdir(BASE_DIR)) """ /Users/hqs/PycharmProjects/日常練習(xí) ['字符串倒序.py', '學(xué)生類統(tǒng)計實例化個數(shù).py', '類計算器.py', '生成器日志調(diào)用.py', 'lamba_test.py'] """ 80、簡述 yield和yield from關(guān)鍵字。 當(dāng)一個函數(shù)中出現(xiàn)yield關(guān)鍵字的時候,那么這個函數(shù)就是一個生成器(generator)。 函數(shù)轉(zhuǎn)化為generator后,在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行。 yield from iterable就是for item in iterable: yield item的語法糖。 注意yield from 后面一定是可迭代對象(iterable)。
Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。