程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python面試題_第 (4) 章

編輯:Python

文章目錄

      • 1. 如何將一個二維列表通過一行代碼展開成一維列表
      • 2. 如何將python的字符串轉換為bytes類型
      • 3. 詳細的說下Python中的any和all的用法
      • 4. 如何將兩個列表轉換一個元組列表
      • 5. Python自省機制
      • 6. 列舉幾個Python常用的魔法方法並且說明它的用途
        • ① 什麼是魔法方法?
        • ② 三個最常用的跟對象的創建和銷毀有關的魔法方法
        • ③ 仿函數 `__call__()方法`
        • ④ 類的表示 `__str__`,`__repr__`

1. 如何將一個二維列表通過一行代碼展開成一維列表

  • 解析

    1. 使用雙層循環列表推導式
    2. 使用sum(iterable,start=0),注意sum函數帶有一個缺省參數,默認是0
    3. 使用numpy中的flatten()函數
    4. 使用itertools中的chain

2. 如何將python的字符串轉換為bytes類型

  • 解析

    1. 直接使用b'字符串'的形式
    2. 使用字符串.encode()方法
    3. bytes(str,encoding="utf-8")

3. 詳細的說下Python中的any和all的用法

  • any

    1. 原型 any(iterable,/),其中下劃線的作用:聲明這個函數前面的參數只能是位置參數
    2. 作用 返回True如果 bool(elem)True ,對於任意的iterable裡面的elem來說
    3. 如果是iterable是空的,則返回False

  • all(iterable,/)

    1. 返回True,如果iterable裡面的所有的elembool(elem)都返回True的時候,結果就是True
    2. 類似and的作用
    3. 注意: 如果iterable是空,則all的返回值也是True

4. 如何將兩個列表轉換一個元組列表

5. Python自省機制

  • 什麼是Python的自省機制

    1. python 在運行的時候可以獲取對象的類型和屬性
    2. python 是一門強類型的動態語言,強類型是指python很少使用隱式類型轉換,動態語言是指python在運行的餓時候允許改變對象的類型
  • dir()


    翻譯一下:

    1. dir([object]) -> 字符串列表
    2. 在沒有參數的情況下調用,返回當前作用域中的名稱
    3. 如果有參數,這個參數必須是一個對象.返回的的是對象的屬性,按照字母順序排序
    4. 如果對象重寫了__dir__()方法,則執行重寫的,否在就調用默認的dir()方法
    5. 對於模塊對象,返回模塊的屬性
    6. 對於類對象,返回類的屬性,以及父類的屬性
    7. 對於其他任何對象,返回對象屬性,類屬性和基類屬性

  • __dict__

    1. 如果是實例對象調用,則返回的是實例對象中的屬性(方法不返回),不會返回父類中的屬性
    2. 如果是類對象調用,則返回的是類對象的屬性和方法,同樣不考慮繼承關系

  • __name__

並非所有的對象都有名稱,但那些有名稱的對象都將名稱存儲在其__name__屬性中.注: 名稱是從對象而不是引用該對象的變量中派生的.


模塊擁有名稱,Python解釋器本身被認為是頂級模塊或者主模塊.當以交互的方式運行Python的時候,局部__name__變量被賦予值__main__.同樣滴,當從命令行執行Python模塊,而不是將其導入另一個模塊的時候,其__name__屬性被賦予值__main__,而不是該模塊的實際的名稱.這樣,模塊可以查看自身的__name__值來自行確定它們自己正被如何使用,是作為另一個程序的支持,還是作為從命令行執行的主應用程序.下面這種慣用的語句在Python中是很常見的:

if __name__ == "main":
# do something test
else:
# do nothing
  • type

type()函數有助於我們確定對象是何種類型,它的返回值是類型對象:

  • id(地址/標識)
    先前說過,每個對象都有標識,類型和值.值得注意的是,可能有多個變量引用同一個對象,同樣地,變量可以應用看起來相似(有相同的類型和值),單擁有截然不同標識的多個對象.當更改對象的時候,比如將某一項添加到列表,這種關於對象標識的概念尤其重要,如在下面的示例中,blistclist變量引用同一個列表對象.id()函數給任何給定對象返回唯一的標識符.

屬性
對象擁有屬性,並且dir()函數會返回這些屬性列表.但是有時候,我們只想測試1個或者多個屬性是否存在.如果對象具有我們正在考慮的屬性,那麼通常希望只檢索該屬性.這個任務可以由hasattr()getattr()函數來完成.

可調用

可以調用表示潛在的行為(函數和方法)的對象.可以用callable()函數來測試對象的可調用性:

實例
type()函數提供對象的類型的時候,也可以使用isinstance()函數測試對象,以確定它是否是某個特定類型或者定制類的實例:


子類

關於類的問題,有一個繼承的概念,有繼承就有父子問題,這是現實生活中很正常的,在變成語言中也是如此.
繼承的關系中,有一個關鍵的概念就是屬性,子類會繼承父類的屬性.那麼如果去判斷一個類是否是另外一個類的子類呢?
可以使用issubclass()來判斷,注意這裡判斷的時候,自身也是自身的子類.

下面通過一個例子來表述本文中用到的概念和知識:

有時候我們會遇到這樣的需求,需要執行對象的某個方法,或者是對對象的某個字段賦值,而這個方法名和字段名在編碼的時候並不能確定,需要通過參數傳遞字符串的形式輸入.舉個具體的例子: 當我們需要實現一個通用的DBM框架時,可能需要對數據對象的字段賦值,但我們無法預知用到這個框架的數據對象都有些什麼字段,換言之,我們在寫框架的時候需要通過某種機制訪問未知的屬性.

這個機制被稱為反射(就是由對象自己告訴我們他有哪些屬性),或者是自省(對象自己可以知道自己有哪些屬性),用於實現在運行的時候來獲取對象的信息.

1) 訪問對象的屬性

  • dir(obj)

調用這個方法可以返回包含obj大多數屬性名的列表(會有一些特殊的屬性不包含在內).obj的默認值是當前的模塊對象.

  • hasattr(obj,attr):

這個方法用於檢查obj是否有一個名為attr的值的屬性,返回一個布爾值.

  • getattr(obj,attr):

調用這個方法將返回obj中名為attr值的屬性的值,例如如果attr為bar,則返回obj.bar.

  • setattr(obj,attr,val):

調用這個方法將給obj的名為attr的值屬性賦值為val.例如如果attrbar,則相當於是obj.bar=val.

訪問對象的元數據模塊(module)

  1. __doc__: 文檔字符串.如果模塊沒有文檔,這個值是None.
  2. __name__:始終是定義時的模塊名,即使你用了import as為它取了別名,或者是賦值給另一個變量名.
  3. __dict__:包含了模塊裡可用的屬性名-屬性的字典;也就是可以使用模塊名.屬性名訪問的對象.
  4. __file__:包含了該模塊的文件路徑.需要注意的是內建的模塊沒有這個屬性,訪問它會拋出異常.


實例(instance)

實例是指類實例化之後的對象.

  • __dict__: 包含了可用的屬性名-屬性字典.
  • __class__:該實例的類對象

內建函數和方法(built-in functions and methods)

根據定義,內建(build-in)模塊是指用C寫的模塊,可以通過sys模塊的builtin_module_names字段查看都有哪些模塊是內建的.這些模塊中的函數和方法可以使用的屬性比較少,不過一般也不需要再代碼中查看它們的信息.

  • __doc__: 函數或者方法的文檔
  • __name__: 函數或者方法定義時的名字
  • __self__: 僅方法可用,如果是綁定的(bound),則指向調用該方法的類(如果是類方法)或實例(如果是實例方法),否則為None
  • __module__:函數或者方法所在的模塊名

函數(function)

這裡特指非內建函數.注意,在類中使用def定義的是方法,方法與函數雖然有相似的行為,但是他們是不同的概念.

  • __doc__: 函數的文檔,
  • __name__:函數定義時的函數名
  • __module__:包含定義該函數的模塊名,同樣注意,是模塊名而不是模塊對象.
  • __dict__: 函數的可用屬性

6. 列舉幾個Python常用的魔法方法並且說明它的用途

① 什麼是魔法方法?

首先記住關鍵記憶:

  1. __somename__ 雙下劃線開頭,雙下劃線結束的成員函數.
  2. 程序員不用調用,Python解釋器在適當的時機或者是特定的情況下自己調用.
  3. 自己的理解: 魔法方法其實就是這樣一種方法,是Python語法的一種體現,某種固定的語法在會調用特定的魔法方法.

② 三個最常用的跟對象的創建和銷毀有關的魔法方法

  • 1) __init__():

對象的創建的時候__init__()會被自動的調用,用來根據傳入的參數來初始化這個實例屬性.
它本身是一個初始化的函數,並不是構造函數.

  • 2) __new__():
  1. 對象在創建的時候首先是調用__new__()方法來創建類並返回這個類的實例.
  2. __new__至少要有一個參數cls,代表當前類,此參數在實例化的時候由Python解釋器自動識別
  3. __new__必須要有返回值,返回實例化出來的實例,這點在自己實現__new__時要特別注意,可以return父類(通過super(當前類名,cls))__new__出來實例,或者是直接是object__new__出來的實例.
  4. 如果__new__創建的是當前類的實例,會自動調用__init__函數,通過return 語句裡面調用的__new__函數的第一個參數是cls來保證是當前類的實例,如果是其他類的類名,那麼實際創建返回的就是其他類的實例,其實就不會調用當前類__init__函數,也不會嗲用其他類的_init__函數


可以看到第二個並沒有調用__init__方法,因為__new__方法沒有創建對象並且返回,所以__init__()方法對象可以進行實例化.


3) __del__ 函數

將實例化的對象銷毀,即為析構函數.
調用的時機: 當內存被回收的時候自動觸發,這裡內存被回收包括兩種情況:

  1. 頁面執行完畢回收所有的變量
  2. 所有的對象被del的時候
class Bird(object):
def __init__(self, name):
self.name = name
def fly(self):
print("{} 鳥在飛翔!".format(self.name))
def __del__(self):
print("{} 鳥已經陣亡,被析構了!".format(self.name))
dark = Bird("鴨子")
dark.fly()

結果:

所有的對象被del的時候:

③ 仿函數 __call__()方法

調用時機:

  1. 當把對象當做函數調用的時候自動觸發
  2. 可以模擬函數化操作
  3. 有點類似於在類中重載了()運算符,使得實例對象可以像調用普通的函數那樣,以對象名()的形式使用.

舉個例子:


如果要想一個類對象,可以被當成一個函數被調用就要給它定義__call__方法,比如:

可以看到,通過在Student類中實現了__call__方法,使得Student的實例對象變為了可調用對象.
Python中,凡是可以將()直接應用到自身並執行,都稱為可調用對象.可調用對象包括自定義的函數,Python內置函數以及本節所講的類實例對象.

對於可調用的對象,實際上名稱(),可以被理解成 名稱.__call__()的簡寫.依然以上面的為例子,最後一行代碼其實等價於:


然後自定義函數的例子:

④ 類的表示 __str__,__repr__

  • __str__
  1. 作用: 返回一個字符串對象,主要讓人友好的辨認的字符串
  2. 調用時機: 1> str(obj) 2> format() 3> print()
  • __repr__:
  1. 作用: 用來輸出一個對象的官方字符串形式.返回值必須是字符串對象,通常是用來給解釋器看的.
  2. 調動時機: 1> repr()內置函數調用

注意:

如果__repr__已經定義,而__str__未定義,則對象調用__str__ = __repr__.


下面如果__str__未定義的時候,則__repr__會被調用


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved