【目錄】
運算式與生成式-匿名函式-函式遞回
運算式/生成式
三元運算式
【語法】
res = 條件成立時回傳的值 if 條件 else 條件不成立時回傳的值
【栗子】
針對下述場景def max2(x,y):
if x > y:
return x
else:
return yres = max2(1,2)
用三元運算式可以一行解決x=1
y=2
res = x if x > y else y # 三元運算式
串列生成式
串列生成式用來快速生成串列
【語法】
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]#類似于--for 回圈
res=[]
for item1 in iterable1:
if condition1:
for item2 in iterable2:
if condition2
...
for itemN in iterableN:
if conditionN:
res.append(expression)
【栗子】
egg_list=[]
for i in range(10):
egg_list.append('雞蛋%s' %i)用串列生成式可以一行解決:
egg_list=['雞蛋%s' %i for i in range(10)]
生成器運算式
創建一個生成器物件有兩種方式,一種是呼叫帶yield關鍵字的函式,
另一種就是生成器運算式,與串列生成式的語法格式相同,只需要將[]換成()
【語法】
(expression for item in iterable if condition)
對比串列生成式回傳的是一個串列,生成器運算式回傳的是一個生成器物件
對比串列生成式,生成器運算式的優點自然是節省記憶體
(一次只產生一個值在記憶體中)
栗子
#2、示例:
生一筐雞蛋變成給你一只老母雞,用的時候就下蛋,這也是生成器的特性
>>> chicken=('雞蛋%s' %i for i in range(5))
>>> chicken
<generator object <genexpr> at 0x10143f200>
>>> next(chicken)
'雞蛋0'
>>> list(chicken) #因chicken可迭代,因而可以轉成串列
['雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4',]
如果我們要讀取一個大檔案的位元組數,應該基于生成器運算式的方式完成with open('db.txt','rb') as f:
nums=(len(line) for line in f)
total_size=sum(nums) # 依次執行next(nums),然后累加到一起得到結果=
函式遞回
函式嵌套呼叫
函式不僅可以嵌套定義,還可以嵌套呼叫,即在呼叫一個函式的程序中,函式內部又呼叫另一個函式
函式遞回呼叫
函式的遞回呼叫指的是在呼叫一個函式的程序中又直接或間接地呼叫該函式本身
栗子
在呼叫f1的程序中,又呼叫f1,這就是直接呼叫函式f1本身def f1():
print('from f1')
f1()
f1()
在呼叫f1的程序中,又呼叫f2,而在呼叫f2的程序中又呼叫f1,這就是間接呼叫函式f1本身def f1():
print('from f1')
f2()def f2():
print('from f2')
f1()f1()
遞回
一個遞回的程序,可以分為兩個階段:回溯和遞推,
回溯--》尋找開始遞推的條件
遞推--》從條件出發,推導結果
使用遞回,我們只需要分析出要重復執行的代碼邏輯,然后提取進入下一次遞回呼叫的條件或者說遞回結束的條件即可,代碼實作起來簡潔清晰
遞回本質就是在做重復的事情,所以理論上遞回可以解決的問題回圈也都可以解決,只不過在某些情況下,使用遞回會更容易實作,
比如有一個嵌套多層的串列,要求列印出所有的元素,代碼實作如下items=[[1,2],3,[4,[5,[6,7]]]]
def foo(items):
for i in items:
if isinstance(i,list): #滿足未遍歷完items以及if判斷成立的條件時,一直進行遞回呼叫
foo(i)
else:
print(i,end=' ')foo(items) #列印結果1 2 3 4 5 6 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165606.html
標籤:Python
