1. lamda匿名函數
爲了解決⼀些簡單的需求⽽設計的⼀句話函數
# 計算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,在調⽤的時候沒有什麼特別之處,像正常的函數調⽤便可。
2. sorted()
排序函數。
語法:
sorted(Iterable, key=None, reverse=False)
Iterable: 可迭代對象
key: 排序規則(排序函數),在sorted內部會將可迭代對象中的每⼀個元素傳遞給這個函數的參數,根據函數運算的結果進⾏排序
reverse: 是不是倒敘,True: 倒敘,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 = ["麻花藤", "岡本次郎", "中央情報局", "狐仙"]
# 計算字符串⻓度
def func(s):
return len(s)
print(sorted(lst, key=lambda s: len(s)))
lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}]
# 按照年齡對學⽣信息進⾏排序
print(sorted(lst, key=lambda e: e['age']))
3. filter()
篩選函數
語法:
fifilter(function. Iterable)
function: ⽤來篩選的函數,在fifilter中會⾃動的把iterable中的元素傳遞給function,而後根據function返回的True或者False來判斷是否保留此項數據
Iterable: 可迭代對象
lst = [1,2,3,4,5,6,7]
ll = filter(lambda x: x%2==0, lst) # 篩選全部的偶數
print(ll)
print(list(ll))
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))
4. 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)))
5. 遞歸
在函數中調⽤函數本⾝,就是遞歸
def func():
print("我是誰")
func()
func()
在python中遞歸的深度最⼤到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('../oldboy/', 0)
6. 二分查找
⼆分查找,每次可以排除掉⼀半的數據,查找的效率很是⾼,可是侷限性比較⼤,必須是有
序序列纔可使⽤⼆分查找。
要求: 查找的序列必須是有序序列。
# 判斷n是否在lst中出現. 若是出現請返回n所在的位置
# ⼆分查找---⾮遞歸算法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
n = 567
left = 0
right = len(lst) - 1
count = 1
while left <= right:
middle = (left + right) // 2
if n < lst[middle]:
right = middle - 1
elif n > lst[middle]:
left = middle + 1
else:
print(count)
print(middle)
break
count = count + 1
else:
print("不存在")
# 普通遞歸版本⼆分法
def binary_search(n, left, right):
if left <= right:
middle = (left+right) // 2
if n < lst[middle]:
right = middle - 1
elif n > lst[middle]:
left = middle + 1
else:
return middle
return binary_search(n, left, right) # 這個return必需要加. 不然接收到的永遠是None.
else:
return -1
print(binary_search(567, 0, len(lst)-1))
# 另類⼆分法, 很難計算位置.
def binary_search(ls, target):
left = 0
right = len(ls) - 1
if left > right:
print("不在這⾥")
middle = (left + right) // 2
if target < ls[middle]:
return binary_search(ls[:middle], target)
elif target > ls[middle]:
return binary_search(ls[middle+1:], target)
else:
print("在這⾥")
binary_search(lst, 567)