函數a中定義函數b,函數b使用函數a的變量就叫閉包html
def a(): a1 = 1 a2 = 2 def b(): b1 = a1 + a2 return b1 return b
函數內部有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
類的內部實現__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] 使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會形成內存的過大開銷。 可是須要本身實現迭代器的時候很少,即便須要,使用生成器會更輕鬆。
一個類的內部實現__iter__方法且返回一個迭代器數據庫
可使用for...in...語句進行循環的對象,好比字符串、列表、元組、字典以及迭代器、生成器都是可迭代對象。瀏覽器
1.迭代器必定是迭代對象,迭代對象不必定是迭代器服務器
2.生成器必定是迭代器,迭代器不必定是生成器cookie
3.使用for...in...來遍歷迭代對象是最經常使用的方式網絡
遇到IO不等待session
中文名叫 超文本傳輸協議 基於TCP來傳遞數據, 請求響應以後斷開鏈接(無狀態, 短連接)閉包
本質就是定義了傳輸數據的格式
客戶端發送一個HTTP請求到服務器的請求消息格式:
請求行(request line) 請求頭(header) 空行 請求體 四個部分組成
輸入url - DNS解析 - 發起TCP請求 - 創建TCP鏈接後, 瀏覽器向服務器發送HTTP請求 - (負載均衡) - 服務端響應HTTP, 將請求的數據返回 - 瀏覽器釋放TCP鏈接 - 瀏覽器渲染
圖示:
******** 三次握手 ************** 第一次 客戶端向服務端發起一次創建鏈接的請求,併產生一個 SYN(同步序列號) 第二次 服務端收到請求,確認客戶端的SYN, 而後本身也發送一個SYN 第三次 客戶端收到服務器發的SYN, 向服務器發送一個確認包,發送完畢以後創建TCP鏈接 ******** 四次揮手 ************** 第一次 客戶端向服務端發起斷開鏈接的請求 第二次 服務端向客戶端確認請求 第三次 服務端斷開客戶端鏈接,發送一個斷開鏈接請求 第四次 客戶端向服務端缺點斷開請求
因爲HTTP是一次響應一次請求. 爲了保持會話有了cookie和session
cookie保存在瀏覽器
session保存在服務端
進程就是正在運行的程序,擁有本身獨立內存空間
線程是操做系統進行運算調度的最小單位, 共享堆, 不共享棧
被包含在進程中, 是進程中實際運做的單位,一個進程中最少又一個線程運行
協程是人爲定義的,使用協程避免無心義的調度,由此能夠提升性能
一個線程中能夠有多個協程, 一個進程也能夠單獨擁有多個協程
進程線程都是同步機制, 協程是異步
經過yield關鍵字
使用greenlet/ gevent 模塊
詳細參考 https://blog.csdn.net/andybegin/article/details/77884645 https://www.cnblogs.com/gide/p/6187080.html
經過隊列
from multiprocessing import Process, Queue
經過過管道
from multiprocessing import Process, Pipe
string(字符串) hash(哈希) list(列表) set(集合) zset(有序集合)
不分表會變慢查找速度
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