1. 程式人生 > >python記錄_day14 內建函式二 迭代 二分法

python記錄_day14 內建函式二 迭代 二分法

一、匿名函式

形式:

lambda 形參:返回值

lambda表示的是匿名函式. 不需要用def來宣告, 一句話就可以宣告出一個函式。匿名函式不是說一定沒名字,而是他們的名字統一稱為“lambda”,可以用__name__檢視

注意:

1. 函式的引數可以有多個. 多個引數之間用逗號隔開

2. 匿名函式不管多複雜. 只能寫一行, 且邏輯結束後直接返回資料

3. 返回值和正常的函式一樣, 可以是任意資料型別

1 #計算n的n次方
2 f = lambda n : n**n
3 
4 print(f(10))

 

二、sorted

排序函式,形式  sorted(iterable, key=None, reverse = False)  

iterrable :要進行排序的可迭代物件

key:相當於排序規則,在sorted內部會將可迭代物件的每一個元素傳遞給這個函式,根據函式的運算結果進行排序

reverse: 升序還是降序,False是升序,True是降序

1 lst = ["將夜","擇天記","鬥破蒼穹","武動乾坤"]
2 
3 s = sorted(lst, key= lambda el : len(el), reverse = False) #按電視劇名的長度排序
4 
5 print(s)

 

三、filter

篩選函式,形式 filter(function , iterable ) 

function:篩選規則,將iterable的每一個元素傳遞給這個函式,根據function返回的True或者False來判斷是否保留此項資料

llst = ["將夜","擇天記","鬥破蒼穹","武動乾坤"]

s = filter( lambda el : len(el)>3,lst) #按電視劇名的長度排序
for el in s:
    print(el)

結果:
鬥破蒼穹
武動乾坤

 

四、map

對映函式 形式 map(function , iterable)

function:對映規則,分別取iterable中的每一個元素,傳遞給函式執行,得到新的資料

1 #列表中每個元素的平方組成新列表
2 lst = [2,4,6,8,10]
3 num = map(lambda x:x*x,lst)
4 
5 for el in num :
6     print(el)

 

五、遞迴

在函式中呼叫函式本身,就是遞迴(自己呼叫自己)

遞迴的最大深度是1000,但是一般都取不到

遞迴關鍵的是找到遞迴入口和遞迴出口

應用:使用遞迴遍歷資料夾系統(遞迴可以用來遍歷各種樹形結構)

 1 def func(path, ceng)
 2      lst = os.listdir(path) # 開啟一個資料夾. 獲取到資料夾內的所有內容 
 3      for el in lst: # 當前資料夾內的所有的檔名(包括資料夾名字)
 4          file_real_path = os.path.join(path, el)  # 拼接檔案的真實路徑
 5          # 判斷這個路徑是檔案還是資料夾
 6          if os.path.isdir(file_real_path):
 7              # 遞迴的入口
 8              print("\t"*ceng, el)
 9              func(file_real_path,ceng+1) # 重新執行剛才的操作
10     
11         else:   # 不是資料夾, 是檔案
12              # 遞迴的出口
13             print("\t"*ceng, el)
14 
15 func("D:/PyCharm/workspace/周作業",0)  #呼叫函式

 

六、二分法

二分查詢:每次能夠排除掉一半的資料,查詢的效率非常高。 但是侷限性比較大, 必須是有序序列才可以使用二分查詢。

 1 #查詢列表中是否存在n
 2 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
 3 
 4 #普通查詢
 5 def func():
 6     n =input(">>")
 7     for el in lst:
 8         if el == int(n):
 9             return True
10     else:
11         return False
12 
13 # print(func())
14 
15 #判斷列表中是否存在n
16 #二分查詢---非遞迴
17 n = int(input(">>"))
18 left = 0  #左邊界
19 right = len(lst)-1  #右邊界
20 while left<=right:       #左邊界小於等於右邊界進入迴圈
21     mid = (left+right)//2  #取商的整數
22     if n < lst[mid]:   #判斷你的數字和中間數大小
23         right = mid-1  #右邊界往左移
24     elif n >lst[mid]:
25         left = mid+1     #左邊界往右移
26     else:
27         print("找到了")
28         break
29 else:       # 左邊界大於右邊界退出迴圈
30     print("找不到")
31 #二分查詢---遞迴
32 def digui(n,left,right):
33     if left <= right:
34         mid  = (left +right)//2
35         if n < lst[mid]:
36             right = mid -1
37         elif n > lst[mid]:
38             left = mid +1
39         else:
40             print("找到了")
41             return True
42         #digui(n, left, right)
43         return digui(n, left, right)   # 不寫return,返回值始終為None
44     else:
45         return -1
46 ret = digui(56,0,len(lst)-1)
47 print(ret)
48 
49 #二分查詢 ----遞迴(切列表)
50 def binary_search(lst,n):
51     left = 0
52     right = len(lst)-1
53     if left >right:
54         print("找不到")
55     mid = (left + right)//2
56     if n < lst[mid]:
57         #binary_search(lst[:mid], n)
58         return binary_search(lst[:mid],n)  # 不寫return,返回值會始終為None
59     elif n > lst[mid]:
60         #binary_search(lst[mid + 1:], n)
61         return binary_search(lst[mid+1: ],n)
62     else:
63         print("找到了")
64         return True
65 ret = binary_search(lst,56)
66 print(ret)
示例