1. 程式人生 > >內建函式⼆

內建函式⼆

本節主要內容:

1. lamda匿名函式

2. sorted()

3. filter()

4. map()

5. 遞迴函式

一. lamda匿名函式   

為了解決一些簡單的需求而設計的一句話函式

計算n的n次方

原本寫法:

def func(n): 

   return n**n

print(func(10))

 

read('../oldboy/', 0)

六. 二分查詢   

二分查詢. 每次能夠排除掉⼀半的資料.  查詢的效率非常⾼高. 但是侷限性比較⼤大. 必須是有 序列才可以使⽤二分查詢    

要求: 查詢的序列列必須是有序序列列.

lamda匿名函式的寫法:

f = lambda n: n**n

print(f(10))

 lambda表示的是匿名函式. 不需要⽤用def來宣告, 一句話就可以宣告出⼀個函式

語法:    函式名 = lambda 引數: 返回值

注意: 1. 函式的引數可以有多個. 多個引數之間⽤逗號隔開

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

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

匿名函式並不是說⼀定沒有名字. 這⾥前面的變數量就是⼀個函式名.

說他是匿名原因是我們通 過__name__檢視的時候是沒有名字的.

統⼀都叫lambda. 在呼叫的時候沒有什麼特別之處. 像正常的函式呼叫即可

 

⼆. sorted()

 排序函式.     語法: sorted(Iterable, key=None, reverse=False)

  Iterable: 可迭代物件       

key: 排序規則(排序函式), 在sorted內部會將可迭代物件中的每⼀個元素傳遞給這個函式的引數. 根據函式運算的結果進⾏排序       

reverse: 是否是倒敘. True: 倒敘, False: 正序

# 根據字串長度進行排序 
lst = ["麻花藤", "岡本次郎", "中央情報局", "狐仙"] # 計算字串串長度
 def func(s):   
 return len(s)
 print(sorted(lst, key=lambda s: len(s)))

三. filter()

篩選函式   

語法: filter(function. Iterable)       

function: ⽤用來篩選的函式. 在filter中會⾃自動的把iterable中的元素傳遞給function.

然後 根據function返回的True或者False來判斷是否保留留此項資料       

Iterable: 可迭代物件

lst = [{"id":1, "name":'alex', "age":18},       {"id":2, "name":'wusir', "age":16},      
 {"id":3, "name":'taibai', "age":17}]
 fl = filter(lambda e: e['age'] > 16, lst)   # 篩選年年齡⼤大於16的資料 print(list(fl)) 

四. map()   

對映函式   

語法: map(function, iterable) 可以對可迭代物件中的每⼀個元素進行對映. 分別取執行 function   

計算列表中每個元素的平方 ,返回新列表

def func(e):   

return e*e

mp = map(func, [1, 2, 3, 4, 5])

print(mp)

print(list(mp))

 改寫成lambda:print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))

計算兩個列表中相同位置的資料的和

lst1 = [1, 2, 3, 4, 5]

lst2 = [2, 4, 6, 8, 10]

print(list(map(lambda x, y: x+y, lst1, lst2)))

五. 遞迴

 在函式中呼叫函式本身. 就是遞迴

def func():   

print("我是誰")   

  func()

func()

在python中遞迴的深度最⼤到998

遞迴的應用:    

我們可以使用遞迴來遍歷各種樹形結構, 比如我們的資料夾系統. 可以使用遞迴來遍歷該 資料夾中的所有檔案

import os def read(filepath, n):    
files = os.listdir(filepath)    # 獲取到當前⽂資料夾中的所有⽂檔案   
 for fi in files:    # 遍歷⽂資料夾中的⽂檔案, 這⾥裡里獲取的只是本層⽂檔名       
 fi_d = os.path.join(filepath,fi)    # 加⼊入⽂資料夾 獲取到⽂資料夾+⽂檔案       
 if os.path.isdir(fi_d): # 如果該路路徑下的⽂檔案是⽂資料夾           
 print("\t"*n, fi)           
 read(fi_d, n+1)     # 繼續進⾏行行相同的操作       
 else:           
 print("\t"*n, fi)   # 遞迴出口. 最終在這⾥裡里隱含著return
#遞迴遍歷⽬目錄下所有⽂檔案 
read('../oldboy/', 0)

 

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

要求: 查詢的序列列必須是有序列.

# lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
# n = int(input("請輸入數字"))
# left = 0
# right =len(lst)-1
# while left<=right:
# mid = (left+right)//2
# if n < lst[mid]:
# right = mid -1
# elif n > lst[mid]:
# left = mid +1
# else:
# print("找到了")
# break
# else:
# print("找不到數字")