遞迴、匿名函式及列表、字典生成式
阿新 • • 發佈:2021-11-19
遞迴、匿名函式及列表、字典生成式
1、遞迴函式
# 1、遞迴函式 # 遞迴函式就是函式在執行的時候直接或間接的呼叫函式本身的函式 '''遞迴函式遵循以下兩個原則 1、遞推:一步步往下推匯出結論,且每推導一次,距離所要追求的結果的距離越近,複雜度都要稍微有所下降 2、回溯:從推導得到的結果再一步步回傳,直到的得到自己需要的結果 且遞迴一定要有結束條件 ''' # 練習 1 # 五個同學,第一個比第二個大2歲,第二個比第三個大2歲,依次類推,第五個同學20歲,求第一位同學的年齡 # 首先定義一個函式 # def get_age(n): # # 先定義第五個同學是20歲 # if n == 5: # return 20 # # 從第一位開始,每個同學都比後面大兩歲 # return get_age(n+1)+2 # # res = get_age(1) # print(res) # 練習 2 # 用倒序的方式列印列表裡的每一個元素 list = [1,2,3,4,5,6] count = 5 def index(a): if a < 0: return print(list[a]) a -= 1 index(a) index(count) # 練習 3 計算age1 # age1 = age2 + 1 # age2 = age3 + 2 # age3 = age4 + 3 # age4 = age5 + 4 # age5 = 20 # 求age1 def get_age(n, a): if n == 5: return 20 a += 1 return get_age(n + 1, a) + a res = get_age(1, 0) print(res) # 練習 4 把下列列表裡的每一個值打印出來,組成新的列表 l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]] # # 定義一個空列表,用於接收元素 new_list = [] # 定義一個函式,打印出列表裡的每一個元素 def get_element(list): # 先迴圈列表裡的每一個值 for line in list: # 判斷元素的資料型別 if type(line) is int: new_list.append(line) else: get_element(line) return new_list res = get_element(l) print(res) # 練習 5 生成斐波那契數列 # 定義一個函式用來生成斐波那契數列 def feibo_naqi(n): if n <= 1: return n else: return (feibo_naqi(n-1)+feibo_naqi(n-2)) # 定義一個空列表用來接受斐波那契數列 feibo_list = [] # 獲取使用者想要生成的數列個數 numbers = input('輸入你想生成的數列個數:').strip() # 去除使用者輸入內容的首尾特殊字元 # 把使用者的輸入轉換成整型 numbers = int(numbers) # 對使用者輸入進行判斷 if numbers < 0: # 如果使用者輸入的值小於O,則提示使用者重新輸入 print('請輸入正數') else: # 如果輸入的是正數,則列印個題標 print('斐波那契數列',end='') # 利用for迴圈獲取斐波那契函式生成的資料 for i in range(numbers): feibo_list.append(feibo_naqi(i)) print(feibo_list)
2、演算法之二分法
# 演算法 # 所謂演算法就是解決問題的高效方法 '''二分法 二分法的使用 當我們在一個很龐大的資料裡找一個我們想要的資料值的時候,採用二分法,先把整個資料分為兩部分 把左邊最大的值和我們要找的值進行比較,若是大於要找的值,則把左邊部分再分成兩份以此類推 使用二分法的前提是,所要查詢的資料來源必須是有序的 ''' # 練習,利用二分法從一個列表裡找到一個我們想要的值 digit_list = [12, 23, 34, 45, 56, 67, 78, 89, 90, 123, 234, 345, 567, 789, 899] # 從上述列表中找到234 # 先定義一個函式方便我們找到我們想要的值 def find_digit(l,n): # 先判斷列表是否為空 if len(l) == 0: print('列表為空') return middle_index = len(l)//2 if n > l[middle_index]: right_list = list(l[middle_index+1:]) print(right_list) return find_digit(right_list,n) elif n < l[middle_index]: left_list = list(l[:middle_index]) print(left_list) return find_digit(left_list,n) else: print('找到了') return n res = find_digit(digit_list,234) print(res)
3、三元表示式
# 三元表示式
# 所謂的三元表示式就是當結果是二選一的情況時,利用三元表示式可以大大減少程式碼量
# 語法結構
'''
if 條件成立時的結果 if 條件 else if條件不成立時返回的結果
'''
res = '歡迎光臨' if int(input('請輸入你的選擇:')) == 1 else '歡迎下次再來'
print(res)
'''
三元表示式一般儘量不要巢狀,會讓程式碼看起來很難理解
'''
print('歡迎光臨') if int(input(':')) == 1 else print('下次再來哦')
4、列表、字典生成式
# 列表生成式 # 列表生成式是為了快速生成一個新的列表 name_list = ['jason', 'jenny', 'john', 'tony', 'tom'] # 現要求在列表裡的每個元素後面加上'_nb',但是列表內元素順序不變,且元素用列表儲存 # 方法一: # 建立一個空列表,把修改後的元素新增到空列表裡 new_list = [] # for迴圈取列表的每一個索引 for i in range(len(name_list)): # 把修改後的元素新增到列表裡 new_list.append('%s_nb' % name_list[i]) # 列印列表 print(new_list) # 方法二: # 列表生成式 # 語法結構 ''' 變數名 = [i,for i in 列表名 if 條件] 列表生成式的先後執行順序是: 先迴圈從列表裡取出一個元素,然後再根據if後面的條件判斷,把取出的元素拿出來, 迴圈執行上面的步驟,直到把列表裡的所有元素取完為止,然後把拿出來的元素用中括號括起來 !切記,列表生成式裡不能加else判斷語句,因為有for+else和if+else兩種,直譯器會混淆,所以,不能加else條件 ''' name_list = ['jason', 'jenny', 'john', 'tony', 'tom'] n = [f'{i}_nb' for i in name_list if i != 'jason'] print(n) # 字典生成式 # 字典生成式是為了快速的生成一個字典 name_list = ['jason', 'jenny', 'john', 'tony', 'tom'] # 把上述列表加上對應的k值生成字典 # 方法一: # 先建立一個空的字典,通過迴圈列表裡的索引把元素新增到字典裡 new_dic = {} for i in range(len(name_list)): # 把元素新增到字典裡 new_dic[i] = name_list[i] # 列印新的字典 print(new_dic) # 方法二:列舉 # 字典生成式 # 語法結構 ''' enumerate(name_list) 針對該方法迴圈取值,每次都會產生兩個結果 1、預設會從0開始生成數字 2、返回被迴圈列表裡的值 變數名 = {k值:v值 for k v in enumerate(name_list)if 條件} ''' name_list = ['jason', 'jenny', 'john', 'tony', 'tom'] new_dic = {k:v for k,v in enumerate(name_list) if v != 'jason'} print(new_dic) # 迭代器 tup = (i for i,j in enumerate(name_list)) print(tup)
5、匿名函式
# 匿名函式
# 所謂匿名函式就是沒有名字的函式
# 語法結構
'''
lambda 形參:返回值
匿名函式一般不單獨使用,常常是和其他函式連用
'''
res = lambda x: x**2
print(res)
l = [1,2,3,4,5,6,7,8,9]
# 把列表裡的每一個值都平方後放進一個新的列表裡
# 方法一:
new_list = []
def index(n):
for i in n:
new_list.append(i**2)
return new_list
res = index(l)
print(res) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 方法二:
# 匿名函式
# 對映函式 map()
'''
對映函式把列表裡的每一個值當成實參傳給匿名函式,最後生成一個列表
'''
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda x: x ** 2, l))) # [1, 4, 9, 16, 25, 36, 49, 64, 81]