Python 實習碰見的各類面試題

Python 實習碰見的各類面試題

 

Python 語法javascript

  • 說說你平時 Python 都用哪些庫html

  • == 和 is 區別。java

    • == 是比較兩對象的值,is 是比較在內存中的地址(id), is 至關於 id(objx) == id(objy)
  • 深拷貝和淺拷貝。node

# 淺拷貝操做只會拷貝被拷貝對象的第一層對象,對於更深層級的只不過是拷貝其引用,以下例中 `a[2]` # 和 `lst[2]` 這兩個對象爲第二層,實際上淺拷貝以後,這兩個仍是一個對象。深拷貝會徹底的拷貝被拷 # 貝對象的全部層級對象,也就是一個真正意義上的拷貝。 >>> from copy import copy, deepcopy >>> lst = [1, 2, [3, 4]] >>> a, b = copy(lst), deepcopy(lst) >>> a, b ([1, 2, [3, 4]], [1, 2, [3, 4]]) >>> id(lst[2]), id(a[2]), id(b[2]) (139842737414224, 139842737414224, 139842737414584) >>> lst[0] = 10 >>> a [1, 2, [3, 4]] >>> b [1, 2, [3, 4]] >>> lst[2][0] = 'test' >>> lst [10, 2, ['test', 4]] >>> a [1, 2, ['test', 4]] >>> b [1, 2, [3, 4]]
  • __init__ 和 __new__python

    • __init__ 只是單純的對實例進行某些屬性的初始化,以及執行一些須要在新建對象時的必要自定義操做,無返回值。而 __new__ 返回的是用戶建立的實例,這個纔是真正用來建立實例的,因此 __new__ 是在 __init__ 以前執行的,先建立再初始化。
  • Python 2 和 Python 3 有哪些區別?nginx

    • lz 當時只是簡單的說了幾點:
      • Python2 和 Python3 的默認字符串不同,Python3 默認爲 Unicode 形式。
      • raw_input()input()
      • 捕捉異常/錯誤的寫法,Python2 除了後面的寫法還支持:except Exception, e, 而 Python3 只支持 except Exception as e
      • Python3 中沒有了 xrange, 而使用 range 代替它,在 Python3 中,range 返回的是一個可迭代對象,而不是 Python2 那樣直接返回列表。
      • Python3 中 map 若是須要當即執行必須以 list(map()) 這樣的方式。
      • Python3 中,print 改爲了函數,而在 Python2 中,print 是一個關鍵字。使用上有所差別。
      • Python3 中,3/2 == 1.5;Python2 中,3/2 == 1
      • 上面知識列了幾點比較常見的,這裏有一篇 http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html 寫的詳細寫。
  • 鏈接字符串都有哪些方式?git

    • 格式化字符鏈接(%s)
    • format
    • join
    • +
  • 如何判斷某個對象是什麼類型?github

    • type(obj)
    • isinstance(obj)
  • 生成器是什麼?web

  • Python 中的 GIL 是什麼?全稱?舉個例子說說其具體體現。面試

    • GIL 全稱 Global Interpreter Lock(全局解釋器鎖),任何 Python 線程執行前,必須先得到 GIL 鎖,而後,每執行100條字節碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執行。要避免這種「現象」利用操做系統的多核優點能夠有下面幾種方法:
      • 使用 C 語言編寫擴展,建立原生線程,擺脫 GIL,可是即便是擴展,在 Python 代碼內,任意一條Python 代碼仍是會有 GIL 限制
      • 使用多進程代替多線程,使用多進程時,每一個進程都有本身的 GIL。故不存在進程與進程之間的 GIL 限制。可是多進程不能共享內存。
  • s = 'abcd', s[2] = 'e' 運行結果是什麼?

    • 報錯,字符串是不可變對象
  • Python 中,sorted 函數內部是什麼算法?

  • 編碼是一個什麼樣的過程?

    • 編碼是二進制到字符的過程
  • Python 裏面怎麼實現協程?

    • lz 當時也就簡單說了下能夠用 yield 關鍵字實現,舉了個小例子,還說了用戶控制調度,加上一些第三方框架,Gevent,tornado 之類的,可憐。這裏安利一下 駒哥 的一篇文章 說清道明:協程是什麼
  • requests 包新建一個 session 再 get 和普通的 requests.get 有什麼區別?(tcp長鏈接)

    • 維持一個會話,** 創建一個tcp長鏈接** ,cookie 自動保存,下次請求仍是一個會話。
  • Python 都有哪些數據結構?可變對象,不可變對象分別有哪些?

    • 可變對象:列表,字典
    • 字符串,數字,元組,集合
  • 在 Python 內,函數傳參是引用傳遞仍是值傳遞?

    • 引用傳遞。
  • 你會對你的項目寫測試麼?用哪些方法哪些庫?

    • 只說了用 unitest......須要自行尋找答案。
  • 請新建一個只有一個元素 1 的列表和元組。

    • lst = [1]
    • tup = (1,)
  • 函數默認參數是可變對象狀況。

>>> def foo(a, b=[1, 2]): print(b) b.append(a) print(b) >>> val = 4 >>> foo(val) # [1, 2] # [1, 2, 4] >>> foo(val) # [1, 2, 4] # [1, 2, 4, 4] # 這裏能夠看到,第二次執行函數時,默認參數 b 的值已經變成 `[1, 2, 4]` 了,緣由是,默認參數只在第 # 一次執行時會進行初始化,後面就默認使用 **初始化後的這個對象(引用)**,可是這裏 b 是可變對象, #添加了一個元素仍是以前的對象,因此,引用沒變,不過是值變了而已。
  • Flask 的 Route 是怎麼實現的? 你認爲 Flask 框架有什麼優缺點?

    • 實際上在 Flask 類裏面,route 能夠簡單理解爲不過是把對應的路由規則做爲鍵,裝飾的視圖函數做爲值,存到 werkzeug.routing.Map 對象(能夠當作是和字典相似的數據結構)裏。這裏是 源碼,好理解些。這是以前寫的一篇 筆記
    • Flask 優勢是輕量,靈活,可高度定製,插件化。缺點也是過於輕量,功能必須經過第三方插件實現,插件質量良莠不齊,也不能徹底保證後期維護。
    • 這幾點都只是我的之見,更詳細標準的還需自行尋找答案。
  • WSGI 是什麼?uWSGI, nginx 這些都是什麼用途?

    • 這裏有維基百科 的解釋,WSGI 就是一個通用的標準,遵照這個標準,咱們能讓咱們的 Web 框架更加通用,編寫更加簡單。
    • uwsgi 和 Nginx 都是 Web Server,不一樣的是 Nginx 負責 外網請求 ---(轉換)--> 內網請求,uwsgi 負責的是 內網請求 -> Python Web 程序。
  • nginx 和 Apache 的區別?(參考 interview_python)

    • nginx 相對 apache 的優勢:
      • 輕量級,一樣起web 服務,比apache 佔用更少的內存及資源
      • 抗併發,nginx 處理請求是異步非阻塞的,支持更多的併發鏈接,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能
      • 配置簡潔
      • 高度模塊化的設計,編寫模塊相對簡單
      • 社區活躍
    • apache 相對nginx 的優勢:
      • rewrite ,比nginx 的rewrite 強大
      • 模塊超多,基本想到的均可以找到
      • 少bug ,nginx 的bug 相對較多
      • 超穩定
  • 你部署 Python 項目時用的是 uWSGI 的哪一個模式?

    • 默認模式
    • 這個應該問的可能性極小了,可翻閱 uwsgi 文檔 查找更詳細的資料

數據結構,算法

  • 層次遍歷二叉樹用什麼方法?
# coding: utf-8 from collections import deque class BNode: """ 二叉樹節點 """ def __init__(self, value, left=None, right=None): self.value = value self.left = left self.right = right def level_traverse(binary_tree): """ 層次遍歷二叉樹 """ stack = deque([binary_tree]) while stack: top = stack.popleft() print(top.value) if top.left: stack.append(top.left) if top.right: stack.append(top.right) if __name__ == "__main__": b_tree = BNode(1, BNode(2, BNode(4, BNode(5, BNode(7)))), BNode(3, BNode(6, right=BNode(8)))) level_traverse(b_tree)
  • 非平衡二叉數如何變成平衡二叉數?

  • 先,中,後序遍歷二叉數。徹底二叉數是什麼?

    • 徹底二叉樹:深度爲k有n個節點的二叉樹,當且僅當其中的每一節點,均可以和一樣深度k的滿二叉樹,序號爲1到n的節點一對一對應時,稱爲「徹底二叉樹」。(摘自維基百科)
    • 先序:先根後左再右
    • 中序:先左後中再右
    • 後序:先左後右再根
  • 如何判斷兩個單鏈表是否相交於某個節點,包括 X 型,Y 型,V 型。

    • X 型不可能存在,一個單鏈表節點不存在兩個不一樣的後繼。
# 存在 V 型和 Y 型,若是交叉,則最後一個節點確定是相同的,故直接從最後一個節點進行反向遍歷。 # 反轉單鏈表 def reverse_single_link_lst(link_lst): if not link_lst: return link_lst pre = link_lst cur = link_lst.next pre.next = None while cur: tmp = cur.next cur.next = pre pre = cur cur = tmp return pre # 尋找交叉點 def point(node_a, node_b): if node_a is None or node_b is None: return None next_a, next_b = node_a, node_b while next_a or next_b: if next_a.val == next_b.val: if next_a.next and next_b.next and (next_a.next.val == next_b.next.val): next_a, next_b = next_a.next, next_b.next continue return next_a.val next_a, next_b = next_a.next, next_b.next return None # 構造單鏈表 class Node(object): def __init__(self, value, next=None): self.val = value self.next = next a = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5))))) b = ListNode(7, ListNode(9, ListNode(4, ListNode(5)))) ra = reverse_single_link_lst(a) rb = reverse_single_link_lst(b) point(ra, rb) # output: # 4
  • 如何判斷兩個單鏈表是不是同一個鏈表。

    • 直接判斷第一個節點便可。
  • 單鏈表逆轉。

    • 見上面判斷交叉鏈表內的 reverse_single_link_lst() 函數。
  • 堆,棧,隊列。

  • 說說你知道的排序算法以及其時間複雜度。

  • 手寫快速排序。畫畫堆排序的原理及過程。

# 快速排序,lz 當時寫的比較複雜,可是是最多見的寫法(緊張致使有幾個小bug),以下 def quick_sort(lst, start, stop): if start < stop: i, j, x = start, stop, lst[start] while i < j: while (i < j) and (lst[j] > x): j -= 1 if (i < j): lst[i] = lst[j] i += 1 while (i < j) and (lst[i] < x): i += 1 if (i < j): lst[j] = lst[i] j -= 1 lst[i] = x quick_sort(lst, start, i-1) quick_sort(lst, i+1, stop) return lst

以後面試官 akun 大哥給了個特別簡潔的寫法,三路複用,地址在 Gist

def qsort(alist): """  quick sort(easy way, but more memory)  test: python -m doctest qsort.py  >>> import math  >>> import random  >>> size = 100  >>> alist = [random.randint(0, size * 10) for i in range(size)]  >>> qlist = qsort(alist)  >>> alist.sort()  >>> assert qlist == alist  """ if len(alist) <= 1: return alist key = alist[0] left_list, middle_list, right_list = [], [], [] [{i < key: left_list, i == key: middle_list, i > key: right_list}[ True ].append(i) for i in alist] return qsort(left_list) + middle_list + qsort(right_list)
  • 說說你所瞭解的加密算法,編碼算法,以及壓縮算法。瞭解 base64 的原理麼?
    • 只說了聽過 base64, md5 這幾種編碼。。。。。自行搜索吧,考的機率極小。

數據庫

網絡

  • 從瀏覽器輸入網址到網頁渲染完畢這過程發生了什麼?

    • 這裏 說的很是詳細,看面的崗位不一樣,回答的側重點不同。如面的 Web ,能夠側重說說 nginx -> uwsgi -> Python -> uwsgi -> nginx 這個過程,(WSGI 標準)
  • TCP 三次握手四次揮手詳細說下。

  • 爲何是三次握手?兩次不行麼?

  • 說說 TCP 和 UDP 的區別。

    • TCP(傳輸層)
      • 優勢:TCP 面向鏈接,可靠,穩定,傳輸數據前須要創建鏈接,故有三次握手四次揮手,還有擁塞控制,重傳等
      • 缺點:慢,佔用系統資源,有確認機制,三次握手,因此容易被攻擊,DDos
    • UDP
      • 優勢:快,無狀態傳輸協議
      • 缺點:不穩定,不可靠,容易丟包
  • 談談你對 SQL 注入、 XSS 、 CSRF 的理解。以及如何防範。

  • 說說 DNS 是什麼東西。

    • 根據域名尋找 主機 IP 的協議。
  • HTTP 是工做在七層模型的哪一層?DNS 又是哪一層?TCP 和 IP 呢?

    • HTTP,DNS 應用層,TCP 傳輸層,IP 網絡層。
  • 說說你知道的 HTTP 方法和 狀態碼。

    • 狀態碼,這裏只須要大概說說,以 1××,2××,3×× 這樣的層面說,沒有必要細到每個狀態碼。
    • HTTP 請求方法
  • HTTP 的 GET 和 POST 有什麼區別?

    • 本質上,GET 和 POST 只不過是 發送機制不一樣 。
  • HTTP 和 HTTPS 的區別?

    • HTTPS = HTTP + SSL
    • HTTP 默認使用 80 端口,HTTPS 使用 443 端口。
    • 更詳細
  • 說說你知道的 HTTP 包頭部信息裏都有哪些字段。

    • 這個隨便抓下包就知道了,就不說了~
  • HTTP 包頭部信息裏面的 Host 字段是什麼做用?

    • 表示當前請求服務器的主機名
  • 說說 cookie 裏面你都知道哪些字段。

  • Session 是什麼東西?

  • 在寫爬蟲過程當中,若是碰見須要加載 js 的狀況你是如何處理的。

    • Selenium,PhantomJS
  • 普通匿名代理和高匿代理有什麼區別?

    • 來自普通匿名代理的請求在服務端能看見真實 IP, 而高匿代理在服務端看不見真實 IP,只能看見代理服務器 IP。
  • 你知道哪些反爬措施?

    • 加代理,加頭部,爬取速度控制,隨機 UA,模擬真實用戶的點擊習慣去請求。

操做系統

  • 進程和線程以及協程的區別?
  • 多線程和多進程的區別?
  • 信號量和互斥量的區別?
  • 堆內存是幹嗎的?
  • 如何檢驗當前機器是大端模式仍是小端模式?
  • 如何讓某個程序在後臺運行?(Linux)
  • sed, awk 用法(Linux)

編程題

  • 手寫二分查找,快速排序
  • 還有一個 SQL 語句的,一條 SQL 語句打印某張表某個 group count TOP 5。
  • Python 中正則模塊 re 裏 match 函數 和 search 函數有什麼區別?舉例說明。
  • 一條語句求 0 - 999999 內能被 7 整除的全部數的和。
  • 實現一個鏈表結構,要求其插入第一個節點,刪除最後一個節點的複雜度爲 O(1)。
  • 實現一個 retry 裝飾器,使用以下:
# 能夠指定重試次數,直到函數返回正確結果。 @retry(retries=3) def func(*args, **kw): try: # some action return True except: return False

大概能夠像下面這樣寫,

from functools import wraps def retry(retries=3): def timesf(func): @wraps(func) def wrap(*args, **kw): i = 0 status = True while status and i < times: status = func(*args, **kw) i += 1 return status return wrap return timesf
  • 有一個4G 的文本文件,存儲的是酒店信息,每行存的是一個酒店ID,能夠重複。請編寫程序輸出一個新文件,新文件內容爲每行一條數據,每行的數據格式以下:酒店ID + 出現次數(最後提到了其餘想法,如文件切片,bitmap 之類)
  • 實現一個函數,根據字典序比較兩字符串大小,不容許用庫函數,儘可能越底層實現越好。(手寫)
  • 實現一個函數,檢驗一個字符串是否符合 xxxx-xx-xx 這樣的日期格式,注意潤年,大小月,不容許用庫函數,儘可能越底層實現越好。(手寫)
  • 咱們是作地圖相關工做的,如今給你提供一個三維的數據,數據描述的是不一樣時間一些地圖上的一些地點座標,分別有時間,x軸座標,y軸座標,請你設計一個算法,可以獲得一天內地圖上的 TOP 10 熱點地區,地區大小也相應的本身做合適調整,開放性題目。
相關文章
相關標籤/搜索