史上最全python面試題詳解(三)(附帶詳細答案(關注、持續更新))


38、面向對象深度優先和廣度優先是什么?

 

 

39、面向對象中super的作用?

40、是否使用過functools中的函數?其作用是什么?

1 Python自帶的 functools 模塊提供了一些常用的高階函數,也就是用於處理其它函數的特殊函數。換言之,就是能使用該模塊對可調用對象進行處理。
2 
3 functools模塊函數概覽
4 functools.cmp_to_key(func)
5 functools.total_ordering(cls)
6 functools.reduce(function, iterable[, initializer])
7 functools.partial(func[, args][, *keywords])
8 functools.update_wrapper(wrapper, wrapped[, assigned][, updated])
9 functools.wraps(wrapped[, assigned][, updated])

41、列舉面向對象中帶雙下划線的魔術方法?

1. init()

2. del()

1 在調用del方法的時候,實際使用的是del()
2 
3 class Person(object):
4     def __del__(self):
5         print('我給干掉啦')
6     
7 bill = Person()
8 del bill #我給干掉啦

3. new()

 1 new()只有繼承自objectd的類才有new()這方法是在init()之前調用的,用於生成實例對象。多用於設計模式中的單例模式。單例模式是為了確保類有且只有一個對象。多用於日志記錄和數據庫操作,打印機后台處理程序。這樣子可以避免對統一資源產生相互沖突的請求
 2 new()負責創建一個類的對象,init()方法負責對創建后的類對象進行默認設置
 3 class Singleton(object):
 4     def __new__(cls):
 5         if not hasattr(cls, 'instance'):
 6             cls.instance = super(Singleton, cls).__new__(cls)
 7         return cls.instance
 8 
 9 s = Singleton()
10 print('Object created', s)
11 s1 = Singleton()
12 print('Object created', s1)
13 
14 # output
15 # Object created <__main__.Singleton object at 0x0000018EFF662DA0>
16 # Object created <__main__.Singleton object at 0x0000018EFF662DA0>
17 
18 cls是當前類,new()返回的是一個實例,和init()中的self是同一個東西

42、如何判斷是函數還是方法?

一般情況下,單獨寫一個def func():表示一個函數,如果寫在類里面是一個方法。但是不完全准確。

1 class Foo(object):
2     def fetch(self):
3         pass
4 
5 print(Foo.fetch)   # 打印結果<function Foo.fetch at 0x000001FF37B7CF28>表示函數
6 # 如果沒經實例化,直接調用Foo.fetch()括號里要self參數,並且self要提前定義
7 obj = Foo()
8 print(obj.fetch)  # 打印結果<bound method Foo.fetch of <__main__.Foo object at 0x000001FF37A0D208>>表示方法

43、面向對象中的property屬性、類方法、靜態方法?

property屬性:

類方法:

 

靜態方法:

 44、列舉面向對象中的特殊成員以及應用場景

 1 1. __doc__
 2     表示類的描述信息
 3 class Foo:
 4     """ 描述類信息,這是用於看片的神奇 """
 5     def func(self):
 6         pass
 7 print Foo.__doc__
 8  
 9 ==============
10  描述類信息,這是用於看片的神奇
1 2. __module____class__ 
2  __module__ 表示當前操作的對象在哪個模塊
3    __class__     表示當前操作的對象的類是什么
1 3. __init__
2 構造方法,通過類創建對象時,自動觸發執行。
1 4. __del__
2 析構方法,當對象在內存中被釋放時,自動觸發執行。
3 
4 注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。
5. __call__
  對象后面加括號,觸發執行。
 
注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對於 __call__ 方法的執行是由對象后加括號觸發的,即:對象() 或者 類()()
6. __dict__ 
  類或對象中的所有成員
7. __str__
如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值。

8、__eq__

 

45、什么是反射?以及應用場景?

46、用盡量多的方法實現單例模式。

一、模塊單例

Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。

1 #foo1.py
2 class Singleton(object):
3     def foo(self):
4         pass
5 singleton = Singleton()
6 
7 #foo.py
8 from foo1 import singleton

二、靜態變量方法

先執行了類的__new__方法(我們沒寫時,默認調用object.__new__),實例化對象;然后再執行類的__init__方法,對這個對象進行初始化,所有我們可以基於這個,實現單例模式。

 1 class Singleton(object):
 2     def __new__(cls,a):
 3         if not hasattr(cls, '_instance'):
 4             cls._instance = object.__new__(cls)
 5         return cls._instance
 6     def __init__(self,a):
 7         self.a = a
 8     def aa(self):
 9         print(self.a)
10 
11 a = Singleton("a")

47、裝飾器的寫法以及應用場景。

48、異常處理寫法以及如何主動跑出異常(應用場景)

49、isinstance作用以及應用場景?

50、json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?

 1 官方文檔中的一個Demo:
 2 >>> import json
 3  
 4 >>> class ComplexEncoder(json.JSONEncoder):
 5 ...     def default(self, obj):
 6 ...         if isinstance(obj, complex):
 7 ...             return [obj.real, obj.imag]
 8 ...         return json.JSONEncoder.default(self, obj)
 9 ...
10 >>> dumps(2 + 1j, cls=ComplexEncoder)
11 '[2.0, 1.0]'
12 >>> ComplexEncoder().encode(2 + 1j)
13 '[2.0, 1.0]'
14 >>> list(ComplexEncoder().iterencode(2 + 1j))
15 ['[', '2.0', ', ', '1.0', ']']
16  
 1 然后簡單擴展了一個JSONEncoder出來用來格式化時間
 2 class CJsonEncoder(json.JSONEncoder):
 3  
 4     def default(self, obj):
 5         if isinstance(obj, datetime):
 6             return obj.strftime('%Y-%m-%d %H:%M:%S')
 7         elif isinstance(obj, date):
 8             return obj.strftime('%Y-%m-%d')
 9         else:
10             return json.JSONEncoder.default(self, obj)
11  
1 使用時候只要在json.dumps增加一個cls參數即可:
2 
3 json.dumps(datalist, cls=CJsonEncoder)

51、json序列化時,默認遇到中文會轉換成unicode,如果想要保留中文怎么辦?

52、使用代碼實現查看列舉目錄下的所有文件。

1 import os
2 
3 if __name__ == '__main__':
4     work_dir = 'C:\Program Files\MySQL\Connector ODBC 8.0'
5     for parent, dirnames, filenames in os.walk(work_dir, followlinks=True):
6         for filename in filenames:
7             file_path = os.path.join(parent, filename)
8             print('文件名:%s' % filename)
9             print('文件完整路徑:%s\n' % file_path)

53、簡述 yield和yield from關鍵字。

1、可迭代對象與迭代器的區別

可迭代對象:指的是具備可迭代的能力,即enumerable.  在Python中指的是可以通過for-in 語句去逐個訪問元素的一些對象,比如元組tuple,列表list,字符串string,文件對象file 等。

迭代器:指的是通過另一種方式去一個一個訪問可迭代對象中的元素,即enumerator。在python中指的是給內置函數iter()傳遞一個可迭代對象作為參數,返回的那個對象就是迭代器,然后通過迭代器的next()方法逐個去訪問。

1 from collections import Iterable
2 
3 li=[1,4,2,3]
4 iterator1 = iter(li)
5 print(next(iterator1))
6 print(next(iterator1))
7 print(next(iterator1))
8 print(isinstance(iterator1,Iterable)) # 判斷是否是迭代器,導入collection模塊
>>>
1 4 2 True

2、生成器

生成器的本質就是一個逐個返回元素的函數,即“本質——函數”

最大的好處在於它是“延遲加載”,即對於處理長序列問題,更加的節省存儲空間。即生成器每次在內存中只存儲一個值

3、什么又是yield from呢?

簡單地說,yield from  generator 。實際上就是返回另外一個生成器。如下所示:

 1 def generator1():
 2     item = range(10)
 3     for i in item:
 4         yield i
 5 
 6 def generator2():
 7     yield 'a'
 8     yield 'b'
 9     yield 'c'
10     yield from generator1() #yield from iterable本質上等於 for item in iterable: yield item的縮寫版
11     yield from [11,22,33,44]
12     yield from (12,23,34)
13     yield from range(3)
14 
15 for i in generator2() :
16     print(i)

從上面的代碼可以看出,yield from 后面可以跟的式子有“ 生成器  元組 列表等可迭代對象以及range()函數產生的序列”

上面代碼運行的結果為:

a
b
c
0
1
2
3
4
5
6
7
8
9
11
22
33
44
12
23
34
0
1
2

請關注,未完待續!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM