語法的一些快捷方式(簡便方法)
武林祕籍
遞迴:函式在執行過程中 直接或者間接的呼叫了自身
官網表示:python預設的最大遞迴深度為1000次
import sys
print(sys.getrecursionlimit())
print(sys.setrecursionlimit(2000))
count = 1 def index(): global count count += 1 print(count) print('from index') index() index()
def func(): print('from func') index()def index(): print('from index') func() index()
遞迴
1.遞推
一層層往下推導答案(每次遞迴之後複製度相較於上一次一定要有所下降)
2.回溯
依據最後的結論往後推匯出最初需要的答案
遞迴一定要有結束條件!!!
# 虛擬碼:可能無法執行 但是可以表述邏輯 # age(5) = age(4) + 2 # age(4) = age(3) + 2 # age(3) = age(2) + 2 # age(2) = age(1) + 2# age(1) = 18 def get_age(n): if n == 1: return 18 return get_age(n - 1) + 2 print(get_age(5))
小練習
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
# 打印出列表中每一個元素(列表除外)
1.迴圈該列表 獲取列表內每一個元素
2.判斷該元素是否是數字 如果是數字 則直接列印
3.如果是列表 則迴圈該列表 獲取列表內每一個元素
4.判斷該元素是否是數字 如果是數字 則直接列印
5.如果是列表 則迴圈該列表 獲取列表內每一個元素
6.判斷該元素是否是數字 如果是數字 則直接列印
7.如果是列表 則迴圈該列表 獲取列表內每一個元素
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]] # 方式一 def get_num(l): for i in l: if type(i) is int: print(i) else: # 也是for迴圈 然後判斷 get_num(i) get_num(l) # 方式二 def num(l): print(l[0]) # print(l) if len(l) < 2: return else: l2 = l[1] num(l2) num(l) for i in []: print(i,'懵逼了!')
什麼是演算法?
解決問題的高效方法
二分法(入門級別:還有一定距離)
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111] # 第一種方式 直接for迴圈從左往右依次查詢 # 第二種方式 二分法 """ 二分法能夠使用的場景 資料集必須有序 """ def my_partner(target_num, l): # target_num=321 l=l if len(l) == 0: print('不好意思 我盡力 沒找到') return # 先獲取中間位置索引值 middle_index = len(l) // 2 # 8 # 判斷中間索引對應的值比目標值大還是小 if target_num > l[middle_index]: # 說明要找的元素只可能出現在列表的右側 l_right = l[middle_index + 1:] # l[9:] print(l_right) my_partner(target_num, l_right) elif target_num < l[middle_index]: # 說明要找的元素只可能出現在列表的左側 l_left = l[:middle_index] print(l_left) my_partner(target_num, l_left) else: print('找到了', target_num) my_partner(444, l) 找不到 需要新增結束條件 my_partner(11, l) # 要查詢的元素在開頭 那麼還沒有依次查詢的效率高
條件成立採用if前面的值 if 條件 else 條件不成立採用else後面的值
三元表示式儘量不要巢狀使用
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 res = '乾飯' if 10 > 2 else '不幹飯' print(res) res = '乾飯' if 10 > 2 else ('不管飯' if 2 >5 else '寫的啥!') print(res) is_free = input('電影是否收費(y/n)>>>:').strip() if is_free == 'y': print('收費') else: print('免費') print('收費' if is_free == 'y' else '免費') username = input('username>>>:') res = 'NB' if username == 'jason' else 'SB' print(res)
name_list = ['jason', 'kevin', 'tony', 'jerry'] # 給列表中所有的人名加上_DSB字尾 '''傳統做法''' # 1.定義一個空列表 new_list = [] # 2.for迴圈老列表 for name in name_list: # 3.生成新的名字 new_name = '%s_DSB'%name # 4.新增到新的列表中 new_list.append(new_name) print(new_list) '''列表生成式''' res = ['%s_DSB' % name for name in name_list] print(res) '''傳統做法''' # 1.定義一個空列表 new_list = [] # 2.for迴圈老列表 for name in name_list: # 3.生成新的名字 if name == 'jason': continue else: new_name = '%s_DSB'%name # # 4.新增到新的列表中 new_list.append(new_name) print(new_list) '''列表生成式''' res = ['%s_DSB' % name for name in name_list if name != 'jason'] print(res)
'''
enumerate(l1)
針對該方法使用for迴圈取值 每次會產生兩個結果
第一個是從0開始的數字
第二個是被迴圈物件裡面的元素
還可以通過start引數控制起始位置
'''
for i, j in enumerate(l1, start=1): print(i, j)
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) count = 0 for i in l1: print(count,i) count += 1 name_list = ['jason', 'kevin', 'tony', 'jerry'] res = {i: j for i, j in enumerate(name_list) if j != 'jason'} print(res) res1 = {i for i,j in enumerate(name_list)} print(res1,type(res1)) # 迭代器 res2 = (i for i,j in enumerate(name_list)) print(res2)
沒有名字的函式
語法格式
lambda 形參:返回值
print(lambda x:x**2) def index(): pass print(index) print((lambda x: x ** 2)(2)) res = lambda x: x ** 2 print(res(2)) '''匿名函式一般不會單獨使用 都是配合其他函式一起使用''' # map() 對映 l = [1, 2, 3, 4, 5, 6, 7, 8, 9] def index(n): return n ** 2 print(list(map(lambda x:x**2, l)))
待續