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) @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cls, x)) print(cls:, cls) @staticmethod def 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 n print("完成一次...:") n -= 1for i in myyield(4): print("遍歷得到的值:",i)

3、閉包

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

def delay_fun(x, y): def caculator(): return x+y return 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): @property def score(self): return self._score @score.setter def 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 = applep1 = Apple()p2 = Apple()p1.name = orangeprint(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 ROW BEGIN 執行語句 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:存儲在伺服器端,用於跟蹤會話,安全。


推薦閱讀:

redis 的常用命令
列表生成式版圖片拼接——知乎是喵多還是汪多系列
用Python爬取某網站的圖片到本地時遇到了問題,請問如何解決?

TAG:Python | Python开发 |