歡迎光臨
每天分享高質量文章

Python面試攻略(嗨談篇)

來源:DataCastle資料城堡(ID:DataCastle2016)

寫在前面

千呼萬喚始出來,咱們需要的面試檔案終於整理出來啦!這一次,為大家送上的是python面試題之基礎概念篇。透過對十幾份面試題目的整理,我們選出了其中出現頻率最高的十個題目,附上答案供各位小夥伴參考!

1.*args和**kwargs是什麼意思?

答:*args表示可變引數(variadic arguments),它允許你傳入0個或任意個無名引數,這些引數在函式呼叫時自動組裝為一個tuple; **kwargs表示關鍵字引數(keyword arguments),它允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。同時使用*args和**kwargs的時候,必須保證*args在**kwargs之前。

擴充套件閱讀:

https://blog.csdn.net/mbugatti/article/details/53884455

2.python裡面如何複製一個物件?

答:                                    

(1) 賦值(=),就是建立了物件的一個新的取用,修改其中任意一個變數都會影響到另一個;

(2)淺複製(copy.copy()),建立一個新的物件,但它包含的是對原始物件中包含項的取用(如果用取用的方式修改其中一個物件,另一個也會被改變);

(3)深複製(copy.deepcopy()),建立一個新的物件,並且遞迴的複製它所包含的物件(修改其中一個,另一個不會改變)

註意:並不是所有的物件都可以複製

擴充套件閱讀:

http://www.cnblogs.com/wilber2013/p/4645353.html

3.簡要描述python的垃圾回收機制

答:python中的垃圾回收是以取用計數為主,標記-清除和分代收集為輔。

 

取用計數:python在記憶體中儲存每個物件的取用計數,如果計數變成0,該物件就會消失,分配給該物件的記憶體就會釋放出來。

標記-清除:一些容器物件,比如說list、dict、tuple、instance等可能會出現取用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間透過取用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而取用關係構成這個有向圖的邊)。

分代收集:python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。

擴充套件閱讀:

https://www.jianshu.com/p/1e375fb40506

4.什麼是lambda函式?它有什麼好處?

答:lambda運算式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式。

 

Python允許你定義一種單行的小函式。定義lambda函式的形式如下(lambda引數:運算式)lambda函式預設傳回運算式的值。你也可以將其賦值給一個變數。lambda函式可以接受任意個引數,包括可選引數,但是運算式只有一個。

擴充套件閱讀:

https://www.zhihu.com/question/20125256

5.python如何實現單例樣式?

答:單例樣式是一種常用的軟體設計樣式。在它的核心結構中只包含一個被稱為單例類的特殊類。透過單例樣式可以保證系統中一個類只有一個單例而且該單例易於外界訪問,從而方便對實體個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例樣式是最好的解決方案。

 

__new__()在__init__()之前被呼叫,用於生成實體物件。利用這個方法和累的屬性的特點可以實現設計樣式的單例樣式。單例樣式是指建立唯一物件,單例樣式設計的類只能實體。

1.使用__new__方法

class Singleton(object):
  def __new__(cls, *args, **kw):
      if not hasattr(cls, '_instance'):
          orig = super(Singleton, cls)
          cls._instance = orig.__new__(cls, *args, **kw)
      return cls._instance

class MyClass(Singleton):
  a = 1

2.共享屬性

class Borg(object):
  _state = {}
  def __new__(cls, *args, **kw):
      ob = super(Borg, cls).__new__(cls, *args, **kw)
      ob.__dict__ = cls._state
      return ob

class MyClass2(Borg):
  a = 1

3.裝飾器版本

def singleton(cls, *args, **kw):
  instances = {}
  def getinstance():
      if cls not in instances:
          instances[cls] = cls(*args, **kw)
      return instances[cls]
  return getinstance

@singleton
class MyClass:
...

4.import方法

class My_Singleton(object):
  def foo(self):
      pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()

擴充套件閱讀:

https://blog.csdn.net/sirodeng/article/details/17426543

6.python自省

答:自省就是面向物件的語言所寫的程式在執行時,所能知道物件的型別,簡單一句就是執行時能夠獲得物件的型別,比如type(),dir(),getattr(),hasattr(),isinstance().

a = [1,2,3]
b = {'a':1,'b':2,'c':3}
c = True
print type(a),type(b),type(c) # <type 'list'> <type 'dict'> <type 'bool'>
print isinstance(a,list)  # True

擴充套件閱讀:

https://kb.cnblogs.com/page/87128/

7.談一談python的裝飾器

答:裝飾器本質上是一個python函式,它可以讓其他函式在不作任何變動的情況下增加額外功能,裝飾器的傳回值也是一個函式物件。它經常用於有切麵需求的場景。比如:插入日誌、效能測試,事務處理、快取、許可權驗證等。有了裝飾器我們就可以抽離出大量的與函式功能無關的雷同程式碼進行重用。

擴充套件閱讀:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

8.什麼是鴨子型別?

答:在鴨子型別中,關註的不是物件的型別本身,而是他如何使用的。例如,在不適用鴨子型別的語言中,我們可以編寫一個函式,它接受一個型別為鴨的物件,並呼叫它的走和叫方法。在使用鴨子型別的語言中,這樣的一個函式可以接受一個任意型別的物件,並呼叫它的走和叫方法。

class duck():
  def walk(self):
      print('I am duck,I can walk...')
  def swim(self):
      print('I am duck,I can swim...')
  def call(self):
      print('I am duck,I can call...')

duck1=duck()
duck1.walk()
    # I am duck,I can walk...
duck1.call()      # I am duck,I can call...

擴充套件閱讀:

https://blog.csdn.net/handsomekang/article/details/40270009

9.@classmethod和@staticmethod

答:@classmethod修飾符對應的函式不需要實體化,不需要self引數,第一個引數需要是表示自身類的cls引數,cls引數可以用來呼叫類的屬性,類的方法,實體化物件等。@staticmethod傳回函式的靜態方法,該方法不強制要求傳遞引數,如下宣告一個靜態方法:

 

Class C(object):

@staticmethod

Def f(arg1, arg2,…):

以上實體宣告了靜態方法f,類可以不用實體化就可以呼叫該方法C.f(),也可以實體化後呼叫C().f()。

擴充套件閱讀:

https://zhuanlan.zhihu.com/p/28010894

10.談一談python中的元類 

答:一般來說,我們都是在程式碼裡定義類,用定義的類來建立實體。而使用元類,步驟又是同,定義元類,用元類建立類,再使用創建出來的類來建立實體。元類的主要目的就是為了當建立類時能夠自動地改變類。

擴充套件閱讀:

https://blog.csdn.net/wenyu826/article/details/66972933

請輸入標題     bcdef

本文參考檔案:

1.      github“hackerxu”:關於Python的面試題

2.      知乎專欄“python爬蟲實戰”:python面試指南

3.      51CTO“老男孩python”:2018python面試必看的10個問題及答案

4.      老左的部落格:python面試必須要看的15個問題

5.      CSDN“劉元濤”:python工程師面試題集合

6.      知乎“路人甲”:常見的面試題整理——python概念篇

請輸入標題     abcdefg

如果你在面試中也曾遇到過一些讓你“眼前一亮”的經典題目,或者,那些年你也有關於面試的難(cao)忘(dan)回憶,歡迎留言討論!


●編號439,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

演演算法與資料結構

更多推薦18個技術類公眾微信

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂