遞迴函式、演算法、生成器
阿新 • • 發佈:2021-11-18
目錄
遞迴函式、演算法、生成器
遞迴函式
# 遞迴 :在函式執行過程中 直接或者間接的呼叫了自身 官方表示:python預設最大遞迴深度為1000次 import sys print(sys.getrecursionlimit()) # 檢視遞迴深度 print(sys.setrecursionlimit(2000)) # 設定遞迴深度 def func(): print('from func') index() def index(): print('from index') func() index() ''' 遞迴 1.遞推 一層層往下推到答案(每次遞推之後複雜度相較於上一次一定要有所下降) 2.回溯 依據最後的結論往後推匯出最初需要的答案 故:遞迴一定要有結束條件! ''' eg: 第一個人員年齡不確定往後人員比前一個人員大2歲 最後一名人員18歲 計算出最初人員的年齡 def get_age(n): if n == 1: return 18 return get_age(n - 1) + 2 print(get_age(5)) 邏輯: # age(5) = age(4) + 2 # age(4) = age(3) + 2 # age(3) = age(2) + 2 # age(2) = age(1) + 2 # age(1) = 18 eg2: l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]] # 打印出列表中每一個元素(列表除外) # 1.迴圈該列表 獲取列表內每一個元素 # 2.判斷該元素是否是數字 如果是數字 則直接列印 # 3.如果是列表 則迴圈該列表 獲取列表內每一個元素 # 4.判斷該元素是否是數字 如果是數字 則直接列印 # 5.如果是列表 則迴圈該列表 獲取列表內每一個元素 # 6.判斷該元素是否是數字 如果是數字 則直接列印 # 7.如果是列表 則迴圈該列表 獲取列表內每一個元素 def get_num(lis): for i in lis: if type(i) is int: print(i) else: # 也是for迴圈 然後判斷 get_num(i) get_num(l) # 迴圈到空列表後 迴圈自動停止不列印任何東西 所以不需要停止
演算法
什麼是演算法:
解決問題的高效方法
演算法之二分法
# 二分法為最入門級別的算髮 # 二分法使用場景:資料必須為有序的 l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111] def my_par(get,lis): if len(lis) == 0: print('對不起無法找到') return # 先獲取中間位置的索引值 mid = len(lis) // 2 # 判斷中間索引對應的值比目標值大還是小 if get > lis[mid]: # 說明要找的元素只可能出現在列表的右側 l_right = lis[mid + 1:] # lis(中間位置索引值 : ) print(l_right) my_par(get,l_right) elif get < lis[mid]: # 說明要找的元素只可能出現在列表的左側 l_left = lis[:mid] print(l_left) my_par(get,l_left) else: print('找到了%s'%get) my_par(222,l) my_par(222,l) # 找不到 需要新增結束條件 my_par(11,l) # 如果要找的元素在開頭 那麼還沒有依次查詢的效率高
三元表示式
def my_max(a,b): if a > b return a else: return b # 如果功能需求僅僅是二選一的情況下 那麼推薦使用三元表示式 def my_max(a, b): return a if a>b else b # 格式:條件成立則採用if前面的值 if 條件 else 條件不成立採用else後面的值 # 三元表示式儘可能不要巢狀使用 res = '對了' if 1 > 2 else '錯了' print(res) res = '對了' if 1 > 2 else ('又對了' if 2 > 1 else '又錯了') print(res) eg: is_free = input('電影是否收費(y/n)>>>>').strip() if is_free == 'y': print('收費') else: print('免費') 三元表示式: print('收費' if is_free == 'y' else '免費')
列表生成式
name_list = ['jason', 'kevin', 'tony', 'jerry']
# 實現給列表中每一個元素增加_ddd字尾
'''傳統方式'''
1. 定義一個空列表
new_list = []
# for迴圈舊列表
for i in name_list:
new_name = '%s_ddd'%i
new_list.append(new_name)
print(new_list)
'''列表生成器方法'''
res = ['%s_ddd'% name for name in name_list]
print(res)
字典生成式
# 將兩個列表組合成字典的形成表現出來
l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
for i in range(len(l1)):
new_dict[l1[i]] = l2[i]
print(new_dict)
# 把l1列表表現出索引加元素值
count = 0
for i in l1:
print(count,i)
count += 1
# 列舉
'''
enumerate(l1)
針對該方法使用for迴圈取值 每次會產生兩個結果
第一個是從0開始
第二個是被迴圈物件裡面的元素
還可以通過start引數控制起始位置
'''
for i, j in enumerate (l1, start=1):
print(i,j)
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res) # 如果有if判斷則先判斷 正確才執行for迴圈
# res1 = {i for i,j in enumerate(name_list)}
# print(res1,type(res1))