1. 程式人生 > >python學習 day014打卡 內建函式二&遞迴函式

python學習 day014打卡 內建函式二&遞迴函式

本節主要內容:

1.lambda匿名函式

2.sorted()

3.filter()

4.map()

5.遞迴函式

6.二分法

 

一.lambda匿名函式

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

# 計算n的n次方 
def func(n):    
    return n**n 
print(func(10)) 

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:是否倒敘.Ture:倒敘,False:正序

lst = [1, 5, 3, 4, 6]
lst2 = sorted(lst)
print(lst) # 原列表不會改變
print(lst2) # 返回的新列表是經過排序的

dic = {1: "A", 3: "C", 2: "B"}
print(sorted(dic)) # 如果是字典,則返回排序過後的key

 

和函式組合使用

# 根據字元串長度進行排序 
lst = ["麻花藤", "岡本次郎", "中央情報局", "狐仙"] 

# 計算字元串長度 
def func(s):    
    
return len(s) print(sorted(lst, key=func))

 

和lambda組合使用

lst=[{'id':3,'name':'taihei','age':18},
     {'id':1,'name':'alex','age':28},
{'id':2,'name':'taibai','age':58},

{'id':4,'name':'henhei','age':38}]

# 根據年齡排序
def func(s):
    return s['age']

print(sorted(lst, key=lambda dic:dic["age"]))

 

三.filter()

篩選函式

語法: filter(function,Iterable)

function: 用來篩選的函式.在filter中會自動的把iterable中的元素傳遞給function.然後根據function返回的Ture或者False來判斷是否保留此項資料

Iterable:可迭代物件

lst = ["渴望", "年輪", "家有兒女", "蝸居", "49天", "浪漫滿屋"]

#  把後面的可迭代物件中的每一個元素交給前面的函式。 根據函式返回的True或者False。 判斷是否保留該元素
f = filter(lambda s: len(s) > 2, lst)
print("__iter__" in dir(f))
for el in f:
    print(el)


lst=[{'id':3,'name':'taihei','age':18},
     {'id':1,'name':'alex','age':28},
     {'id':2,'name':'taibai','age':58},
     {'id':4,'name':'henhei','age':38}]

# 篩選年齡大於等於38的人
print(list(filter(lambda ren: ren['age']>=38, lst)))

 

四.map()

對映函式

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

 lst = [2, 3, 4,5, 6, 7, 1]
# 計算列表中的每一項的平方

# 對映
# 把可迭代物件中的每一個元素拿出來交給前面的函式執行. 保留最後的執行結果
m = map(lambda x: x*x, lst)
for el in m:
    print(el)

# 給出一個列表
lst = ["alex_123", "alex_456", "wusir_123", "wusir_456", "alex_789"]
#
# 正確的使用者名稱: alex
# 密碼:456
# alex_456
print(list(map(lambda s : " yes" if s=="alex_456" else "false"  , lst)))

print(list(map(lambda s: s.split("_")[0] == 'alex' and s.split("_")[1] == "456",lst)))

 

五.遞迴

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

def func():    
    print("我是誰")    
    func() 
func()

 

在python中遞迴的深度最大是1000,但是到不了1000,一般是998

def foo(n):    
    print(n)    
    n += 1    
    foo(n) 
foo(1)

 遞迴的應用:

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

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("d:/python課件及作業",0)
    

 

六.二分查詢

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

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

# 判斷n是否在lst中出現.
# 二分查詢---非遞迴演算法
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("沒找到")
# 普通遞迴版二分法:
def binary_search(lst,n,left,right):
    if left <= right:
        mid = (left+right)//2
        if n < lst[mid]:
            right = mid - 1
        elif n > lst[mid]:
            left = mid + 1
        else:
            return mid
        return binary_search(lst,n,left,right)    # 這個return必須要加.否則接收到的永遠是None
    else:
        return -1


lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
n = int(input("請輸入一個數字:"))
left = 0
right = len(lst)-1
print(binary_search(lst,n,left,right))
# 另類二分法,很難計算位置.
def binary_search(lst,n):
    left = 0
    right = len(lst) - 1
    if left > right:
        print("不在這裡")
        return False
    mid = (left+right) // 2
    if n < lst[mid]:
        return binary_search(lst[:mid],n)
    elif n > lst[mid]:
        return binary_search(lst[mid+1:], n)
    else:
        print("在這裡")
        return True


lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
n = int(input("請輸入一個數字:"))
print(binary_search(lst,n))