1.函數的遞歸
指一個函數在內部調用的階段直接或者間接的調用了自身並且,return語句不能包含表達式。
遞歸分為兩個階段
1.回溯:就是一次次重復的過程,這個重復的過程必須建立在每一次重復問題的復雜度都應該下降
直到有一個最終的結束條件
2.遞推:一次次往回推導的過程
''' age(4)=age(3)+1 age(3)=age(2)+1 age(2)=age(1)+1 age(1)=1 可找出規律: age(n)=age(n-1)+1 n>1時成立 age(1)=1 ''' #遞歸函數 del age(n): if n == 1 #必須要有結束條件4 return 1 return age(n-1)+1 res = age(4) print(res) #遞歸函數不要考慮循環的次數 只需要把握結束的條件
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]],將列表中的數字依次打印出來 def num(l): for i in l: if type(l) is int: print(i) else: num(i) num(l) #用for循壞來打印的話,代碼就比較繁瑣 # 遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰,代碼也不如遞歸的可讀性高。
頂替方法:①第一種是pass,②第二種是...。推薦使用第一種。
2.算法之二分法
前提:容器里面的數組一定要是有順序的。
基本思想:假設數據是按升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查找成功;若x小於當前位置值,則在數列的前半段中查找;若x大於當前位置值則在數列的后半段中繼續查找,直到找到為止。
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] target_num = 666 #target_num 目標編號 def get_num(1,target_num): if not =1: print('該數字不存在!') return print(l) middle_number = len(l)//2 #中間索引 if target_num > l[middle_index] # 切取列表右半部分 num_right = l[middle_index + 1:] # 再遞歸調用get_num函數 get_num(num_right,target_num) elif target_num < l[middle_index]: # 切取列表左半部分 num_left = l[0:middle_index] # 再遞歸調用get_num函數 get_num(num_left, target_num) else: print('find it',target_num) get_num(l,target_num)
3.三元表達式
比較x和y的大小。 #用函數來表示 def my_max(x,y) if x > y: return:x else: return:y #當某個條件成立時做一件事,不成立時做例外一件事。 #比如當x大的時候返回x,當y大的時候返回y。 #用三元表達式來表達 res = x if x > y else y #如果if后面的條件成立返回if前面的值 否則返回else后面的值 三元表達式固定表達式 值1 if 條件 else 值2 條件成立 : 值1 條件不成立: 值2
補充:三元表達式的應用場景只推薦只有兩種選擇的情況下使用。
4.列表生成式
#往列表里面的內容增加一個尾注 #for循環添加方法 l=['1','2','3','4','5','6'] li=[] for name in l: li.append('%s_nb'%name) print(li) # 列表生成式 res = ['%s_nb'%i for i in l] print(res)
l = ['1_nb', '2_nb', '3_nb', '4_nb','6_dnb'],將含有‘_nb’的另外組成一個列表。 res=[name for name in l if name.endswith('_nb')] #后面不支持else,因為else可以與for,if都有關聯。 print(res) #['1_nb', '2_nb', '3_nb', '4_nb', '5_nb'] # 先for循環依次取出列表里面的每一個元素 # 然后交由if判斷 條件成立才會交給for前面的代碼 # 如果條件不成立 當前的元素 直接舍棄
5.字典生成式
跟列表生成式一樣,字典生成式用來快速生成字典,不同的是,字典需要兩個值。
#d = {key: value for (key, value) in iterable} d1 = {'x': 1, 'y': 2, 'z': 3} d2 = {k: v for (k, v) in d1.items()} print(d2)
6.匿名函數
特點:一般都是臨時存在,用完就沒了。
def my_sum(x,y) return x + y lambad x,y : x+y # 注:其中左邊的相當於函數的形參,右邊的相當於函數的返回值。 # 匿名函數通常不會單獨使用,是配合內置函數一起使用,也可以配合自己寫的函數一起使用
7.內置函數
# map 映射 一一對應 l = [1,2,3,4,5,6] print(list(map(lambda x:x+1,l))) # 基於for循環 >>>:[6, 7, 8, 9, 10, 11] # zip 拉鏈 # 基於for循環,只顧及短的那一端 l1 = [1,2,] l2 = ['a','b','c'] print(list(zip(l1,l2))) >>>:[(1, 'a'), (2, 'b')] # filter l = [1,2,3,4,5,6] print(list(filter(lambda x:x != 3,l))) #>>>:[1, 2, 4, 5, 6] # 基於for循環,依次取出列表中的每一個值,取出來的值都放在lanbda中,其中(lambda)相當於一個條件,如果返回是false,那個值就不要。 # reduce from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,1)) #>>>:21 當初始值不存在時,先獲取取兩個元素相加值,之后每次獲取一個與上一次相加的結果相加