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爬取某網站的圖片到本地時遇到了問題,請問如何解決?