1. 程式人生 > 其它 >語法的一些快捷方式(簡便方法)

語法的一些快捷方式(簡便方法)

武林祕籍

遞迴函式

  遞迴:函式在執行過程中 直接或者間接的呼叫了自身

  官網表示: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)))

待續