python基礎-匿名函數和內置函數

匿名函數和內置函數

匿名函數:沒有名字,使用一次即被收回,加括號就能夠運行的函數。python

  • 語法lambda 參數:返回值數組

  • 使用方式app

    • 將匿名函數賦值給變量,給匿名函數一個名字,使用這個變量來調用(還不如用有名函數)
    res = lambda x,y:x*y
    print(res(2,3))   # 打印結果:6
    • 與內置函數一塊兒使用,如:max,min,sorted,map,filter,reduce

內置函數就是python解釋器給咱們提供的函數。函數

  • max 返回給定參數的最大值,這個參數能夠是可迭代對象code

    語法max(可迭代對象,key=函數對象)對象

  • min 返回給定參數的最小值,這個參數能夠是可迭代對象排序

    語法min(可迭代對象,key=函數對象)it

# 需求:求出如下工資最高和工資最低的員工
user_dic = {
    '趙鐵柱': 3000,
    '張全蛋': 20000,
    '伍六七': 1500,
    '李小花': 8000
}
s_max = max(user_dic, key=lambda x: user_dic[x])
"""
1.max內部會遍歷user_dic,將遍歷結果一一傳給lambda的參數x
2.依據lambda的返回值做爲比較條件,獲得最大條件下的那個遍歷值
3.對外返回最大的遍歷值
"""
print(f"工資最高的員工是:{s_max}")

s_min = min(user_dic, key=lambda x: user_dic[x])
print(f"工資最低的員工是:{s_min}")  # 原理跟max 相似
  • sorted 接收一個key函數(可選)來實現對可迭代對象進行自定義的排序class

    語法sorted(可迭代對象,key=函數對象,reverse=False)import

    reverse:排序方向,默認從小到大,reverse=True爲降序

# 一、對列表按照絕對值進行排序
li = [-21, -12, 5, 9, 36]
print(sorted(li, key=lambda x: abs(x)))
"""
sorted()函數按照keys進行排序,並按照對應關係返回list相應的元素:
keys使用lambda函數排序結果 => [5, 9,  12,  21, 36]
                            |  |    |    |   |
      最終結果            => [5, 9, -12, -21, 36]
"""

# 二、假設咱們用一組tuple表示學生名字和成績:
L = [('sean', 75), ('egon', 92), ('Jessie', 66), ('tank', 88)]

# 2.1 請用sorted()對上述列表分別按名字排序
print(sorted(L, key = lambda x : x[0]))
"""
1.sorted內部會遍歷L,將遍歷結果一一傳給lambda的參數x
2.依據lambda的返回值依次進行排序,獲得排序後的list列表
3.對外返回排序後的列表
"""
# 輸出[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

# 2.2 再按成績從高到低排序
print(sorted(L, key = lambda x : x[1], reverse=True))
# 輸出[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
  • map 映射。將可迭代對象中的每個值進行修改,而後映射到一個map 對象中,可將這個map 對象轉換其餘容器類型展現結果。只能轉換一次

    語法:map(函數對象,可迭代對象)

# 一、求列表[1,2,3,4,5,6,7,8,9],返回一個n*n 的列表
# 常規解決方案
list1 = [1,2,3,4,5,6,7,8,9]
li = []
for i in list1:
    i = i ** 2
    li.append(i)
print(li)

# 使用map 的解決方案
map_obj = map(lambda x: x * x, li)
print(map_obj)  # 打印結果爲 map對象
print(list(map_obj))  # 將map 對象轉換成列表展現
print(tuple(map_obj))  # 打印爲空 ???

從以上打印結果能夠發現,map_obj 轉換兩次,再次打印的結果是空。這是咋了,放心,這個結果沒被我吃掉!!!這是由於map對象本質是可迭代對象list(map_obj) for num in map_obj 這樣的語句,就是調用了迭代器,執行了__ next __(),消耗了迭代對象。因此,再次使用map_obj後,會發現它已經空了。

  • reduce 合併。每次從可迭代對象中獲取兩個值進行累積計算。其效果就是:

    reduce(func,[1,2,3]) 等同於 func(func(1,2),3)

    語法reduce(函數對象,可迭代對象,初始值)

    注意

    • 使用reduce 函數,必須導包 from functools import reduce

    • 在求和時,初始值默認爲0;求乘積時,初始值爲1

from functools import reduce
# 求1-100以內的和
res_sum = reduce(lambda x, y: x + y, range(1, 101), 0)
print(res)

# 求1-9的積
res_pro = reduce(lambda x, y: x * y, range(1, 10))
print(res_pro)
  • filter 過濾。根據函數中返回值是True仍是False決定保留仍是丟棄該元素。若是是True就「過濾出來」,並添加到filter 對象中。

    語法filter(函數對象,可迭代對象)

# 求列表['1A','2A','3C','4C','5A']中,返回不包含A的列表
key_list = ['1A','2A','3C','4C','5A']

filter_obj = filter(lambda key:key.endswith('C'),key_list)

print(filter_obj)  # 打印filter 對象 ----> 
print(list(filter_obj))  # 將filter 對象轉換成列表展現
print(tuple(filter_obj))  # 打印出空元組,原理同map 對象

從上述代碼能夠發現,filter 對象本質上也是一個可迭代對象

擴展題

一、請利用filter()篩選出200之內的回數。回數是指從左向右讀和從右向左讀都是同樣的數,例如12321,909
二、現有列表 L = ["1","2","3","5","7","8","4","9","6"]
 1) 求列表中全部偶數組成的最大整數
 2) 求列表中全部奇數組成的最小整數
相關文章
相關標籤/搜索