python 函式遞迴 演算法 三元表示式
阿新 • • 發佈:2021-11-18
內容概要
-
遞迴函式
-
演算法(二分法)
-
三元表示式
-
列表生成式 字典生成式
-
匿名函式
內容詳細
遞迴函式
""" 遞迴:函式在執行過程中 直接或者間接的呼叫了自身 """ # 官網表示: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.如果是列表 則迴圈該列表 獲取列表內每一個元素 def get_num(l): for i in l: if type(i) is int: print(i) else: # 也是for迴圈 然後判斷 get_num(i) get_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) # 要查詢的元素在開頭 那麼還沒有依次查詢的效率高
三元表示式
# 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 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)
字典生成式
# 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
# 列舉
'''
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)
# 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)))