函數遞歸、二分法、三元表達式、列表表達式、字典表達式、匿名函數以及經常使用內置函數

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

相關文章
相關標籤/搜索