一、 閉包python
定義:閉包是由函數及其相關的引用環境組合而成的實體(即:閉包=函數+引用環境)(想一想Erlang的外層函數傳入一個參數a, 內層函數依舊傳入一個參數b, 內層函數使用a和b, 最後返回內層函數)git
代碼:def ExFunc(n):程序員
sum=n正則表達式
def InsFunc():算法
return sum+1編程
return InsFuncjson
二、 裝飾器vim
def debug(func):api
def wrapper():數組
print "[DEBUG]: enter {}()".format(func.__name__)
return func()
return wrapper
@debug
def say_hello():
print "hello!"
三、 迭代器
一、能夠直接做用於for循環的數據類型
第一類:集合數據類型,如list、tuple、dict、set、str等;
第二類:generator,包括集合定義generator和帶yield的generator(也就是generator function)。
以上這些能夠直接做用於for循環的對象統稱爲可迭代對象:Iterable。
可使用isinstance()判斷一個對象是不是Iterable對象:
generator不但能夠做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值了。那麼定義來了,能夠被next()調用並不斷返回下一個值得對象稱爲迭代器(Iterator)
把list、dict、str等Iterable變成Iterator可使用iter()函數
四、 生成器
爲何使用生成式:
更容易使用,代碼量較小內存使用更加高效
五、 描述器
描述器的表現
用到三個魔術方法。__get__() __set__() __delete__()
方法簽名以下:
object.__get__(self,instance,owner)
object.__set__(self,instance,value)
object.__delete__(self,instance)
Self指指代當前實例,調用者。
Instance是owner的實例。
Owner是屬性所屬的類。
典型的描述器:@Property
做用:訪問類和實例的屬性
六、 內置模塊
re(正則)、math(數學)、os(系統)、datetime、sys、json
sys:
sys.argv
功能:在外部向程序內部傳遞參數
sys.exit(n)
功能:執行到主程序末尾,解釋器自動退出,可是若是須要中途退出程序,能夠調用sys.exit函數,帶有一個可選的整數參數返回給調用它的程序,表示你能夠在主程序中捕獲對sys.exit的調用。(0是正常退出,其餘爲異常)
sys.path
功能:獲取指定模塊搜索路徑的字符串集合,能夠將寫好的模塊放在獲得的某個路徑下,就能夠在程序中import時正確找到。
sys.modules
功能:sys.modules是一個全局字典,該字典是python啓動後就加載在內存中。每當程序員導入新的模塊,sys.modules將自動記錄該模塊。當第二次再導入該模塊時,python會直接到字典中查找,從而加快了程序運行的速度。它擁有字典所擁有的一切方法。
七、 列表的用法
函數用法:
cmp :比較兩個列表的元素
len :列表元素個數
max :返回列表元素最大值
min :返回列表元素最小值
list :將元組轉化爲列表
方法:
List.append() 在列表末尾添加新對象
List.count() 統計某個元素在列表中出現的次數
List.extend() 在列表末尾一次性追加另外一個序列中的多個值(用新列表擴展原來的列表)
List.index() 從列表中找出某個值第一個匹配項的索引位置
List.insert() 將對象插入列表
List.pop() 移除列表中的一個元素(默認最後一個元素),而且返回該元素的值
List.remove() 移除列表中某個值的第一個匹配項
List.reverse() 反向列表中元素
List.sort() 對原列表進行排序 reverse=False(默認升序)
.join() 將列表轉化爲字符串
八、 字符串用法
內建函數:
Capitalize() 字符串第一個大寫
Center() 返回一個原字符串居中,並使用空格填充至長度 width 的新字符串
Count(str,beg=0,end=len(string)) 返回 str 在 string 裏面出現的次數,若是 beg 或者 end 指定則返回指定範圍內 str 出現的次數
decode(encoding=’utf-8’) 以 encoding 指定的編碼格式解碼 string,若是出錯默認報一個 ValueError 的 異 常 , 除非 errors 指 定 的 是 'ignore' 或 者'replace'
encode(encoding=’utf-8’) 以 encoding 指定的編碼格式編碼 string,若是出錯默認報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace'
endswith(obj,beg=0,end=len(string)) 檢查字符串是否以 obj 結束,若是beg 或者 end 指定則檢查指定的範圍內是否以 obj 結束,若是是,返回 True,不然返回 False.
expandtabs(tabsize=8) 把字符串 string 中的 tab 符號轉爲空格,tab 符號默認的空格數是 8。
Format() 格式化字符串
Index() 跟find()方法同樣,只不過若是str不在 string中會報一個異常
Isalnum() 若是 string 至少有一個字符而且全部字符都是字母或數字則返回 True,不然返回 False
Isalpha() 若是 string 至少有一個字符而且全部字符都是字母則返回 True,不然返回 False
Isdigit() 若是 string 只包含數字則返回 True 不然返回 False.
Lstrip() 截掉 string 左邊的空格
Replace(str1,str2,num=string.count(str1) 把 string 中的 str1 替換成 str2,若是 num 指定,則替換不超過 num 次
Rstrip() 刪除 string 字符串末尾的空格.
Split(str=’’,num=string.count(str)) 以 str 爲分隔符切片 string,若是 num 有指定值,則僅分隔 num+ 個子字符串
Strip() 在 string 上執行 lstrip()和 rstrip()
九、 排序算法
冒泡排序:時間複雜度O(n^2)
交換排序的一種。其核心思想是:兩兩比較相鄰記錄的關鍵字,若是反序則交換,直到沒有反序記錄爲止。
for i in range(length):
for j in range(i+1, length):
if lis[i] > lis[j]:
self.swap(i, j)
選擇排序:時間複雜度O(n^2)
經過n-i次關鍵字之間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1<=i<=n)個記錄進行交換
for i in range(length):
minimum = i
for j in range(i+1, length):
if lis[minimum] > lis[j]:
minimum = j
if i != minimum:
self.swap(i, minimum)
插入排序:時間複雜度O(n^2)
基本操做是將一個記錄插入到已經排好序的有序表中,從而獲得一個新的、記錄數增1的有序表
# 下標從1開始
for i in range(1, length):
if lis[i] < lis[i-1]:
temp = lis[i]
j = i-1
while lis[j] > temp and j >= 0:
lis[j+1] = lis[j]
j -= 1
lis[j+1] = temp
希爾排序:時間複雜度O(n^(3/2))
"""希爾排序"""
lis = self.r
length = len(lis)
increment = len(lis)
while increment > 1:
increment = int(increment/3)+1
for i in range(increment+1, length):
if lis[i] < lis[i - increment]:
temp = lis[i]
j = i - increment
while j >= 0 and temp < lis[j]:
lis[j+increment] = lis[j]
j -= increment
lis[j+increment] = temp
快速排序:時間複雜度O(nlog(n))
快速排序算法的核心思想:經過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另外一部分記錄的關鍵字小,而後分別對這兩部分繼續進行排序,以達到整個記錄集合的排序目的
while low < high:
while low < high and lis[high] >= pivot_key:
high -= 1
self.swap(low, high)
while low < high and lis[low] <= pivot_key:
low += 1
self.swap(low, high)
二分法查找
算法:二分法查找適用於數據量較大時,可是數據須要先排好順序。主要思想是:(設查找的數組區間爲array[low, high])
十、 Socket編程
Socket服務器編程
主要包括下面的幾步:
1.打開socket
2.綁定到一個地址和端口
3.偵聽進來的鏈接
4.接受鏈接
5.讀寫數據
Socket客戶端編程
主要包括下面的幾步:
1.打開socket
2.鏈接到一個地址和端口
3.讀寫數據
Socket類型
Socket函數
十一、 TCP/UDP
TCP的優勢: 可靠,穩定 TCP的可靠體如今TCP在傳遞數據以前,會有三次握手來創建鏈接,並且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開鏈接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據以前,要先建鏈接,這會消耗時間,並且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,並且要在每臺設備上維護全部的傳輸鏈接,事實上,每一個鏈接都會佔用系統的CPU、內存等硬件資源。 並且,由於TCP有確認機制、三次握手機制,這些也致使TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
UDP的優勢: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,因此它在傳遞數據時很是快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是沒法避免攻擊的,好比:UDP Flood攻擊……
UDP的缺點: 不可靠,不穩定 由於UDP沒有TCP那些可靠的機制,在數據傳遞時,若是網絡質量很差,就會很容易丟包。
小結TCP與UDP的區別:
1.基於鏈接與無鏈接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
何時應該使用TCP: 當對網絡通信質量有要求的時候,好比:整個數據要準確無誤的傳遞給對方,這每每用於一些要求可靠的應用,好比HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在平常生活中,常見使用TCP協議的應用以下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸 ………… 何時應該使用UDP: 當對網絡通信質量要求不高的時候,要求網絡通信速度能儘可能的快,這時就可使用UDP。 好比,平常生活中,常見使用UDP協議的應用以下: QQ語音 QQ視頻 TFTP ……
有些應用場景對可靠性要求不高會用到UPD,好比長視頻,要求速率
十二、 HTTP/HTTPS協議
HTTP:是互聯網上應用最爲普遍的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小。
HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。
HTTPS協議的主要做用能夠分爲兩種:一種是創建一個信息安全通道,來保證數據傳輸的安全;另外一種就是確認網站的真實性。
區別
一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。
二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。
三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
1三、 高階函數
Map()、filter()、zip()、reduce()、sorted()、lambda函數
1四、 深/淺拷貝
淺拷貝:拷貝表面層,更深的層次引用原來地址的
深拷貝:拷貝全部,內存中開闢新地址
1五、 面向對象編程(OOP)
1六、 元類
全部類的父類,定義的新類能夠當作元類的實例
1七、 正則
功能函數:
compile() 編譯正則表達式模式,返回一個對象的模式
match() 只匹配字符串的開始,若是開始不匹配,函數返回None
search() 在整個字符串中尋找,找到返回,匹配不成功返回None
findall() 遍歷匹配,能夠獲取字符串中全部匹配的字符串,返回一個列表
finditer() 搜索string,返回一個順序訪問每個匹配結果(Match對象)的迭代器。找到 RE 匹配的全部子串,並把它們做爲一個迭代器返回
貪婪匹配和費貪婪匹配
前面的*,+,?等都是貪婪匹配,也就是儘量匹配,後面加?號使其變成惰性匹配
\d 數字:[0-9]
\D 非數字:[^\d]
\s 匹配任何空白字符:[<空格>\t\r\n\f\v]
\S 非空白字符:[^\s]
\w 匹配包括下劃線在內的任何字字符:[A-Za-z0-9_]
\W 匹配非字母字符,即匹配特殊字符
\A 僅匹配字符串開頭,同^
\Z 僅匹配字符串結尾,同$
\b 匹配\w和\W之間,即匹配單詞邊界匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 能夠匹配"never" 中的 'er',但不能匹配 "verb" 中的'er'。
\B [^\b]
. 匹配任意除換行符"\n"外的字符(在DOTALL模式中也能匹配換行符
\ 轉義字符,使後一個字符改變原來的意思
l 匹配前一個字符0或屢次
+ 匹配前一個字符1次或無限次
? 匹配一個字符0次或1次
1八、 __new__ 和 __init__的區別
一、 繼承自object的新式類纔有__new__
二、 __new__至少要有一個參數cls,表明當前類,此參數在實例化時由Python解釋器自動識別
三、 __new__必需要有返回值,返回實例化出來的實例,這點在本身實現__new__時要特別注意,能夠return父類(經過super(當前類名, cls))__new__出來的實例,或者直接是object的__new__出來 的實例
四、 __init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上能夠完成一些其它初始化的動做,__init__不須要返回值
1九、 線程、進程和協程
線程:輕量級進程,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個 進程的其它線程共享進程所擁有的所有資源
使用threading這個高級模塊
多個線程訪問同一資源時須要加線程鎖lock
獲取鎖:lock.acquire()
釋放鎖:lock.release()
進程:進程是一個實體。每個進程都有它本身的地址空間
建立進程的類:process
協程:一個程序能夠包含多個協程,能夠對比與一個進程包含多個線程,於是下面咱們來比較協程和線程。咱們知道多個線程相對獨立,有本身的上下文,切換受系統控制;而協程也相對獨立,有本身的上下文,可是其切換由本身控制,由當前協程切換到其餘協程由當前協程來控制。
優勢:IO資源、減小callback的使用
用第三方庫 gevent 來支持協程。gevent用到的主要模式是greenlet
20、 內存管理
一、 Python引入了一個機制:引用計數
二、 垃圾回收機制:當引用計數爲0時,調用__del__方法
注意:
一、垃圾回收時,Python不能進行其它的任務,頻繁的垃圾回收將大大下降Python的工做效率;
二、Python只會在特定條件下,自動啓動垃圾回收(垃圾對象少就不必回收)
三、當Python運行時,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數。當二者的差值高於某個閾值時,垃圾回收纔會啓動。
三、內存池機制
Python中有分爲大內存和小內存:(256K爲界限分大小內存)
一、大內存使用malloc進行分配
二、小內存使用內存池進行分配
三、Python的內存池(金字塔)
2一、 random.shuffle(lst):將列表中的元素打亂,洗牌
random.random():生成一個0-1之間的隨機浮點數.
random.uniform(a, b):生成[a,b]之間的浮點數.
2二、 實現單例模式
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
rerurn cls._instance
class A(Singleton):
pass
# 類A即爲單例類
二、 使用裝飾器
def singleton(cls):
instance = {}
def wapper():
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wapper
@singleton
class C:
pass
# 類C即爲單例類
2三、 實現一個斐波那契數列的生成器
# def fib(n):
# a, b = 0, 1
# for _ in range(n):
# a, b = b, a + b
# yield a
#
# def main():
# for val in fib(20):
# print(val)
# if __name__ == '__main__':
# main()
2四、 一行帶實現1-100之和
sum(range(0,100))
2五、 python中的GIL
2六、 列表去重(經過集合set)
2七、 Python2和python3的區別
一、 print
p2中print當作一個類使用,p3中print當作一個函數使用
二、 input()
p2中input接收到的類型爲int,p3中input接收到的類型爲str
三、 Unicode
Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型
四、 不等運算符
Python 2.x中不等於有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法
五、 數據類型
Py3.X去除了long類型,如今只有一種整型——int,
新增了bytes類型,對應於2.X版本的八位串
2八、 python中的斷言
關鍵字:assert
Assert後面跟合法的表達式,當表達式爲True是,不作任何操做,爲False時回拋出異常,assert能夠快速定位代碼中的錯誤
2九、 with方法打開文件實現了關閉的功能
30、 Linux經常使用命令
ls、cd、vim、mkdir、pwd、rm、rmdir、mv、cp、cat、find、head、history、tail、grep、chmod、tar、ps、top、kill、free、