生成器
什麼是生成器:只要在函式體內出現yield關鍵字,那麼再執行函式就不會執行函式**,會得到乙個結果,該結果就是生成器
生成器就是迭代器
yield的功能
yield為我們提供了一種自定義迭代器物件的方法
yield與return的區別:
1.yield可以返回多個值
2.函式暫停和再繼續是由yield幫我們儲存的
只要看見函式裡出現yield,那麼就是生成器
例1:上面我們說到,看見函式裡有yield,那麼就是生成器,生成器又是迭代器,
那麼提到迭代器就要想到xx.__next__()取值方式
deftest():print('*****>1')yield 1
print('*****>2')yield 2
print('*****>3')yield 3g=test() #就相當於乙個容器print(g.__next__())print(g.__next__())print(next(g))
執行結果:
我們知道這種方式取值之後,就會想到相同原理的另乙個簡單方式就是for迴圈
deftest():print('*****>1')yield 1
print('*****>2')yield 2
print('*****>3')yield 3g=test()for i ing:print(i)
執行結果:
例2:將test1的結果被test2呼叫,這是就需要用yield自定義乙個生成器
deftest1():for i in range(10):yield i #把0~9變成生成器返回給函式test1
g = test1() #g是個生成器
deftest2(g):for i ing:print(i)
test2(g)
執行結果:
例3:日誌報錯監控器
importtimedef tail(filepath): #定義乙個檢視檔案的函式
with open(filepath, 'rb') as f: #開啟形參為filepath rb是二進位制讀
f.seek(0,2) #把游標移動到末尾
while true: #迴圈監控日誌
data = f.readline() #讀取檔案末尾
if data: #加入有資料就用yield返回
yielddataelse:#否則就睡眠0.05秒
time.sleep(0.05)def grep(file, k): #定義過濾關鍵字函式
for i in tail(file): #迴圈生成器中的資料
if k in i.decode('utf-8'): #因為是用二進位制讀取方式,所以需要解碼顯示
print(i.decode('utf-8'))
grep('a.txt', '500') #監控a.txt最新日誌,並過濾500的錯誤**
一旦有500出現就會被抓拍到
yield的另一用法,賦值
deftest(name):whiletrue:
foot= yield
print('%s正在吃%s' %(name, foot))
e= test('軒軒') #e是生成器
next(e) #初始化,e.__next__()#e.send(none) #初始化,與上一行二選一
e.send('餃子') #傳送值傳給foot
e.send('冰激凌') #傳送值傳給foot
執行結果:
遞迴呼叫
遞迴呼叫:在呼叫乙個函式的過程中,直接或者間接又呼叫了函式本身,稱之為遞迴呼叫
遞迴必備的2個階段:1遞推,2回溯
例:甲乙丙丁戊,5人吃包子,我們想知道甲吃了幾個包子,但甲說比乙多吃2個,乙說比丙多吃2個,丙說比丁多吃2個,丁說比戊多吃2個,戊說他沒吃,
那麼因為知道戊沒吃,所以根據甲乙丙丁的答案,我們可知甲吃了8個,這樣一來一回的過程就是遞推和回溯
age(甲) = age(乙) + 2
age(乙) = age(丙) + 2
age(丙) = age(丁) + 2
age(丁) = age(戊) + 2
age(戊) = 0
defnum(n):if n == 1:return0return num(n-1) + 2res= num(5)print(res)
執行結果:
middles函式python python 函式
1.特性 1.1.可擴充套件性 1.2.減少 重複 1.3.程式更容易維護 2.函式的引數與區域性變數 2.1.函式裡面的 arges 元組形式儲存,kwarges 字典方式儲存,可以寫成其他,但是 必須寫 2.2.函式裡面入參可以是預設引數,固定引數,位置引數,關鍵字引數,非固定引數的 3.返回值...
discard函式python Python 集合
python 集合讀書之法,在循序而漸進,熟讀而精思。朱熹 集合的概念無序 不能重複 集合中各元素間是無序的,相同元素在集合中唯一存在.即集合是無序組合,它沒有索引和位置的概念,但可變集合中的元素是可以動態新增或者刪除的 集合的型別可變集合 set 不可變集合 frozenset set 函式 可以...
java 遞迴呼叫
遞迴呼叫是呼叫自身的函式,並傳給自身的相應的引數,這一運算過程是一層層的進行的,直到滿足一定條件時,才停止呼叫。遞迴函式的特點 1.函式要直接或間接呼叫自身。2.要有遞迴終止條件檢查,即遞迴終止的條件被滿足後,則不再呼叫自身函式。3.如果不滿足遞迴終止的條件,則呼叫涉及遞迴呼叫的表示式 在呼叫函式自...