python面試題

Python 基礎

1.什麼是閉包

函數a中定義函數b,函數b使用函數a的變量就叫閉包html

def a():
    a1 = 1
    a2 = 2

    def b():
        b1 = a1 + a2
        return b1

    return b

 

2.簡述生成器, 迭代器, 可迭代對象

生成器

函數內部有yield關鍵字python

生成器的編寫方法和函數定義相似, 只是把return改成yield

生成器中能夠有多個yield, 當生成器遇到yield時, 會暫停運行生成器, 返回yield後面的值.當再次調用的時候,會從剛纔暫停的地方繼續運行,直到下一個yield.

生成器自身又構成一個迭代器, 每次迭代時使用一個yield返回的值


應用場景

    range/xrange
        - py2: range(10000) 會當即建立 / xrange(10000) 生成器
        - py3: range(10000) 生成器
    
    redis獲取值
        def hscan_iter(self, name, match=None, count=None):
      """
      Make an iterator using the HSCAN command so that the client doesn't
      need to remember the cursor position.

      ``match`` allows for filtering the keys by pattern

      ``count`` allows for hint the minimum number of returns
      """
      cursor = '0'
      while cursor != 0:
        # 去redis中獲取數據:12
        # cursor,下一次取的位置
        # data:本地獲取的12條數數據
        cursor, data = self.hscan(name, cursor=cursor,match=match, count=count)
        for item in data.items():
          yield item
View Code

迭代器

類的內部實現__iter__和__next__方法redis

迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引起StopIteration。
在for循環中,Python將自動調用工廠函數iter()得到迭代器,自動調用next()獲取元素,還完成了檢查StopIteration異常的工做。
本身實現迭代器, 只須要在類的__iter__方法中返回一個對象,這個對象擁有一個next()方法,這個方法能在恰當的時候拋出StopIteration異常便可。

class test:
    def __init__(self, input_list):
        self.list = input_list
        self.i = 0

    def __iter__(self):
        return self
    
    def __next__(self):
        if self.i == len(self.list):
            self.i = 0
            raise StopIteration
        self.i += 1
        return  self.list[self.i - 1]

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會形成內存的過大開銷。
可是須要本身實現迭代器的時候很少,即便須要,使用生成器會更輕鬆。
View Code

可迭代對象

一個類的內部實現__iter__方法且返回一個迭代器數據庫

可使用for...in...語句進行循環的對象,好比字符串、列表、元組、字典以及迭代器、生成器都是可迭代對象。瀏覽器

總結

1.迭代器必定是迭代對象,迭代對象不必定是迭代器服務器

2.生成器必定是迭代器,迭代器不必定是生成器cookie

3.使用for...in...來遍歷迭代對象是最經常使用的方式網絡

3.什麼是異步IO?

遇到IO不等待session

網絡相關

1.http協議是什麼?

中文名叫 超文本傳輸協議 基於TCP來傳遞數據, 請求響應以後斷開鏈接(無狀態, 短連接)閉包

本質就是定義了傳輸數據的格式

客戶端發送一個HTTP請求到服務器的請求消息格式:

請求行(request line)  請求頭(header)  空行   請求體 四個部分組成

2.訪問一次網頁經歷了什麼過程?

輸入url - DNS解析 - 發起TCP請求 - 創建TCP鏈接後, 瀏覽器向服務器發送HTTP請求 - (負載均衡) - 服務端響應HTTP, 將請求的數據返回 - 瀏覽器釋放TCP鏈接 - 瀏覽器渲染

圖示:

3.tcp三次握手和四次揮手

******** 三次握手 **************

第一次        客戶端向服務端發起一次創建鏈接的請求,併產生一個 SYN(同步序列號)
第二次        服務端收到請求,確認客戶端的SYN, 而後本身也發送一個SYN
第三次        客戶端收到服務器發的SYN, 向服務器發送一個確認包,發送完畢以後創建TCP鏈接

******** 四次揮手 **************

第一次        客戶端向服務端發起斷開鏈接的請求
第二次        服務端向客戶端確認請求
第三次        服務端斷開客戶端鏈接,發送一個斷開鏈接請求
第四次        客戶端向服務端缺點斷開請求

4.cookie和session是什麼

因爲HTTP是一次響應一次請求. 爲了保持會話有了cookie和session

cookie保存在瀏覽器 

session保存在服務端

併發相關

1.簡述進程,線程和協程

# 進程

進程就是正在運行的程序,擁有本身獨立內存空間

# 線程

線程是操做系統進行運算調度的最小單位, 共享堆, 不共享棧

被包含在進程中, 是進程中實際運做的單位,一個進程中最少又一個線程運行

# 協程

協程是人爲定義的,使用協程避免無心義的調度,由此能夠提升性能

一個線程中能夠有多個協程, 一個進程也能夠單獨擁有多個協程

進程線程都是同步機制, 協程是異步

2.python中怎麼使用協程

經過yield關鍵字

使用greenlet/ gevent 模塊

詳細參考
    https://blog.csdn.net/andybegin/article/details/77884645
    https://www.cnblogs.com/gide/p/6187080.html

3.進程之間怎麼傳遞數據

經過隊列

from multiprocessing import Process, Queue

經過過管道

from multiprocessing import Process, Pipe

數據庫相關

1.redis數據類型

string(字符串)  hash(哈希)  list(列表)  set(集合)  zset(有序集合)

2.關係型數據庫分表要素

不分表會變慢查找速度

框架相關

其餘

1.手寫一下二分排序

def foo(find, lis):
    
    lis = sorted(lis)
    min = 0
    max = len(lis)

    while(min<max):
        
        mid = int((max+min)/2)
        
        if lis[mid] == find:
            print('od')
            return mid
        elif lis[mid] > find:
            max = mid
        else:
            min = mid

    return None
View Code
相關文章
相關標籤/搜索