遞迴函式,演算法(二分法)和三元表示式
內容概要
- 遞迴函式
- 演算法(二分法)
- 三元表示式
- 列表生成式
- 字典生成式
- 匿名函式
遞迴函式
-
遞迴
函式在執行過成中,直接或間接呼叫自身 -
官方表示:python預設的最大遞迴深度為1000次
-
修改遞迴次數
import sys
print(sys.getrecursionlimit())
print(sys.setrecursionlimit(2000))c = 1
def index():
global c
print(c)
c += 1
print('sss index')
index()index()
-
遞推
一層層往下推導答案(每次遞迴之後複製度相較於上一次一定要有所下降) -
回溯
依據最後的結論往後推匯出最初需要的答案
遞迴一定要有結束條件 -
練習推導年齡
def age(a):
if a == 1:
return 18
return age(a - 1) + 2print(age(5))
-
練習打印出列表中的所有數字
l1 = [1, [2, [3, [4, [5, [6, [7, [8, [9]]]]]]]]]def s(l1):
for i in l1:
if type(i) is int:
print(i)
else:
s(i)s(l1)
演算法之二分法
-
lis = [11, 22, 33, 66, 99, 123, 234, 456, 678]
def index(s, lis):
if len(lis) == 0: # 列表裡沒有這個數
print('不好意思沒找到')
return
a = len(lis) // 2 # 找到中間的索引值
if s > lis[a]: # 判斷中間索引值比目標值大還是小
lis_right = lis[a + 1:] # 如果目標值大說明要找的值在右側
print(lis_right)
index(s, lis_right)
elif s < lis[a]:
lis_left = lis[:a] # 如果目標值小說明要找的值在左側
print(lis_left)
index(s, lis_left)
else:
print('找到了', s)
index(456, lis)
三元表示式
-
def index(a, b):
if a > b:
return a
return bprint(index(2, 4))
-
如果功能需求只是二選一的情況下,推薦使用三元表示式
-
def index(a, b):
return a if a > b else bprint(index(5, 3))
-
條件成立採用if前面的值,條件不成立採用else後面的值
三元表示式儘量不要巢狀使用 -
username = input('user: ').strip()
print('帥' if username == 'aaa' else '醜')
列表生成式
-
傳統方法給列表裡的名字加字尾
l1 = ['sss', 'aaa', 'ccc']
l2 = []
for name in l1:
new_name = '%s_hhh' % name
l2.append(new_name)
print(l2)
-
列表生成式
l1 = ['sss', 'aaa', 'ccc']
print(list('%s_hhh' % name for name in l1))
字典生成式
-
l1 = ['name', 'age', 'hobby']
l2 = ['sss', 18, 'music']
dic = {} # 定義一個空字典
for i in range(len(l1)): # for迴圈三列表l1,l1的長度是3
dic[l1[i]] = l2[i] # 字典索引等於l2的索引,字典沒有鍵值對,所以新增鍵值對
print(dic) # 列印字典c = 0
for i in l1:
print(c, i)
c += 1
-
列舉
enumerate(l1)
針對該方法使用for迴圈取值,每次會產生兩個結果
第一個是從0開始的數字
第二個是被迴圈物件裡的元素
還可以通過start引數控制起始位置 -
l1 = ['name', 'age', 'hobby']
l2 = ['sss', 18, 'music']
res = {k: l2[i] for i, k in enumerate(l1)}
print(res)
匿名函式
-
匿名函式
沒有名字的函式 -
語法格式
lambda 形參:返回值 -
print((lambda x: x ** 2)(6))
-
匿名函式一般不會單獨使用,都是配合其他函式使用
map() 對映
l1 = [2, 3, 4, 5, 6]
print(list(map(lambda x: x ** 2, l1)))