【乾貨收藏】Python面試指南大全

收拾了一下自己學習Python過程中的筆記,將Python面試過程中經常涉及到的一些問題整理出來。沒有總結到的知識點,歡迎大家在評論里提出來,本文長期更新。

1、Python基本語法

1、@staticmethod 和 @classmethod

Python中有三種方法,實例方法、類方法(@classmethod)、靜態方法(@staticmethod)。

類方法的第一個參數是cls,表示該類的一個實例,靜態方法基本上和一個全局函數相同

class A(object):def foo(self, x):print("executing foo(%s,%s)" % (self, x))print("self:", self) @classmethoddef class_foo(cls, x):print("executing class_foo(%s,%s)" % (cls, x))print("cls:", cls) @staticmethoddef static_foo(x):print("executing static_foo(%s)" % x)a = A()print(a.foo(1))print(a.class_foo(1))print(a.static_foo(1))

2、迭代器和生成器

迭代器:是訪問集合元素的一種方式,從集合的第一個元素開始訪問,直到所有元素被訪問結束。其優點是不需要事先準備好整個迭代過程中的所有元素,僅在迭代到某個元素時才開始計算該元素。適合遍歷比較巨大的集合。__iter__():方法返回迭代器本身, __next__():方法用於返回容器中下一個元素或數據。

生成器:帶有yield的函數不再是一個普通函數,而是一個生成器。當函數被調用時,返回一個生成器對象。不像一般函數在生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行狀態。

"""迭代器"""print("for x in iter([1, 2, 3, 4, 5]):")for x in iter([1, 2, 3, 4, 5]):print(x)"""生成器"""def myyield(n):while n>0:print("開始生成...:")yield nprint("完成一次...:")n -= 1for i in myyield(4):print("遍歷得到的值:",i)

3、閉包

閉包可以實現先將一個參數傳遞給一個函數,而並不立即執行,以達到延遲求值的目的。滿足以下三個條件:必須有一個內嵌函數;內嵌函數必須引用外部函數中變數;外部函數返回值必須是內嵌函數。

def delay_fun(x, y):def caculator():return x+yreturn caculatorprint("返回一個求和的函數,並不求和")msum = delay_fun(3,4)print("調用並求和:")print(msum())

4、*args 和 **kwargs

這兩個是Python中的可變參數,用於接受參數的傳遞。*args表示任何多個無名參數,它是一個元組,**kwargs表示關鍵字參數,它是一個字典。同時使用*args和**kwargs時,必須*args在**kwargs之前。

5、鴨子類型:

在鴨子類型中,關注的不是對象的類型本身,而是他是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個函數,它接受一個類型為鴨的對象,並調用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函數可以接受一個任意類型的對象,並調用它的走和叫方法。

class duck():def walk(self):print("I am duck,I can walk...")def swim(self):print("I am duck,I can swim...")def call(self):print("I am duck,I can call...")duck1=duck()duck1.walk()# I am duck,I can walk...duck1.call() # I am duck,I can call...

6、@property 和 @setter

@property負責把一個方法變成屬性調用。在對實例操作時,不暴露介面,而是通過getter和setter方法實現。

class Student(object): @propertydef score(self):return self._score @score.setterdef score(self, value):if not isinstance(value, int):raise ValueError("score must be an intager")if value<0 or value>100:raise ValueError("score must between 0~100!")self._score = values = Student()s.score = 60print(s.score)s.score = 999print(s.score)

7、多進程和多線程

進程:是資源分配的最小單位,創建和銷毀開銷較大;

線程:是CPU調度的最小單位,開銷小,切換速度快;

操作系統將CPU時間片分配給多個線程,每個線程在指定放到時間片內完成。操作系統不斷從一個線程切換到另一個線程執行,宏觀上看就好像是多個線程一起執行。

Python中由於全局鎖 (GIL) 的存在導致,同一時間只有一個獲得GIL的線程在跑,其他線程則處於等待狀態,這導致了多線程只是在做分時切換,並不能利用多核。

多線程與多進程的區別:(1)多進程中同一個變數各自有一份拷貝在每個進程中,互不影響;(2)多線程中,所有變數都由所有線程共享,任何一個變數都可被任何一個線程修改。線程之間共享數據的最大危險在於多個線程同時更改一個變數,把內容改亂。

from multiprocessing import Pool #多進程from multiprocessing.dummpy import Pool #多線程

8、類變數和實例變數

普通的變數(非類的變數),在被賦值後即變數存在。類的變數在class里def外,通過變數名能被賦值,在def里通過類對象可被賦值

class Apple(object):name = "apple"p1 = Apple()p2 = Apple()p1.name = "orange"print(p1.name)print(p2.name)

9、裝飾器

裝飾器是一個工廠函數,接受一個函數作為參數,然後返回一個新函數,其閉包中包含被裝飾的函數。有了裝飾器,可以提取大量函數中與本身功能無關的類似代碼 ( 這塊在Flask中用於定義路由的@app.route,就是一個很好的例子),達到代碼重用的目的。可應用於插入日誌、性能測試、事務處理等方面。

def deco(func):def warpper(*args, **kwargs):print("start")func(*args, **kwargs)print("end")return warpper@decodef myfunc(parameter):print("run with %s" % parameter)myfunc("something")

2、資料庫

1、MySQL基本語法

增:創建數據表

USE database CREATE TABLE example(id INT,name VARCHAR(20),sex BOOLEAN);

刪:

ALTER TABLE 表名 DROP 屬性名; # 刪除欄位DROP TABLE 表名; # 刪除表

改:

ALTER TABLE 舊錶名 RENAME 新表名; # 修改表名ALTER TABLE 表名 MODIFY 屬性名 數據類型; # 修改欄位數據類型

查:

SELECT * FROM 表名 WHERE id=1; # 條件查詢SELECT * FROM 表名 WHERE 欄位名 BETWEEN 條件一 AND 條件二 # 範圍查詢SELECT COUNT(*) FROM 表名; # 查詢表共有多少條記錄

觸發器:是由INSERT、UPDATE和DELETE等事件來觸發某種特定操作,滿足觸發條件時,資料庫系統會執行觸發器中定義的語句,這樣可以保證某些操作之間的一致性。

CREATE TRIGGER 觸發器名稱 BEFORE|AFTER 觸發事件ON 表名稱 FOR EACH ROWBEGIN執行語句END

3、演算法

1、快排

演算法:先從數列中取出一個數作為基準;然後將比該數大的數放到右邊,比該數小的數放到左邊;再對左右區間重複上一步驟。

def qsort(seq):if seq==[]:return []else:pivot=seq[0]lesser=qsort([x for x in seq[1:] if x<pivot])greater=qsort([x for x in seq[1:] if x>=pivot])return lesser+[pivot]+greaterif __name__=="__main__":seq=[5,6,78,9,0,-1,2,3,-65,12]print(qsort(seq))

2、冒泡

演算法:每次比較兩個相鄰的元素,然後進行排列。但是效率非常低。

def bubbleSort(nums):for i in range(len(nums)-1): # 這個循環負責設置冒泡排序進行的次數for j in range(len(nums)-i-1): # j為列表下標if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]return numsnums = [5,2,45,6,8,3,1]print(bubbleSort(nums))

4、網路

1、post 和 get方法區別

GET:瀏覽器告知伺服器,只獲取頁面上的信息,請求的參數加到url後面;

POST:瀏覽器告知伺服器,想在URL上發布新的信息,並且伺服器必須確保數據已經存儲且僅存儲一次。這是html表單發送數據到伺服器的方法。提交的數據放到data或body中,不能放到url中。

2、Cookie 和 Session

Cookie:存儲在客戶端,用於跟蹤會話,保存用戶偏好設置和用戶名密碼等,不安全;

Session:存儲在伺服器端,用於跟蹤會話,安全。

-------------------------------------------

作者:趙宏田

出處:Python爬蟲實戰

知乎專欄:Python爬蟲實戰

最近很多人私信問我問題,平常知乎評論看到不多,如果沒有及時回復,大家也可以加小編微信:tszhihu,進知乎大數據分析挖掘交流群,可以跟各位老師互相交流。謝謝。


推薦閱讀:

《利用數據改進醫療質量指南》
若當時你也在泰坦尼克號上,能否活下來嗎?
知乎探索(二)——封禁用戶是誰?
打造數據科學作品集:用數據講故事

TAG:Python | 面试 | 数据分析 |