1. 程式人生 > >python摸爬滾打之day14----內建函式,遞迴函式

python摸爬滾打之day14----內建函式,遞迴函式

1、匿名函式

 用一句話實現的簡單函式.

  ret = lambda x : x ** 2      即 函式名 = lambda 形參 : 返回值

  print(ret(5))  ----> 25

2、sorted()  ----> 排序函式

  sorted(iterable, key=func,reverse=False)

    將可迭代物件的每一個元素傳遞給func, 然後根據func的返回值進行排序, reverse預設為False.

1 lst = [ {'id':1,'name
':'alex','age':28}, 2 {'id':2,'name':'taibai','age':58}, 3 {'id':3,'name':'taihei','age':18}, 4 {'id':4,'name':'henhei','age':38}] 5 ret = sorted(lst,key=lambda x: x["age"]) #按年齡排序 6 print(ret)
sorted()

3、filter()  ----> 篩選函式

  filter(func,iterable)

    將可迭代物件的每一個元素傳遞給func, 然後根據func的返回值對可迭代物件的元素進行處理, 篩選出返回值為True的元素, filter結果是一個filter物件(可迭代的),

用list().

1 lst = [ {'id':1,'name':'alex','age':28},
2         {'id':2,'name':'taibai','age':58},
3         {'id':3,'name':'taihei','age':18},
4         {'id':4,'name':'henhei','age':38}] 
5 print(list(filter(lambda x: x["age"] > 20, lst)))   # 將年齡超過20歲的篩除
6 
7 # [{'id': 1, 'name': 'alex', 'age': 28}, 
8 # {'id': 2, 'name': 'taibai', 'age': 58}, 9 # {'id': 4, 'name': 'henhei', 'age': 38}]
filter()

4、map()  ----> 對映函式

  map(func, iterable)

    將可迭代物件的每一個元素傳遞給func,  進行統一操作, 並返回一個新列表. map結果是一個map物件(可迭代的), 用list().

1 lst = [ {'id':1,'name':'alex','age':28},
2         {'id':2,'name':'taibai','age':58},
3         {'id':3,'name':'taihei','age':18},
4         {'id':4,'name':'henhei','age':38}]
5 print(list(map(lambda x: x["age"] - 5,lst)))    # 執行結果是一個新列表
6 
7 # [23, 53, 13, 33]
map()

5、reduce()  ----> 累積函式

  import functools import reduce

  reduce(func, iterable)

    將可迭代物件的前後兩個引數傳給func, 進行函式操作, 然後將前後兩個引數運算得到的結果作為第一個引數, 列表的後一個引數作為第二個引數, 繼續往復func的操作, 得到的是一個具體的結果.

1 print(reduce(lambda x,y: x + y,range(1,10),100))
2 # 100作為起始值
3 
4 
5 # 145
reduce()

6、遞迴

  即 自身呼叫自身. 遞迴的最大遞迴深度為1000次, 但是永遠達不到1000. 

  注意: 函式在函式體內部呼叫自身時, 也會建立一個新的名稱空間, 遞迴次數越多, 則佔據的空間記憶體就越大, 能不用遞迴就不用遞迴. 所以函式體內一定要有return 返回值, 不然拿到的結果為(None).

1 def func(n):
2     if n == 1:
3         return 1
4     return n * func(n - 1)     # 用遞迴實現階乘
5 
6 print(func(10))
遞迴

7、用二分法實現查詢某元素(重中之重)

  優點 : 效率會非常高, 每次能夠排除掉一半的資料.

  缺點 : 前提是列表為有序列表.

  一: 普通,非遞迴,非列表切片

 1 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
 2 
 3 left = 0
 4 right = len(lst)-1
 5 inp = int(input("輸入數字: "))
 6 while left <= right:
 7     mid = (left + right ) // 2
 8     if inp > lst[mid]:
 9         left = mid + 1
10     elif inp < lst[mid]:
11         right = mid - 1
12     else:
13         print("列表中有此數")
14         break
15 else:
16     print("列表中沒有此數")
非遞迴, 非列表切片

  二: 遞迴, 非列表切片

 1 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
 2 def ck(n,l,r,lst):
 3     if l > r:
 4         return False
 5     mid = (l + r) // 2
 6     if n > lst[mid]:
 7         l = mid+1
 8         return ck(n,l,r,lst)
 9     elif n < lst[mid]:
10         r = mid-1
11         return ck(n,l,r,lst)
12     else:
13         return True
14 numb = int(input("輸入數字: "))
15 print(ck(numb,0,len(lst),lst))
遞迴, 非列表切片

  三: 遞迴, 列表切片

 1 def func(lst,n):
 2     if not lst:
 3         return False
 4     left = 0
 5     right = len(lst)-1
 6     mid = (left + right) // 2
 7     if n > lst[mid]:
 8         lst = lst[mid + 1:]
 9         return func(lst,n)
10     elif n < lst[mid]:
11         lst = lst[ : mid]
12         return func(lst, n)
13     else:
14         return True
15 numb = int(input("輸入數字: "))
16 print(func(lst,numb))
遞迴, 列表切片