Python面試基礎篇


1. 為什什么學習Python?

  Life is short, You need Python

2. 通過什什么途徑學習的Python?

  pass

3. Python和Java、PHP、C、C#、C++等其他語⾔言的對比?

  pass

4. 簡述解釋型和編譯型編程語言?

  將由高級語言編寫的程序文件轉換為可執行文件(二進制的)有兩種方式,編譯和解釋,編譯是在程序運行前,已經將程序全部轉換成二進制碼,而解釋是在程序執行的時候,邊翻譯邊執行。

5. Python解釋器器種類以及特點?

CPython

  當 從Python官方網站下載並安裝好Python2.7后,就直接獲得了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發的,所以叫 CPython,在命名行下運行python,就是啟動CPython解釋器,CPython是使用最廣的Python解釋器。

IPython

  IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的,好比很多國產瀏覽器雖然外觀不同,但內核其實是調用了IE。

PyPy

  PyPy是另一個Python解釋器,它的目標是執行速度,PyPy采用JIT技術,對Python代碼進行動態編譯,所以可以顯著提高Python代碼的執行速度。

Jython

  Jython是運行在Java平台上的Python解釋器,可以直接把Python代碼編譯成Java字節碼執行。

IronPython

  IronPython和Jython類似,只不過IronPython是運行在微軟.Net平台上的Python解釋器,可以直接把Python代碼編譯成.Net的字節碼。

  在Python的解釋器中,使用廣泛的是CPython,對於Python的編譯,除了可以采用以上解釋器進行編譯外,技術高超的開發者還可以按照自己的需求自行編寫Python解釋器來執行Python代碼,十分的方便!

6. 位和字節的關系?

  1 字節=8位(二進制)

7. b、B、KB、MB、GB 的關系?

   1B (byte字節) =8b(比特位)
  1KB = 1024B
  1MB = 1024KB
  1GB = 1024MB

8. 請至少列舉5個 PEP8 規范(越多越好)。

  PEP8

9. 通過代碼實現如下轉換:

二進制轉換成十進制:v = “0b1111011”
     >>print(int(v,2))
十進制轉換成二進制:v = 18
      >> print(bin(int(v)))
八進制轉換成十進制:v = “011”
   >> print(int(v,8))
十進制轉換成八進制:v = 30
  >> print(oct(v))
十六進制轉換成十進制:v = “0x12”
   >>print(int(v,16))
十進制轉換成十六進制:v = 87   >>print(hex(v))

10.請編寫一個函數實現將IP地址轉換成一個整數。

如 10.3.9.12 轉換規則為:
10            00001010
 3             00000011

 9             00001001
12            00001100

再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?

def ip_to_int(s):
    
    L = '0b'+''.join([bin(int(i)) for i in s.split('.')]).replace('0b','')
    print(int(L,2))

if __name__ == '__main__':
    s = "10.3.9.12"
    ip_to_int(s)

11. python遞歸的最大層數?

  998

12. 求結果:

 v1 = 1 or 3
          >>1
 v2 = 1 and 3
        >>3
 v3 = 0 and 2 and 1       >>0

 v4 = 0 and 2 or 1          >>1

 v5 = 0 and 2 or 1 or 4          >>1

 v6 = 0 or False and 1     >> False

13. ascii、unicode、utf-8、gbk 區別?

  最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。但是要處理中文顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。你可以想得到的是,全世界有上百種語言,日本把日文編到Shift_JIS里,韓國把韓文編到Euc-kr里,各國有各國的標准,就會不可避免地出現沖突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。

Unicode標准也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。新的問題又出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不划算。所以,本着節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間。UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作。

14. 字節碼和機器器碼的區別?

  機器碼(machine code),學名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的數據。通常意義上來理解的話,機器碼就是計算機可以直接執行,並且執行速度最快的代碼。用機器語言編寫程序,編程人員要首先熟記所用計算機的全部指令代碼和代碼的涵義。手編程序時,程序員得自己處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程中每步所使用的工作單元處在何種狀態。這是一件十分繁瑣的工作,編寫程序花費的時間往往是實際運行時間的幾十倍或幾百倍。而且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。現在,除了計算機生產廠家的專業人員外,絕大多數的程序員已經不再去學習機器語言了。

總結:機器碼是電腦CPU直接讀取運行的機器指令,運行速度最快,但是非常晦澀難懂,也比較難編寫,一般從業人員接觸不到。

   字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的 二進制文件字節碼是一種中間碼,它比機器碼更抽象,需要直譯器轉譯后才能成為機器碼的中間代碼。通常情況下它是已經經過編譯,但與特定機器碼無關。字節碼通常不像源碼一樣可以讓人閱讀,而是編碼后的數值常量、引用、指令等構成的序列。字節碼主要為了實現特定軟件運行和軟件環境、與硬件環境無關。字節碼的實現方式是通過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平台上的虛擬機器將字節碼轉譯為可以直接執行的指令。字節碼的典型應用為Java bytecode。字節碼在運行時通過JVM(JAVA虛擬機)做一次轉換生成機器指令,因此能夠更好的跨平台運行。

總結:字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。需要直譯器轉譯后才能成為機器碼。

15. 三元運算規則以及應用場景?

if X:
    A = Y
else:
    A = Z

# 用於簡單的if-else判斷,基本語法:條件為真的返回值 if 條件 else 條件為假的返回值
A = Y if X else Z

16. 列舉 Python2和Python3的區別?

  詳情

17. 用一行代碼實現數值交換:

     
 a = 1    b = 2

a, b = b, a

# 附加

'''采用第三方變量'''
c = a
a = b
b = c

'''使用兩個變量'''
a = a+b   #取兩個數的和
b = a-b   #然后a-b等於a然后賦值給b
a = a-b   #然后a-b等於b然后賦值給a,完成值的交換

18.Python3和Python2中 int 和 long的區別

python2

  int(符號整數):通常被稱為是整數或整數,沒有小數點的正或負整數。

  long(長整數):或渴望,無限大小的整數,這樣寫整數和一個大寫或小寫的L。

python3

  去除了long類型,現在只有一種整型——int,但它的行為就像2.X版本的long

19.xrange和range的區別

  xrange 用法與 range 完全相同,所不同的是生成的不是一個list對象,而是一個生成器。

20.文件操作時:xreadlines和readlines的區別?

  file.readlines()是把文件的全部內容讀到內存,並解析成一個list,當文件的體積很大的時候,需要占用很多內存,使用該方法是一種不明智的做法。

  file.xreadlines()則直接返回一個iter(file)迭代器

21.列舉布爾值為False的常見值

  0 以及長度為0的內置對象(空列表,空字符,空字典等等)

22..字符串、列表、元組、字典每個常用的5個方法

  字符串

  列表

  元組和字典

23.lambda表達式格式以及應用場景?

24.pass的作用

  pass語句什么也不做,一般作為占位符或者創建占位程序,pass語句不會執行任何操作    保證格式完整    保證語義完整

25.*arg和**kwarg作用

  如果我們不確定往一個函數中傳入多少參數,或者我們希望以元組(tuple)或者列表(list)的形式傳參數的時候,我們可以使用*args(單星號)。如果我們不知道往函數中傳遞多少個關鍵詞參數或者想傳入字典的值作為關鍵詞參數的時候我們可以使用**kwargs(雙星號),args、kwargs兩個標識符是約定俗成的用法。

  另一種答法:當函數的參數前面有一個星號*號的時候表示這是一個可變的位置參數,兩個星號**表示這個是一個可變的關鍵詞參數。星號*把序列或者集合解包(unpack)成位置參數,兩個星號**把字典解包成關鍵詞參數。

26.is和==的區別

  is 是⽐較兩個引⽤是否指向了同⼀個對象(引⽤⽐較)。
  == 是⽐較兩個對象的值是否相等

27.簡述Python的深淺拷貝以及應用場景

# 1. copy.copy 淺拷貝 只拷貝父對象,不會拷貝對象的內部的子對象。
# 2. copy.deepcopy 深拷貝 拷貝對象及其子對象
import copy  
a = [1, 2, 3, 4, ['a', 'b']] #原始對象  
  
b = a #賦值,傳對象的引用  
c = copy.copy(a) #對象拷貝,淺拷貝  
d = copy.deepcopy(a) #對象拷貝,深拷貝  
  
a.append(5) #修改對象a  
a[4].append('c') #修改對象a中的['a', 'b']數組對象  
  
print 'a = ', a  
print 'b = ', b  
print 'c = ', c  
print 'd = ', d  

# 輸出結果:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']] 

淺拷⻉是對於⼀個對象的頂層拷⻉:拷⻉了引⽤,並沒有拷⻉內容

  深拷⻉是對於⼀個對象所有層次的拷⻉(遞歸)

28.Python垃圾回收機制

  引用計數機制為主,隔代回收為輔的策略

29.Python的可變類型和不可變類型

  數字、字符串、元組是不可變的,列表、字典是可變的

 30.求結果:
  

v = dict.fromkeys(['k1','k2'],[])
 
v[‘k1’].append(666)

print(v)
         >>{'k1': [666], 'k2': [666]}
v[‘k1’] = 777

print(v)       >> {'k1': 777, 'k2': [666]}

31. 求結果:

[6,6,6,6]

  Python的延遲綁定其實就是只有當運行嵌套函數的時候,才會引用外部變量i,不運行的時候,並不是會去找i的值,這個就是第一個函數,為什么輸出的結果是[6,6,6,6]的原因。

32. 列舉常見的內置函數?

  詳情

33. filter、map、reduce的作用?

  詳情

34. 一行代碼實現9*9乘法表

#正序
for
i in range(1,10): for j in range(1,i+1): print("%s*%s=%s" % (j,i,i*j),end="\t") print()
#倒序
for i in range(9,0,-1): for j in range(i,0,-1): print("%s*%s=%s" % (j,i,i*j),end="\t") print()
#一行代碼
print("\n".join("\t".join(["%s*%s=%s" % (y, x, x*y) for y in range(1, x + 1)]) for x in range(1, 10)))

35. 如何安裝第三方模塊?以及用過哪些第三方模塊?

  pip安裝:pip install 模塊名稱( 使用豆瓣源 pip install -i http://pypi.douban.com/simple/ 模塊名稱

  源碼安裝:1.下載代碼  2.解壓 3.進入目錄 4.執行 python setup.py install

36. 至少列舉8個常用模塊都有那些?

  詳情

37.re的match和search區別

  詳情

38.什么是正則的貪婪匹配

  詳情

39.求結果:


a. [ i % 2 for i in range(10) ]
 b. ( i % 2 for i in range(10) )

  a為列表[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] ,b為列表生成器

40.求結果:


a. 1 or 2
 b. 1 and 2
 c. 1 < (2==2)
 d. 1 < 2 == 2

  1   2   False   True

41.def func(a,b=[]) 這種寫法有什么坑?

  函數定義時生成默認b的列表,而不是每次調用時生成一個空列表

42.如何實現 “1,2,3” 變成 [‘1’,’2’,’3’] ?

“1,2,3”.split(',')

43.如何實現[‘1’,’2’,’3’]變成[1,2,3] ?

[int(i) for i in “1,2,3”.split(',')]

44.比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?

>>> b = [(1),(2),(3) ]
>>> print(type(b[1]))
<class 'int'>
>>> b = [(1,),(2,),(3,) ]
>>> print(type(b[1]))
<class 'tuple'>
>>> b = [1,2,3]
>>> print(type(b[1]))
<class 'int'>

45.如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?

[pow(i,2) for i in range(1,11)]

46.一行代碼實現刪除列表中重復的值 ?

def distFunc1():
    a=[1,2,4,2,4,5,6,5,7,8,9,0]
    b={}
    b=b.fromkeys(a)
    print b
    #print b.keys()
    a=list(b.keys())
    print a
    
def distFunc2():
    a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
    a=list(set(a)) # set是非重復的,無序集合。可以用list來的排隊對set進行排序,list()轉換為列表,a.sort來排序
    print a
    
def distFunc3():
    #可以先把list重新排序,然后從list的最后開始掃描,代碼如下:
    List=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
    if List:
        List.sort()
        #print List
        last = List[-1]
        #print last
        for i in range(len(List)-2, -1, -1):
            if last==List[i]: 
                del List[i]
            else: last=List[i]

47.如何在函數中設置一個全局變量

        詳情

48.logging模塊的作用?以及應用場景?

  詳情

49.請用代碼簡答實現stack

# coding:utf-8 

class Stack(object):
    def __init__(self):
        self.__list = []

    def push(self, item):
        """添加一個新元素到棧頂"""
        self.__list.append(item)

    def pop(self):
        """彈出棧頂元素"""
        return self.__list.pop()

    def peek(self):
        """返回棧頂元素"""
        if self.__list:
            return self.__list[-1]
        else:
            return None

    def is_empty(self):
        """判斷棧是否為空"""
        return self.__list == []

    def size(self):
        """返回棧元素個數"""
        return len(self.__list)


if __name__ == '__main__':
    s = Stack()
    s.push(0)
    s.push(1)
    s.push(2)
    print(s.pop())

50.常用字符串格式化哪幾種?

>>> print("我叫%s,今年%d歲了" % ("小李", 20))
我叫小李,今年20歲了


1、正常使用

>>> print("我叫{},今年{}歲了".format("小李", 20))
我叫小李,今年20歲了

2、還可以通過在括號里填寫數字,修改格式化的順序

>>> print("我叫{1},今年{0}歲了".format("小李", 20))
我叫20,今年小李歲了

3、通過key取變量

>>> print("我叫{name},今年{age}歲了".format(name="小李", age=20))
我叫小李,今年20歲了

 51.簡述 生成器、迭代器、可迭代對象 以及應用場景?

  詳情

52.用Python實現一個二分查找的函數。

# coding:utf-8

# 二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,
# 且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,
# 將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成
# 前、后兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。
# 重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。


    # 最優時間復雜度:O(1)
    # 最壞時間復雜度:O(logn)

def binary_search(alist, item):
    first = 0
    last = len(alist)-1
    while first<=last:
        midpoint = (first + last)//2
        if alist[midpoint] == item:
            return True
        elif item < alist[midpoint]:
            last = midpoint-1
        else:
            first = midpoint+1
    return False
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))


def binary_search(alist, item):
    if len(alist) == 0:
        return False
    else:
        midpoint = len(alist)//2
        if alist[midpoint]==item:
          return True
        else:
          if item<alist[midpoint]:
            return binary_search(alist[:midpoint],item)
          else:
            return binary_search(alist[midpoint+1:],item)

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))

53.談談你對閉包的理解?

  詳情

54.os和sys模塊的作用?

  os模塊負責程序與操作系統的交互,提供了訪問操作系統底層的接口;sys模塊負責程序與python解釋器的交互,提供了一系列的函數和變量,用於操控python的運行時環境。

55.如何生成一個隨機數?

  random模塊

56.如何使用python刪除一個文件?

  os.remove()

57.談談你對面向對象的理解?

  面向對象編程,即OOP,是一種編程范式,滿足面向對象編程的語言,一般會提供類、封裝、繼承等語法和概念來輔助我們進行面向對象編程。

58.Python面向對象中的繼承有什么特點?

  詳情

59. 面向對象深度優先和廣度優先是什么?

  Python的類如果繼承了多個類,那么其尋找方法的方式有兩種,分別是:深度優先廣度優先

60.面向對象中super的作用?

  詳情

61.是否使用過functools中的函數?其作用是什么?

  functools,用於高階函數:指那些作用於函數或者返回其它函數的函數,通常只要是可以被當做函數調用的對象就是這個模塊的目標。

62.列舉面向對象中帶爽下划線的特殊方法,如:__new__、__init__

  詳情

63.如何判斷是函數還是方法?

  詳情

64.靜態方法和類方法區別?

  詳情

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

  見62

66.1、2、3、4、5 能組成多少個互不相同且無重復的三位數

n = 0
for i in range(1,6):
    for j in range(1,6):
        for k in range(1,6):
            if( i != k ) and (i != j) and (j != k):
                n += 1
print("能組成%d個互不相同且無重復數字的三位數:"%n)

67. 什么是反射?以及應用場景?

  反射就是通過字符串的形式,導入模塊;通過字符串的形式,去模塊尋找指定函數,並執行。利用字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基於字符串的事件驅動!

68.metaclass作用?以及應用場景?

  詳情

69.用盡量多的方法實現單例模式

  詳情

70.裝飾器的寫法以及應用場景

71.異常處理寫法以及如何主動跑出異常

  詳情

72.什么是面向對象的mro

  MRO(Method Resolution Order):方法解析順序

73.isinstance作用以及應用場景

  詳情

74.寫代碼並實現:

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]

class Solution(object): 
    def twoSum(self, nums, target): 
        """ :type nums: List[int] 
            :type target: int 
            :rtype: List[int] 
        """ 
        if len(nums) <= 1: 
            return False 
            buff_dict = {} 
            for i in range(len(nums)): 
                if nums[i] in buff_dict: 
                    return [buff_dict[nums[i]], i] 
                else: 
                    buff_dict[target - nums[i]] = i

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

  詳情

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

import json
dict = {'aa': '你好啊', 'bb': '你還'}
print  dict
print '-----------------------'
##加上ensure_ascii=False后data返回的就是中文而不是unicode
data = json.dumps(dict, ensure_ascii=False)
'''
方法二:
print json.dumps(dict,ensure_ascii=False).decode('utf8').encode('gb2312')
'''
print data

####
python3中沒有這種問題,所以最簡單的方法是引入future模塊
from __future__ import unicode_literals

print json.dumps(dict,ensure_ascii=False)

=>{"aa": "你好啊"}

77.什么是斷言

  詳情

78.有用過with statement嗎?它的好處是什么

  詳情

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

#方法1:使用os.listdir
import os
for filename in os.listdir(r'c:\windows'):
    print filename
 
#方法2:使用glob模塊,可以設置文件過濾
import glob
for filename in glob.glob(r'c:\windows\*.exe'):
    print filename
 
#方法3:通過os.path.walk遞歸遍歷,可以訪問子文件夾
import os.path
def processDirectory ( args, dirname, filenames ):
    print 'Directory',dirname
    for filename in filenames:
        print ' File',filename
 
os.path.walk(r'c:\windows', processDirectory, None )
 
#方法4:非遞歸
import os
for dirpath, dirnames, filenames in os.walk('c:\\winnt'):
    print 'Directory', dirpath
    for filename in filenames:
        print ' File', filename

# 另外,判斷文件與目錄是否存在
import os
os.path.isfile('test.txt') #如果不存在就返回False
os.path.exists(directory) #如果目錄不存在就返回False

80.簡述 yield和yield from關鍵字。

  詳情

 

附:Python面試

 


免責聲明!

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



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