python自學篇九[ 函數(四):遞歸函數+匿名函數+內置函數+高階函數]

python基礎系列:
python自學篇一[ Anaconda3安裝 ]
python自學篇二[ pycharm安裝及使用 ]
python自學篇三[ 判斷語句if的使用 ]
python自學篇四[ 基本數據類型和字符串常用處理 ]
python自學篇五[ 列表 ]
python自學篇六[ 元組 ]
python自學篇七[ 字典+深拷貝與淺拷貝 ]描述
python自學篇八[ 循環:while+for+pass+range()+推導式 ]
python自學篇九[ 函數(一):參數+對象 ]
python自學篇九[ 函數(二):返回值return+yield+迭代器+生成器 ]
python自學篇九[ 函數(三):變量作用域+ATM+5個小練習 ]
python自學篇九[ 函數(四):遞歸函數+匿名函數+內置函數+高階函數 ]
python自學篇十[ 面向對象 (一) :面向對象概念+定義類+練習一]
python自學篇十[ 面向對象 (二) :繼承+多繼承+類屬性+實例屬性]
python自學篇十[ 面向對象 (三) :訪問限制+類方法+靜態方法]
python自學篇十[ 面向對象 (四) :王者榮耀小遊戲+模擬一個簡單的銀行進行業務辦理的類]
python自學篇十一[ 模塊簡介+模塊製作+dir()函數+標準模塊+包]
python自學篇十二[ 文件:打開+讀取+寫入+3個習題]

遞歸函數

  • 遞歸函數:遞歸就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法。(一句話,自己調用自己)
  • 舉例,計算階乘 n! = 1 * 2 * 3 * … * n,用函數 fact(n)表示,可以看出:
    1! = 1
    2! = 2 × 1 = 2 × 1!
    3! = 3 × 2 × 1 = 3 × 2!
    4! = 4 × 3 × 2 × 1 = 4 × 3!

    n! = n × (n-1)!
  • 同樣的,可以把遞歸看作一場夢,做夢的時候夢到自己在做夢,夢中的自己正在做夢···,或者是鏡子裏面看見有個鏡子,裏面有自己,一層一層的。
  • 求階乘
def factorial(n):
    if n == 1:
        return 1
    else:
        return n*factorial(n-1)

print(factorial(10))

結果:

3628800

匿名函數

  • 定義函數的過程中,沒有給定名稱的函數就叫做匿名函數;Python中使用lambda表達式來創建匿名函數
lambda 來創建匿名函數規則:
  • lambda只是一個表達式,函數體比def簡單很多

  • lambda的主體是一個表達式,而不是一個代碼塊,所以不能寫太多的邏輯進去

  • lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間裏的參數

  • lambda定義的函數的返回值就是表達式的返回值,不需要return語句塊

  • lambda表達式的主要應用場景就是賦值給變量、作爲參數傳入其它函數

  • lambda匿名函數的表達式規則是:

lambda [參數列表]: 表達式

例如:

a=lambda :'我愛你'
print(a())

結果:

我愛你
  • 帶參數的lambda
s = lambda x: x*2
print(s(3))

結果:

6
  • 多參數lambda
s = lambda x,y: x+y
print(s(3,4))

結果:

7

矢量化的三元運算符

  • 原來:
if  條件:
        代碼塊哦
    else:
        代碼塊
  • 矢量化的三元運算符
條件成立的內容   if 條件 else 條件不成立的內容

如:

s = lambda x,y: x if x > 2 else y
print(s(1,4))

常用內置函數

在這裏插入圖片描述

  • 字典排序
dic = {'a':1,'c':2,'b':3}
dic = sorted(dic.items())
print(dic)

結果:

[(‘a’, 1), (‘b’, 3), (‘c’, 2)]

  • 倒序排序
dic = {'a':1,'c':2,'b':3}
dic = sorted(dic.items(),reverse= True)
print(dic)

結果:

[(‘c’, 2), (‘b’, 3), (‘a’, 1)]

  • 列表推導式
dic = {'a':1,'c':2,'b':3}
dic = sorted(dic.items()) #通過內置函數 sorted進行排序內置函數有返回值  默認通過KEY排序
print({k:v for k,v in dic})  #列表推導式輸出

結果:

{‘a’: 1, ‘b’: 3, ‘c’: 2}

  • 通過lambda按指定元素排序
dic = sorted(dic.items(),key = lambda x:x[1])  
#x:x[1]是指 [('c', 2), ('b', 3), ('a', 1)]中每個元組中的索引值爲1的元素,即231
lsit01 = [
    {'name':'joe','age':18},
    {'name':'susan','age':19},
    {'name':'tom','age':17}
]
dic = sorted(lsit01,key = lambda x:x['age'],reverse=True)   #內置函數有返回值  默認通過KEY排序
print(dic)
#按照age從大到小排序

結果:

[{‘name’: ‘susan’, ‘age’: 19}, {‘name’: ‘joe’, ‘age’: 18}, {‘name’: ‘tom’, ‘age’: 17}]

常用高階函數

在這裏插入圖片描述

map

#map
list01 = [1, 3, 5, 7, 9]
list02 = [2, 4, 6, 8, 10]
new_list = map(lambda x, y: x*y, list01, list02)
print(list(new_list))#將map對象轉換爲list

結果:

[2, 12, 30, 56, 90]

filter

#filter
list02 = [2, 4, 6, 8, 10]
new_list = filter(lambda x: x > 4, list02) #filter將不符合條件的元素過濾掉
print(list(new_list))

結果:

[6, 8, 10]

reduce

#reduce
from functools import reduce
list02 = [2, 4, 6, 8, 10]
new_list = reduce(lambda x, y: x+y, list02, 0)#0爲x的初始值,先把0給x,2給y,再把結果給x,4給y,依次進行,類似求和
print(new_list)

結果:

30

高階函數使用三個案例

案例一:格式化用戶的英文名,要求首字母大小,其它字母小寫
name = ['joe','susan','black','lili']
age = [18,19,20,21]
sex = ['m','w','m','w']
new_name = map(lambda x:x.title() ,name)
new_name = list(new_name)
print(new_name)

結果:

[‘Joe’, ‘Susan’, ‘Black’, ‘Lili’]

案例二:將用戶英文名、年齡、性別三個集合的數據結合到一起,形成一個元組列表
name = ['joe','susan','black','lili']
age = [18,19,20,21]
sex = ['m','w','m','w']
users = map(lambda x,y,z:(x,y,z),name,age,sex)
new_users = list(users)
print(new_users)

結果:

[(‘joe’, 18, ‘m’), (‘susan’, 19, ‘w’), (‘black’, 20, ‘m’), (‘lili’, 21, ‘w’)]

案例三:過濾性別爲男的用戶
name = ['joe','susan','black','lili']
age = [18,19,20,21]
sex = ['m','w','m','w']

users = map(lambda x,y,z:(x,y,z),name,age,sex)
new_users = list(users)
print(new_users)


new_users = filter(lambda x:x[2] == 'm',new_users)
new_users = list(new_users)
print(new_users)

結果:

[(‘joe’, 18, ‘m’), (‘susan’, 19, ‘w’), (‘black’, 20, ‘m’), (‘lili’, 21, ‘w’)]
[(‘joe’, 18, ‘m’), (‘black’, 20, ‘m’)]

案例四:求性別爲男的用戶的平均年齡
name = ['joe','susan','black','lili']
age = [18,19,20,21]
sex = ['m','w','m','w']

users = map(lambda x,y,z:(x,y,z),name,age,sex)
new_users = list(users)
#print(new_users)

#
# new_users = filter(lambda x:x[2] == 'm',new_users)
# new_users = list(new_users)
# print(new_users)
from functools import reduce
total_age = reduce(lambda x,y:x+y[1],new_users,0)
print(total_age/len(new_users))

結果:

19.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章