你應該知道的 30個python 的面試問題

原文: http://www.techbeamers.com/python-interview-questions-programmers/#q1

1. python 是什麼? 使用python 有哪些好處? 你理解 PEP 8?

Python 是最成功的解釋性語言之一, 當你寫一個python 腳本的時候, 它是不需要編譯的。 其它的解釋性語言有php 和 javascript.

Python 程序的好處

    Python 是一種動態類型的語言, 這就是說在你使用變量的時候,你不需要聲明(定義)變量類型。它允許你直接對一個變量賦值, 就像 var1 = 101, var2 ='You are an engineer', 沒有任何錯誤

    Python 支持面向對象編程, 你可以使用類的繼承特性和(composition)定義一個類(class). 它不使用像 public, private 這樣的訪問限制符。

    Python 中的函數就像類的實例一樣, 你可以把它賦值給變量, 從其他函數返回 和 作爲參數傳遞給其他函數。

   用python 開發是非常快的, 但是它的執行速度要比編譯性語言慢一些。 幸運的是, python 可以使用 C 語言寫的的擴展程序,這樣的話,如果你對執行速度要求比較高,可以用這種方式優化你的python 腳本。

    Python 有很多用途, 它可以編寫 基於web 的程序, 測試自動化, 數據建模,大數據分析 等等。你還可以把它作爲一個“膠水” 同其它語言一起工作。

PEP 8 是python 最近發佈的 一套推薦編碼標準,它可以指導python 代碼的易讀性。

2.  下面的Python 代碼片段會輸出什麼? 請給出您的答案。

def extendList(val, list=[]):
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

這是 上面代碼片段的輸出結果

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

你或許錯誤的認爲 list1 等於 [10],  並且 list3 等於 [a], 你應該在想,每次調用extendList, 都會用[] 初始化 list .

其實,過程是這樣的,參數 list 就像在 這個函數定義的時候就創建了, 所以當以當你調用這個函數,如果沒有傳遞給list 一個參數,它會一直用這個默認的list.  所以你可以認爲list 的默認值是在函數定義的時候創建的,而不是在調用的時候。

我們可以修改一下extendList 函數, 用下面的方式定義她

def extendList(val, list=None):
  if list is None:
    list = []
  list.append(val)
  return list

這是修改後的輸出結果

list1 = [10]
list2 = [123]
list3 = ['a']

3.  如果程序中要求什麼也不做,但是要符合語法,在python 中可以用什麼語句實現?

    是 pass , 它是一個空操作, 執行的時候不做任何事情。  注意python 是區分大小寫的, 如果你寫錯成Pass, 將會有一個NameError 的錯誤。

  試一下這段代碼會輸出什麼

letter = "hai sethuraman"
for i in letter:
    if i == "a":
        pass
        print("pass statement is execute ..............")
    else:
        print(i)

4. 用一個標準庫裏的函數,傳入參數‘~’, 然後輸出當前用戶的目錄, 這個函數是什麼?

   你需要導入os module,  然後用一行代碼就可以搞定了。自己試一下會輸出什麼

import os
print (os.path.expanduser('~'))

5.   請列出python 中有哪些可用的內置類型?

  這裏列出了最常用的python 中的內置類型

   不可變的內置類型

Numbers
Strings
Tuples
 可變的內置類型

  

List
Dictionaries
Sets

6. 如何在python 的程序中找到bugs 或 執行一些靜態分析

 1, 你可以使用 PyChecker, 它是一個靜態分析工具,可以在python 項目中辨認出bugs , 並且可以揭示相關的複製的bugs

 2,   另外一個工具是Pylint, 它可以檢查python 的模塊是否滿足編碼標準。

7. 什麼時候使用python 的裝飾器?

  Python 裝飾器是python 的一種語法,爲了快速調整函數做的一些相對修改。

Python decorator is a relative change that you do in Python syntax to adjust the functions quickly.

8. List 和 Tuple 的主要不同是什麼?

    List  和 Tuple 的主要不同點是,list 是可變列表, tuple 不是。 tuple 是允許被進行哈希處理的,例如,它可以作爲一個字典的 key

9.  Python 是怎麼對內存進行管理的?

1, python 用私有堆來維護它的內存的, 所以這個堆包含所有的python 對象 和數據結構, 這個區域只能被python 解釋器訪問, 程序員是不能使用它的。

2,python 的內存管理器負責管理私有堆, 它會爲python 對象分配空間。

3,python 使用一個內置的垃圾回收器, 它會回收所有的不再使用的內存,並釋放給堆空間。

10. Lambda 和 def 的主要區別是什麼?

  1. def 能夠保護多個表達式, lambda 只是一個表達式函數

  2. def 定義一個函數,並給這個函數指定一個名詞,以便以後調用它;  lambda 構成一個函數,只能作爲一個函數返回。

  3. def 能夠返回一個語句, lambda 不能

  4. lambda 支持在列表和字段內使用

11. 使用python 的 Reg 表達式模塊<Re> 寫一個驗證郵箱地址的正則表達式

    python 的正則表達式模塊是 re   

import re
print(re.search(r"[0-9a-zA-Z.]+@[a-zA-Z]+\.(com|co\.in)$","[email protected]"))

12. 請考慮下面的代碼片段輸出什麼?  這段代碼又錯誤?

list = ['a', 'b', 'c', 'd', 'e']
print (list[10:])

上面代碼的結果是 [],  不會有任何錯誤,像 IndexError

你應該知道,當你嘗試從一個列表獲取一個索引超過列表大小的成員時(例如, 在上面的問題裏,嘗試用訪問ist[10])將產生一個IndexError. 順便提一下,當你從一個列表檢索一個開放索引的切片時,並且索引超出了列表裏的成員數量, 不會導致IndexError,  它將返回空的列表。

13. 在python 裏 有 switch 或者 case 這樣的語句嗎?  如果沒有, 原因是什麼?

  沒有, python 沒有 switch 語句。  但是你可以自己寫一個switch 函數

14. Python 中用哪個內置函數迭代一個數字序列

 range() 可以生成一個數字列表, 它經常用在循環語句中

for i in range(5):
    print(i)

range() 函數有伴隨兩套參數

1. range(stop)

    stop:  它是一個用於生成整數個數的值, 從0開始。 例如 range(3) == [0,1,2]

 2. range(start,stop [,step])

    start: 它是數字序列的起始值

    stop: 它指出了這個序列的上限

    step: 它是一個生成序列的增量因數

 3. 需要注意的有:

      只允許整數參數

      參數可以是正數,也可是負數

      range() 函數的索引是從0開始的

15.  python 中的 try-except 語句有哪些可選的語句?

   有 2 個可選的條件,你可以在try-except 中使用

  1 . else 

      如果你想在try-except 中,沒有異常發生時執行一段代碼, else 條件是有用的。

  2. finally 

      如果你想在try -except 中,無論有沒有異常發生,都要執行一段代碼,finally 條件是有用的。

16. python 中怎麼使用三元運算符

    三元運算符是條件語句中的一個選擇, 它組合了true 和 false 在一個語句中, 它的語法就像下面給出這這樣

   【oneTrue】if 【Condition】 else 【onFalse】   

x, y = 35, 75
smaller = x if x < y else y
print(smaller)

17. <self> 關鍵字是做什麼用的?

   <self> 關鍵字就是一個變量,它表示一個對象的實例。 幾乎所有面向對象的語言中,它被作爲隱藏參數傳遞給方法。

18. python 中有什麼方法可以複製一個對象

    有2個方法

  函數   copy.copy()    

   函數 copy.deepcopy()

19.  python 中 Doc Strings 的目的是什麼?

    python 中, 文檔字符串被稱爲 doc strings,  它是用來解釋函數,模塊和類的


20. 哪個python 函數可以將一個數字轉換爲字符串 ?

      爲了將數字轉換爲字符串, 你可以用內置的 str() 函數, 如果你想要一個八進制或十六進制, 可以用內置函數oct() 或者 hex()

21. 你怎麼調試python 程序 ? 是否可以逐步調試python 代碼 ?

     是的, 我們可以用python debugger(pdb) 調試python 程序, 如果我們用 pdb啓動一個python 程序, 它可以讓我們步進我們的代碼

22. 列出一些調試python 程序的 pdb 命令 。

    添加斷點  -b

    恢復執行 -c

    逐步調試 - s

    移動到下一行, -n

    顯示源代碼, -l

    輸出表達式 , - p

23. 調試python 程序的命令是什麼?

$ python -m pdb python-script.py

24. python 中如何監控程序代碼流?

   我們可以用 sys 模塊的 settrace() 方法 建立hooks ,並監控程序裏的函數

   你需要定義一個 跟蹤回調方法, 並把它傳遞給settrace() 方法, 這個回調函數應該說明3個參數,如下。       

import sys

def trace_calls(frame, event, arg):
    # The 'call' event occurs before a function gets executed.
    if event != 'call':
        return
    # Next, inspect the frame data and print information.
    print 'Function name=%s, line num=%s' % (frame.f_code.co_name, frame.f_lineno)
    return

def demo2():
    print 'in demo2()'

def demo1():
    print 'in demo1()'
    demo2()

sys.settrace(trace_calls)
demo1()

25. 爲什麼 和 什麼時候使用生成器 ?

     在python 中, 生成器是一個函數, 它返回一個可迭代的對象。 我們可以用 yield 關鍵字在一個生成器上迭代。 但是我們只能做一次,因爲他們的的值不會在內存持久化,they get the values on the fly.

生成器可以讓我們保持一個函數的執行結果, 或者說只要我們想保持它。 然而, 這裏是一些例子,哪裏是推薦用生成器的

1. 當我們要計算一個大的數據集時, 我們可以用生成器替代循環。

2. 當我們只希望得到一個結果的部分數據時, 生成器也是很有用的。

3. 我們還可以用生成器替代回調函數, 我們可以在一個函數中,寫一個循環做回調函數同樣的事情,把它變成一個生成器。


26. yield 關鍵字是做什麼用的?

yield 可以把任何函數變成生成器, 它就像一個標準返回語句。 但是它總是返回一個生成器對象。 並且,一個函數可以調用多次yield 關鍵字

看下面這個例子

def testgen(index):
  weekdays = ['sun','mon','tue','wed','thu','fri','sat']
  yield weekdays[index]
  yield weekdays[index+1]

day = testgen(0)
print next(day), next(day)

#output: sun mon

27. 怎麼可以把一個list 轉換成其它數據類型?

有些時候, 我們不需要使用list作爲一個list, 所以,我們必須把它轉換成其它類型。

把 list 轉換成一個字符串

我們可以用  join 方法, 它可以組合所有list 元素到一個字符串,並返回這個字符串

weekdays = ['sun','mon','tue','wed','thu','fri','sat']
listAsString = ' '.join(weekdays)
print(listAsString)

#output: sun mon tue wed thu fri sat

把 list 轉換成一個元組(tuple)

用  tuple() 函數 將一個list 轉換成元組, 這個函數用list 作爲它的參數, 

weekdays = ['sun','mon','tue','wed','thu','fri','sat']
listAsTuple = tuple(weekdays)
print(listAsTuple)

#output: ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat')

把list 轉換成一個集合(set)

 你可以用set() 函數轉換一個list 到 set

把 list 轉換成字典

在字典裏,每個元素代表一個鍵值對, 所以,不能直接把list 像其他類型一樣直接轉換成字典, 你需要給list中的元素指定一個鍵值

weekdays = ['sun','mon','tue','wed','thu','fri']
listAsDict = dict(zip(weekdays,weekdays))
print(listAsDict)

#output: {'sun': 'sun', 'mon': 'mon', 'tue': 'tue', 'wed': 'wed', 'thu': 'thu', 'fri': 'fri'}

28. 怎樣計算一個元素在列表裏出現的次數 ?

       不像 集合, 列表(list), 可以有相同的值, 在python 中, list 有一個 count() 方法, 它可以返回一個指定元素出現的次數

weekdays = ['sun','mon','tue','wed','thu','fri','sun','mon','mon']
print(weekdays.count('mon'))

#output: 3

計算每個元素在列表裏出現的次數

weekdays = ['sun','mon','tue','wed','thu','fri','sun','mon','mon']
print([[x,weekdays.count(x)] for x in set(weekdays)])

#output: [['wed', 1], ['sun', 2], ['thu', 1], ['tue', 1], ['mon', 3], ['fri', 1]]

29.  NumPy 是什麼 ? 在python 中它如何比list 更好

    NumPy 是一個 用於科學計算的 python 包, 它可以處理大的數據集,它包含一個強大的多維數組對象和一套高級函數。

   當然, NumPy 中的數據是優於內置的list 類型的, 有許多地方可以說明這一點。

    NumPy 數組比 list 更緊湊

    讀寫元素快

    NumPy 比 list 使用更方便

   Numpy 數組更有效當它作爲一個list 函數的參數時


30. 有哪些方法可以創建一個空的NumPy 數組?

    有2個方法可以創建空的NumPy 數組

    第一個

import numpy
numpy.array([])
  第二個
numpy.empty(shape=(0,0))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章