python基礎(16):內置函數(二)

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)
相關文章
相關標籤/搜索