遞迴呼叫python python生成器,遞迴呼叫

2021-10-11 12:18:27 字數 2180 閱讀 1585

生成器

什麼是生成器:只要在函式體內出現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.如果不滿足遞迴終止的條件,則呼叫涉及遞迴呼叫的表示式 在呼叫函式自...