1 什麼是函數遞歸
函數遞歸調用(是一種特殊的嵌套調用):在調用一個函數的過程當中,又直接或間接地調用了該函數自己算法
遞歸就是一個重複的過程,本身調用本身:app
寫一個死循環函數
def bar(): print('from bar') foo() def foo(): print('from foo') bar() bar() #代碼報錯。超過系統最大深度
寫一個簡單的遞歸:spa
def bar(): print('from bar') foo() def foo(): print('from foo') bar()
遞歸的應用場景:3d
只知道最後一我的的年齡,依次推測年齡code
def age(n): if n == 1: return 26 return age(n-1) + 2 print(age(5))
寫出遞歸的一個總結:明確遞歸的概念,遞歸就是本身調用本身。先寫一個基本的循環,而後再明確一個結束的條件。blog
查看系統默認內遞歸的最大層數:排序
import sys print(sys.getrecursionlimit())#大概在998左右
手動指定遞歸的最大深度:遞歸
sys.setrecursionlimit(3000)
手動經過遞歸函數查看最大深度:索引
def func1(n): print('from func1',n) func1(n+1) func1(1)
循環打印取出嵌套列表中的值
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] l1=[] def num(l): for i in l: if type(i) is int: l1.append(i) else: num(i) num(l)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
兩種函數頂替的方式:
1.pas 2....(英文狀態下的三個省略號)
def index(): pass index def index(): ... index
總結:
遞歸必需要有兩個明確的階段:
遞推:一層一層遞歸調用下去,強調每進入下一層遞歸問題的規模都必須有所減小
回溯:遞歸必需要有一個明確的結束條件,在知足該條件時結束遞推
開始一層一層回溯
遞歸的精髓在於經過不斷地重複逼近一個最終的結果
2、二分查找算法
二分查找算法 必須處理有序的列表
3、三元表達式:就是一個簡寫形式
三元表達式僅應用於:
一、條件成立返回 一個值
二、條件不成立返回 一個值
res=x if x > y else y
print(res)
三元表達式前的引導:
def max(x,y): if x>y: return x else: return y res=max(10,20) print(res)
三元表達式爲:res= x if x>y else y
def max2(x,y): return x if x>y else y print(max2(10,11))
4、列表生成式
和三元表達式同樣都是個簡寫的過程
首先,給一個列表中的每一個值加上‘_sb’的字樣
看看無列表生成式的樣子:方法1
l=['wuxi','sll','zdq','abc'] a=[] for i in l: a.append('%s_sb'%i) print(a)
先定義一個空列表。而後循環取值,將通用格式:i_sb用格式化輸入的方式寫入新的列表
方法2:
a.append(i+'_sb')
列表生成式是如何簡寫的
l=['wuxi','sll','zdq','abc'] res=['%s_DSB'%name for name in l ] print(res)
#把循環出來的每個值賦值給前面的name
列表生成器挑選後綴是_NB的人。注意for後面的name和賦值的name是同一個。
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'] res=[name for name in l if name.endswith('_sb')] print(res)
注意,加IF判斷的列表生成式不支持加else的狀況
5、字典生成式
l1 = ['name','password','hobby'] l2 = ['jason','123','DBJ','egon']
顧名思義就是生成字典。在案例中將兩個列表的值一一對應放入字典中。
思路:將兩個列表中的值取出來,再存入字典。
for循環取值l1的值,然而還需取l2的值,想到enumerate的做用是for循環取值的同時能夠打印對應的索引,而該索引也能夠用在l2上,最後經過d[k]=value的形式爲字典賦值
d={} for j,k in enumerate(l1): d[k]=l2[i] print(d)
字典生成式
res={i,j for i,j in enumerate(l1)}
print(res)
字典生成式排除列表的某一項
res={i:j for i,j in enumerate(l1) if j !='name'} print(res)
但此時的字典和之前不同。
6、匿名函數
沒有名字的函數。用於臨時使用,用完就清除
通常函數形式:(寫一個相加函數)
def sum(x,y): return x+y
用匿名函數來寫:
與列表、字典生成式相同,都須要一個變量來接收返回值 lamdba函數的寫法是寫成一行 res=(lamdba x,y :x+y) print(res) 匿名函數的執行代碼 執行lamdba函數只需在後面加括號以及參數便可 res=(lamdba x,y :x+y)(10,20)#別忘了lamdba也是函數,加括號就能夠調用 print(res)
也就是說,平時函數怎麼寫,匿名寫法也是同樣,知識寫成一行,調用寫在後面便可
注意:匿名函數須要和內置函數一同使用。
補充一個知識點:A—Z(65,90),A的arsic碼最小
a—z(97,122)a的arsic碼最小。經過以下方法能夠查詢
下面就是一些內置函數。
7、內置函數
map映射
l = [1,2,3,4,5,6] # print(list('hello')) print(list(map(lambda x:x+5,l))) # 基於for循環
zip拉鍊
filter過濾。從列表中獲取值,再過濾
sorted排序。
reduce