python面試題

第一部分 Python基礎篇(80題)
4.  解釋型語言,程序邊運行邊解釋
    編譯型語言,程序會先生成目標文件,經過連接生成可執行文件

5.python解釋器總類及特色:
    cpython:C語言開發使用最廣
    ipython:基於cpython採用jit技術,對python進行動態編譯,提升執效率
    jpython:運行在java上的解釋器,直接把py代碼編譯成java字節碼執行

6.位和字節的關係
    8位==1字節

7.b,B,KB,MB,GB
    8b=1B
    1024B=1KB
    1024KB=1MB
    1024MB=1GB

8.請至少列舉5個PEP8規範(越多越好)
    1.代碼編排縮進,4個空格的縮進,不使用tap,更不能混合使用tap和空格
    2.不要在一句import中引用多個庫
    3.儘可能避免沒必要要的空格
    4.逗號,冒號,分號前不加空格
    5.操做符左右更加一個空格
    6.若是採用from xx import xx引用庫,能夠省略'module.',均可能出現命名衝突,這時要採用import xx

9.經過代碼實現進制轉換
    #十進制轉換成2,8,16進制
    v = 18
    print(bin(v))#十進制轉換成二進制
    v = 18
    print(oct(v))#十進制轉換成八進制
    v= 18
    print(hex(v))#十進制轉18進制

    #2,8,16進制轉換成10進制
    v = '0b1111011'
    print(int(v,2))#二進制字符串
    v='011'#八進制
    print(int(v,8))
    v='0x0E'
    print(int(v,16))

10.請編寫一個函數實現將IP地址轉換成一個整數
    def Change(addr):
        # 取每一個數
        id = [int(x) for x in addr.split(".")]
        print(id)
        return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))

    ip = '10.3.9.12'
    print(bin(Change(ip)))

11.python的最大遞歸層數
    998層

12.求結果
    or  從左到右,有一個真的值,則返回第一個真的值,若全部值都爲假,則返回最後一個值
    and 從左到右,有一個假的值,則返回第一個假的值,若全部值均爲真,則返回最後一個值
    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 Flase and 1      False

13.ascii、unicode、utf-八、gbk區別
    ascii 位字符編碼
    gb2312 編碼:2字節表示一個漢字,最多表示65535個漢字
    gbk編碼是對gb2312的擴展,徹底兼容gb2312
    unicode是全部字符的集合
    unt-8是unicode的擴展,字符爲1字節,漢字爲3字節

14.字節碼和機器碼的區別
    字節碼:與硬件無關,通過編譯的,不可閱讀,實現方式:編譯器和虛擬機
           字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。須要直譯器轉義後才能成爲機器碼。
    機器碼:電腦cpu直接讀取運行的機器指令,運行速度快,比較晦澀難懂

15.三元運算規則及應用場景
   表達式?true:false
   表達式的值若是爲真,則爲true,不然爲false

16.列舉py2和py3的區別
    print函數 py2不須要括號,py3須要括號好
    py2中有xrange和range py3中只有xrange => rang:其中rang是個迭代器
    xreadline和readline
    py2中經典類和新式類並不同,經典類的深度優先繼承,新式類是廣度優先
    py3中經典類和新式類都是廣度優先


17.用一行代碼實現數值交換:
   a=10
   b=9
   a,b=b,a
   a,b = b,a

18.python2與py3中的long與int的區別
   py2中的long類型==py3中的int類型

19.xrange與rang的區別:
   py2中 xrange等於py3中的range是個迭代器
   py2中的range是個列表

20.文件操做時:xreadlines和readlines的區別?
   xreadlines是個迭代器
   readlines是個列表,每一行爲一個列表元素

21.列舉布爾值爲False的常見值:
    bool("")
    bool([])
    bool({})
    bool(0)
    bool(-0)

22.字符串、列表、元組、字典每一個經常使用的5個方法
    str.spilt()
    str.join()
    str.replace()
    字符串:str.split()
            str.join()
            str.replace()
            str.upper()
            str.count()
    列表:list.append()
          list.pop()
          list.remove()
          list.index()
          list.extend()#列表拼接
    元組(只能讀,不能更改):
    字典:dict.get()
          dict.update()#字典合併
          dict.item()#字典轉換成列表
          dict.setdefault()#添加字典,若是存在相同的鍵值,則不添加

23.lambda(匿名函數)表達格式及應用場景
   calc=lambda x:x*3  lambda x :x*3
   調用calc(3)

24.pass的做用?
   終止本次循環

25.*arg與**kwargs做用
   *arg:多個參數元組
   **kwargs:字典

26 is與==的區別
    變量的三個基本要素:分別是id,type,value
    ==:判斷value
    is:判斷id

27.簡述深淺copy及應用場景
    copy模塊
    copy.copy
    copy.deepcopy

    字面:深淺copy對於字符串,數字,僅有一層的字典,列表,元組同樣,都只拷貝內存地址
    內存地址的角度:
        深copy對於字符串和數字與淺copy同樣
        對於多層字典和列表:
            第一層深淺copy相同,可是對於第二層,深copy會指向對象的值的內存地址,而淺copy則會只指向對象的第二層內存地址

28.python的垃圾回收機制
    python會定時的去搜索沒有被指向的變量,進行清除

29.python的可變類型和不可變類型
    python的可變類型爲:列表,字典
                        列表與字典中的值能夠更改
    python的不可變類型爲:數字,字符串,元組
                        數字例如:i=5
                                  i=6
                                  系統不會將5刪除,而是指向了6,若是沒有其它變量應用5,原有對象就會收回
                                  全部賦值爲5的變量同時指向了內存中爲5的值的地址
30.求結果:
    v = dict.fromkeys(['k1','k2'],[])
    v["k1"].append(666)
    print(v)
    v["k1"] = 777
    print(v)

    輸出:{'k2': [666], 'k1': [666]}
          {'k2': [666], 'k1': 777}
    若是子層中是個列表,則須要注意,append(666)則k2與k1都會被修改
    直接賦值則不會

31.求結果:
    def num():
        return [lambda x:x*i for i in range(4)]
    # [lambda x:x*1, lambda x:x*2, lambda x:x*3, lambda x:x*4]

    print([m(2) for m in num()])

    輸出:[6, 6, 6, 6]

32.列舉常見的內置函數?
    abs
    sum
    range
    max([])
    min([])
    round(1)#浮點數
    len()
    .....

33.filter、map、reduce的做用?
   list1 = filter(lambda n:n%2==1,range(1,20))
   打印1-20之間的奇數
   list1 = map(lambda n:n%2==1,range(1,20)) # 匹配函數
   打印1-20之間的數據,若是是奇數,爲true,若是是偶數,爲false

   py3中,reduce內置函數,須要引入模塊functools
   from functools import reduce
   reduce 是累加函數
   reduce(lambda x,y:x+y,range(1,20))

34.一行代碼實現9*9乘法表(不會)
    print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

35.如何安裝第三方模塊,用過哪些第三方模塊?
   經過pycharm編譯器中的file->setting->project->Project interpreter能夠下載安裝
   經過pip安裝

   sqlarchmey,mysql,selecter.....
   restframe_work


36.至少列舉8個經常使用的模塊
   re、time、os、sys、json、paramiko、threading、process、Queue、socket、mysql,sqlachme

37.re的match和search區別?
   match()是否以什麼開頭
   search()匹配全部

38.什麼是正則的貪婪匹配?
   str="abcdnsidnc"
   re= "ab*c"
   貪婪匹配結果:"abcdnsidnc"
   非貪婪匹配結果:abc

39.求結果: a. [ i % 2 for i in range(10) ]  b. ( i % 2 for i in range(10) )
    a.   [ i % 2 for i in range(10) ]
    輸出:[0,1,0,1,0,1,0,1,0,1]
    b. ( i % 2 for i in range(10) )
    輸出:是個迭代器,輸出的是迭代器的地址,可使用for循環函數來打印

40.求結果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
    a.輸出:1
    b.輸出:2
    c.輸出:False
    d.輸出:True
    d.答案分析:
    其餘語言if(a>4 and a<10)
    python 4<a<10
    推出===>  1<2 ==2 爲  1<2 and 2==2
     ===> True and True
     ===> True

41.def func(a,b=[]) 這種寫法有什麼坑?
    def func(a,b=[]):
        b.append(a)
        print(b)
    func(1)
    func(1)
    func(1)
    func(1)
    輸出:
  [1]
  [1, 1]
  [1, 1, 1]
  [1, 1, 1, 1]
    每次實例化都會使用第一次建立的list表

42.如何實現 「1,2,3」 變成 [‘1’,’2’,’3’] ?
    split(',')

43.如何實現[‘1’,’2’,’3’]變成[1,2,3] ?
    [int(i) for i in s]


44.比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?
    a 與 b = [(1,),(2,),(3,) ]的區別:
        a是個數字列表,b是個元組列表
    a 與  b = [(1),(2),(3) ] 的區別:
        無區別

45.如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
    [x*x for x in range(1,11)]

46.一行代碼實現刪除列表中重複的值 ?
    list(set([]))
    #集合去重

47.若是在函數中設置一個全局變量
    global

48.logging模塊的做用?以及應用場景?
    不知道

49.請用代碼簡答實現stack
    class Stack(object):
        def __init__(self):
            self.stack = []

        def push(self, value):    # 進棧
            self.stack.append(value)

        def pop(self):  #出棧
            if self.stack:
                self.stack.pop()
            else:
                raise LookupError(‘stack is empty!‘)

        def is_empty(self): # 若是棧爲空
            return bool(self.stack)

        def top(self):
            #取出目前stack中最新的元素
            return self.stack[-1]

50.經常使用字符串格式化哪幾種?
    1.最方便
        print("hello %s and %s" %("df","another df"))
    2.最好用
        print("hello %fisrt and %second"%("first":"df","second":"another df"))
    3.最早進
        print("hello {first} and {second}".format(first="df",second="another df"))

51.簡述 生成器、迭代器、可迭代對象 以及應用場景?
    可迭代對象:實現了迭代器協議的對象就是可迭代對象
    可迭代對象能夠生成迭代器:經過iter()轉換成iterator
    生成器生成式子:[x*x for x in range(10)]是個列表
    把[]改爲()就能夠變成迭代器

52.用python實現一個二分查找
def binary_chop(alist, data):
    """
    非遞歸解決二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    first = 0
    last = n - 1
    while first <= last:
        mid = (last + first) // 2
        if alist[mid] > data:
            last = mid - 1
        elif alist[mid] < data:
            first = mid + 1
        else:
            return True
    return False

if __name__ == '__main__':
    lis = [2,4, 5, 12, 14, 23]
    if binary_chop(lis, 14):
        print('ok')談談你對閉包的理解?
   def binary_chop(alist, data):
    """
    非遞歸解決二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    first = 0
    last = n - 1
    while first <= last:
        mid = (last + first) // 2
        if alist[mid] > data:
            last = mid - 1
        elif alist[mid] < data:
            first = mid + 1
        else:
            return True
    return False

if __name__ == '__main__':
    lis = [2,4, 5, 12, 14, 23]
    if binary_chop(lis, 14):
        print('ok')

53.談談你對閉包的理解
    不懂

54.os和sys模塊的做用?
    os主要處理操做系統相關操做
    sys主要處理系統相關操做

55.如何生成一個隨機數
    import random
    random.rangrange(1,100)

56.如何使用python刪除一個文件?
    if os.file.exist(path):
        os.remove(path)

57.談談你對面向對象的理解?
    面向對象有三大特性,封裝、繼承和多態。

58.Python面向對象中的繼承有什麼特色
    Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。
    在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。有別於C#

59.面向對象深度優先和廣度優先是什麼?
    不懂

60.面向對象中super的做用
   用於調用父類的方法,解決多重繼承問題。

61.是否使用過functools中的函數?其做用是什麼?
   reduce

62.列舉面向對象中帶下劃線的特殊方法,如:__new__、__init__
    __call__
    __str__
    __add__
    __dic__
    __getitem__

63.如何判斷是函數仍是方法?
    方法須要經過對象來調用

64.靜態方法和類方法區別?
    靜態方法不須要傳入self參數,類成員方法須要傳入表明本類的self參數
    靜態方法是無妨訪問實例變量和類變量的,類成員方法沒法訪問實例變量可是能夠訪問類變量

65.列舉面向對象中的特殊成員以及應用場景?
    __doc__描述信息類
    __call__ 對象後面加括號,觸發執行
    __dict__ 查看類或對象中的全部成員
    __str__ 若是一個類中定義了__str__方法,那麼在打印對象時,默認輸出該方法的返回值

66.一、二、三、四、5 能組成多少個互不相同且無重複的三位數
    不懂

67.什麼是反射?以及應用場景?
    反射主要根據字符串去尋找類的屬性值
    web框架

68.metaclass做用?以及應用場景?
   不懂

69.用盡可能多的方法實現單例模式。

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

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

72.什麼是面向對象的mro

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,json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?
        
Because nums[0] + nums[1] = 2 + 7 = 9,


75.json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?
    (dict、list、string、int、float、long、bool、None)
    import json
    from json import JSONEncoder
    from datetime import datetime
    class ComplexEncoder(JSONEncoder):
    def default(self, obj):
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')
    else:
        return super(ComplexEncoder,self).default(obj)
    d = { 'name':'alex','data':datetime.now()}
    print(json.dumps(d,cls=ComplexEncoder))
    # {"name": "alex", "data": "2018-05-18 19:52:05"}

76.json序列化時,默認遇到中文會轉換成unicode,若是想要保留中文怎麼辦?
    import json
    a=json.dumps({"ddf":"你好"},ensure_ascii=False)
    print(a) #{"ddf": "你好"}

77.什麼是斷言?應用場景?

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

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

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


第二部分 網絡編程和併發(34題)
1.簡述osi七層協議
    應用層->表示層->會話層->傳輸層->網絡層->數據鏈路層->物理層

2.什麼是C/S和B/S架構?
    C/S 客戶端/服務端架構
    B/S 瀏覽器/服務器架構

3.簡述 三次握手、四次揮手的流程。
    三次握手
    客戶端->發送創建連接請求->服務端
    服務端->發送給確認請求->客戶端
    客戶端->發送數據包->服務端,連接創建

4.什麼是arp協議?
    ARP協議,全稱「Address Resolution Protocol」,中文名是地址解析協議,
    使用ARP協議可實現經過IP地址得到對應主機的物理地址(MAC地址)。

5.TCP和UDP的區別
    TCP是由連接的,UDP是無連接的。
    TCP可靠的,要求資源數多
    UDP實時的,要求資源數少

6.什麼是局域網和廣域網?
    局域網:一個區域內,多臺計算機互聯組成的
    廣域網:鏈接不一樣區域局域網或城域網計算機通訊的遠程網

7.爲什麼基於tcp協議的通訊比基於udp協議的通訊更可靠?
    由於tcp是由鏈接的:三次握手雙向機制,http使用tcp協議傳輸的

8.什麼是socket?簡述基於tcp協議的套接字通訊流程。
    socket:Socket是網絡上兩個程序雙向通信鏈接的端點。
    通信流程:
    1.服務器經過socket函數建立一個套接字,用這個套接字完成監聽活動。
    2.服務器綁定一個ip和端口
    3.服務器調用listen來監聽端口狀態,等待客戶端連接
    4.客戶端經過socket函數建立一個套接字,並設定遠端ip和端口。
    5.客戶端經過connect函數來鏈接遠端服務器
    6.服務器經過accept函數來接收客戶端的鏈接通信。
    7.客戶端能夠經過write函數和read來實現與服務端的數據收發。
    8.服務器能夠經過write函數和read來實現與客戶端的數據收發。
    9.通信結束,關閉socket,調用close函數。

9.什麼是粘包? socket 中形成粘包的緣由是什麼? 哪些狀況會發生粘包現象?
    粘包:多個數據包被連續存儲於連續的緩存中
    緣由:發送方,每每等待接收到必定的數據後纔會發送數據,若是連續幾回發送少許數據,
    經過TCP會根據算法把數據合成一包發送,接收方就收到了粘包數據。

    那些狀況:
    客戶端或者服務端沒有設置,響應機制,致使數據粘包。

10.IO多路複用的做用?
   單個線程或者進程就能夠同時處理多個網絡IO鏈接。

11.什麼是防火牆以及做用?
    將內部網絡與公用網絡隔離的方法。
    提升內部網絡安全,過濾不安全服務。

12.select、poll、epoll 模型的區別?
   select:支持的文件描述符數量太少 => 1024
          在fd數量多的時候,系統開銷較大
   poll:與select,描述fd集合方式不一樣

   eproll:是對select和poll的改進,在爲每一個fd指定一個回調函數,設備就緒時,
   直接喚醒並將fd加入就緒表。

13.簡述 進程、線程、協程的區別 以及應用場景?


16.threading.local的做用?
    threading.local()這個方法的特色用來保存一個全局變量,
    可是這個全局變量只有在當前線程才能訪問。java

相關文章
相關標籤/搜索