遞歸函數與生成式

1.函數遞歸
# 函數在調用階段直接或間接的又調用自身
# import sys
# print(sys.getrecursionlimit()) # 不是很精確 默認1000左右遞歸次數限制 通常爲997或998
# sys.setrecursionlimit(2000) # 指定次數算法

# 函數不該該無限制的遞歸下去app

# 遞歸
"""
遞歸分爲兩個階段
1.回溯:就是一次次重複的過程,這個重複的過程必須創建在每一次重複問題的複雜度都應該降低
直到有一個最終的結束條件
2.遞推:一次次往回推導的過程
"""函數

# 第一我的年齡爲18其後依次加2 求取第5我的的年齡
# 遞歸函數
# def age(n):
# if n == 1: # 必需要有結束條件
# return 18
# return age(n-1) + 2
# res = age(5)
# print(res)遞歸


# def index():
# pass # 第一種頂替方式(推薦使用pass)
# ... # 第二種頂替方式
# index()索引

# 遞歸函數不要考慮循環的次數 只須要把握結束的條件便可ip

2.算法之二分法
# 算法:解決問題的高效率的方法
l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
# num = 345
# for i in l:
# if num == i:
# print('find it')get

# 二分法:容器類型裏面的數字必須有大小順序
target_num = 666
def get_num(l,target_num):
if not l: # 處理不能無限切分列表的bug
print('你給的工資 這個任務怕是無法作')
return
# 獲取列表中間的索引
print(l)
middle_index = len(l) // 2
# 判斷target_num跟middle_index對應的數字的大小
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)
# elif target_num == l[middle_index]:
# print('find it',target_num) 此爲最後一種狀況等同於下面else代碼
# 通常狀況下儘可能多用elif窮舉出全部的狀況
else:
print('find it',target_num) it

get_num(l,target_num)io

3.三元表達式
"""
三元表達式固定表達式
值1 if 條件 else 值2
條件成立 值1
條件不成立 值2
"""
方法一
def my_max(x,y):
if x > y:
return x
else:
return yfor循環

方案二
res = x if x > y else y # 三元 1元爲值x 2元爲if條件 3元爲else條件

4.列表生成式
# l = ['tank','nick','oscar','sean']
# l1 = []
# for name in l:
# l1.append('%s_sb'%name)
# # l1.append(name + '_sb') # 不推薦使用
# print(l1)

l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
# 列表生成式
# res = ['%s_DSB'%name for name in l]
# print(res)

res = [name for name in l if name.endswith('_sb')] # 後面不支持再加else的狀況
# 先for循環依次取出列表裏面的每個元素
# 而後交由if判斷 條件成立纔會交給for前面的代碼
# 若是條件不成立 當前的元素 直接捨棄

print(res)

5.字典生成式
# l1 = ['name','password','hobby']
# l2 = ['jason','123','DBJ','egon']
#
# d = {}
# for i,j in enumerate(l1):# enumerate 枚舉
# d[j] = l2[i]
# print(d)

#
# l1 = ['jason','123','read']
# d = {i:j for i,j in enumerate(l1) if j != '123'}
# print(d)


res = {i for i in range(10) if i != 4}
print(res)
res1 = (i for i in range(10) if i != 4) # 這樣寫不是元組生成式 而是生成器表達式
# print(res1)
# for i in res1:
# print(i)

6.匿名函數 lambda
"""
沒有名字的函數

匿名函數的特色
臨時存在用完就沒了
"""
def my_sum(x,y):
return x + y

# res = (lambda x,y:x+y)(1,2)
# print(res)
# func = lambda x,y:x+y
# print(func(1,2))

 

# :左邊的至關於函數的形參
# :右邊的至關於函數的返回值
# 匿名函數一般不會單獨使用,是配合內置函數一塊兒使用

7.經常使用內置函數
# l = [1,2,3,4,5]
# print(max(l)) # 內部是基於for循環的
#
#
# """
# A-Z 65 90
# a-z 97 122 # 二進制轉換10進制後對應ascll碼
# """
# print(chr(97))
# d = {
# 'egon':30000,
# 'jason':88888888888,
# 'nick':3000,
# 'tank':1000
# }
# def index(name):
# return d[name]

# print(max(d,key=lambda name:d[name]))
# 比較薪資 返回人名
# print(min(d,key=lambda name:d[name]))


# map zip filter sorted reduce

# map 映射
# l = [1,2,3,4,5,6]
# # print(list('hello'))
# print(list(map(lambda x:x+5,l))) # 基於for循環


# zip 拉鍊 # 基於for循環
# l1 = [1,2,]
# l2 = ['jason','egon','tank']
# l3 = ['a','b','c']
# print(list(zip(l1,l2,l3)))

# l = [1,2,3,4,5,6]
# print(list(filter(lambda x:x != 3,l))) # 基於for循環

 

# l = ['jason','egon','nick','tank']# print(sorted(l,reverse=True))

相關文章
相關標籤/搜索