2019-07-12 函數遞歸、二分法、匿名函數、三元表達式、內置函數

1、遞歸函數python

  我理解爲遞歸函數也是函數嵌套的一種,函數在調用時,直接或間接的調用了自身。算法

  簡單的直接調用自己(這種調用會一直循環下去,會很佔內存空間,因此python解釋器爲了防止無限佔用內存,對這種循環作出了限制,循環到必定程度就會自動中止)app

def f1():
    print('f1')
    f1()
f1()

  遞歸調用分爲兩個階段:回溯、遞推ide

  回溯:回溯是外層向裏一層層調用下去。回溯階段必需要有一個明確的結束條件,每次進入下一次遞歸,問題的複雜度都應該下降(不然,單純的重複調用自身是毫無心義的)函數

  遞推:遞推是裏層向外一層層結束遞歸spa

def age(n):
    if n == 1:  # 必需要有結束條件
        return 18
    return age(n-1) + 2
res = age(5)
print(res)

遞歸函數不須要考慮循環的次數,只須要把握結束的條件code

2、算法之二分法blog

  算法:快速高效的解決問題的方法排序

  有這樣一個列表 l =[1,2,3,4,5,6],假如你須要找到數字6,咱們以前的作法是for循環全部數字,而後比較。這種作法對小數據還好,若是是很大的數據,咱們要查找的數據還在最後一個,若是咱們用for循環的方法查找就很影響效率。因此這裏咱們用二分法。遞歸

l = [1,3,5,12,57,89,101,123,146,167,179,189,345]

#快速找到345
tag_num = 344
def get_num(l,tag_num):
    #判斷若是沒有這個數字
    if not l:
        print('沒有這個數字')
        return
    #咱們先須要把列表從小到大排序
    l.sort()
    print(l)
    #咱們先用len的方法先獲取中間值的索引
    num_index = len(l)//2
    #進行比較,若是目標數大於中間數,就往右邊找
    if tag_num > l[num_index]:
        #把右邊的全部數字用切片的方式截取出來
        num = l[num_index+1:]
        get_num(num,tag_num)    #而後咱們把右邊截取出來的列表再從中間分開,接下來的步驟就是重複的
    #截取左邊的數字
    elif tag_num < l[num_index]:
        num = l[0:num_index]
        get_num(num,tag_num)
    else:
        print('find it')

get_num(l,tag_num)
二分法快速找到列表中的數字

3、三元表達式

  三元表達式固定表達式:

  值 1 if 條件 else 值 2

    條件成立   值1

    條件不成立  值2   

  x > y條件成立就返回x 

x = 99999
y = 9898898
res = x if x > y else y
print(res)

    三元表達式不建議嵌套使用,推薦在只有兩種狀況下使用,嵌套多了容易出錯

4、列表生成式

#原始方法,往列表中的每一個元素末尾都加上_sb
l = ['tank','nick','oscar','sean']
l1 = []
for name in l:
    l1.append('%s_sb'%name)
print(l1)

#列表生成式的方法作
l = ['tank','nick','oscar','sean']
#for循環先取出每一個元素i,而後在每一個元素後面加_sb,字符串拼接
res = [ '%s_sb' %i for i in l]
print(res)     #['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

  先for循環取出列表中的每個元素,而後交給if判斷,符合要求的纔會交給for前面的代碼,若是條件不成立當前的元素直接捨棄。

l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
#每一個元素取出來,末尾以_sb結尾的才符合要求加入到列表中
res = [i for i in l if i.endswith('_sb')]

print(res)

5、字典生成式

l1 = ['jason','123','read']
d = {i:j for i,j in enumerate(l1) if j != '123'}   #j不符合,i也會刪除
print(d)    #{0: 'jason', 2: 'read'}

#集合生成式
res = {i for i in range(10) if i!=3}   #條件i不等於3就是成立
print(res)    #{0, 1, 2, 4, 5, 6, 7, 8, 9}
   res1 = (i for i in range(10) if i != 4)  # 這樣寫不是元組生成式 而是生成器表達式

6、匿名函數    沒有名字的函數

  匿名函數的特色:臨時存在用完就沒了

  後面的括號就至關於設置參數,x,y能夠當作函數的形參,x+y能夠當作函數的返回值。

  匿名函數一般不會單獨使用,通常會和內置函數一塊兒使用

res = (lambda x,y:x+y)(5,2)
print(res)

7、內置函數

  max ()  返回最大值    內部是基於for循環的      min()返回最小值

#簡單的
l = [1,2,3,4,5]
print(max(l))


#字典根據最大的value返回對應的key
d = {
    'egon':30000,
    'jason':88888888888,
    'nick':3000,
    'tank':1000
}
print(max(d))   #由於max也是基於for循環的,這個只會返回key

res = max(d,key=lambda name:d[name])
print(res)  #jason    #max還有一個參數,key寫函數根據value來排大小,返回的值是d 
map zip filter sorted reduce

  map()   映射  將傳入的函數依次做用到序列的每一個元素

  這個匿名函數功能是每一個元素都加5,而後放在一個列表中

l = [1,2,3,4,5,6]

print(list(map(lambda x:x+5,l)))    #[6, 7, 8, 9, 10, 11]

  zip()   拉鍊(配對)  若是少了,會匹配最短的那個個數

l1 = [1,2,]
l2 = ['jason','egon','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))    #[(1, 'jason', 'a'), (2, 'egon', 'b')]

  filter()   過濾  基於for循環   把不符合的去掉

l = [1,2,3,4,5,6]
res = filter(lambda x:x!=3,l)
print(list(res))     #[1, 2, 4, 5, 6]

  sorted()  排序     後面加了reverse就是反轉

l = [1,2,3,4,5,6]
res = sorted(l,reverse=True)

print(res)    #[6, 5, 4, 3, 2, 1]

  reduce()   序列求和    必須包含兩個參數,一個是函數,一個是序列,後面若是再加參數就當初始值和序列中的數相加。

from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))   #40#這裏初始值是19,第一次先獲取兩個元素的和19和1,以後每獲取一個與上一次相加的結果再相加
相關文章
相關標籤/搜索