day19 生成器 函式遞迴

2022-09-03 18:42:12 字數 2859 閱讀 5262

目錄

二、三元表示式

三、生成式

四、函式的遞迴

前引:上節課思考:多個裝飾器的載入和執行分析

def deco1(func1): #func1=warpper2

res1=func1(*args,**kwargs)

return res1

def deco2(func2):#func2=warpper3

res2=func2(*args,**kwargs)

return res2

def deco3(x):

def outter3(func3): #func3=index

res3=func3(*args,**kwargs)

return res3

return outter3

@deco1

#@deco1 ==>warpper2=deco1(warpper2) ==>warpper2=warpper1

@deco2

#@deco2 ==>warpper3=deco2(warpper3) ==>warpper3=warpper2

@deco3(111)

#deco3(111)=outter3 @outter3==>index = outter3(index)==>index = warpper3

#裝飾器的載入順序,從下到上

#執行順序,從上到下

def index(x,y):

print('from index %s:%s' %(x,y))

yield關鍵字只要出現在函式中,呼叫這個函式不會執行,會返回乙個生成器(自定義迭代器),這裡可以對yield傳值,在函式內通過乙個變數接受這個值

def func(name):

while true:

print(f"我是")

x = yield

print(f"我愛吃")

g = func("hz")

#給函式傳參hz呼叫函式,此時發現函式內有yield關鍵字,掛起函式,函式呼叫的返回值是生成器

g.__next__()#執行迭代器功能查詢下乙個值,執行函式至yield處

g.send("水果")#給yield傳值

#注意:這不是yield的返回值,返回值在函式定義的時候就寫好了

g.send("巧克力")#給yield傳值

>>>我是hz

>>>我愛吃水果

>>>我是hz

>>>我愛吃巧克力

>>>我是hz

三元表示式是一種**簡寫的方式

語法格式:條件成立時執行的** if 條件 else 條件不成立時執行的**

x= 1

y =2

if x > y :

print(x)

else:

print(y)

>>>2

print(x if x>y else y)

>>>2

print(x) if x>y else print(y)

>>>2

1 列表生成式
l = ["a","b","c2","adsa","z"]

#需求:把列表內長度大於1的值新增到新列表new_l中

#基礎做法:

for i in l :

if len(i)>1:

#列表生成式做法:

new_l = [i for i in l if len(i)>1]

2 字典生成式
d = 

#生成乙個新的字典,key是d中的所有key,value為none

#基礎做法:

new_d = {}

for i in d:

new_d[i] = none

#字典生成式做法:

new_d =

3 集合生成式
#生成乙個含有數字1-9的集合

#基礎做法:

set1 = set()

print(type(set1))

for i in range(1,10):

set1.add(i)

#集合生成式做法:

s =

4 生成器表示式
#生成乙個生成器

g = (i for i in range(10) if i >3)

#此刻g內部乙個值都沒

是函式巢狀的一種特殊形式

在呼叫乙個函式的過程中間接或者直接呼叫了本身

#直接呼叫本身

def foo():

foo()

foo()

#間接呼叫本身

def f1():

f2()

def f2():

f1()

f1()

如果我們執行了上述**會發現pycharm在1000次左右遞迴後報錯,因為遞迴本身是一種很危險的行為,如果我們對遞迴不做任何處理讓他永久的呼叫下去會直接造成記憶體溢位。

#需求:生成乙個含有1-10的列表

#for迴圈方式

l=for i in range(1,11):

#函式遞迴方式

if n == 11:

return

else:

n+=1

遞迴的兩個階段

回溯:一層一層呼叫下去

#執行遞迴函式的過程

def func ():

func()

func()

遞推:滿足某種結束條件,結束遞迴呼叫,然後一層一層返回

day19 生成器函式

語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...

day19 生成器函式

語法上和函式類似 生成器函式和常規函式幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回乙個值,而常規函式使用return語句返回乙個值。自動實現迭代器協議 對於生成器,python會自動實現迭代器協議,以便應用到迭代背景中,如for迴圈,sum函式 由於生成器自動...

day19 生成器,迭代器

一 列表解析 l1 雞蛋 s i for i in range 10 if i 5 print l1 雞蛋6 雞蛋7 雞蛋8 雞蛋9 這種方法比較佔記憶體,因為要先生成列表,列表佔記憶體 print sum i for i in range 100000000 這種方法計算 1 10000000 的...