1. 程式人生 > 其它 >遞迴函式,演算法(二分法)和三元表示式

遞迴函式,演算法(二分法)和三元表示式

內容概要

  • 遞迴函式
  • 演算法(二分法)
  • 三元表示式
  • 列表生成式
  • 字典生成式
  • 匿名函式

遞迴函式

  • 遞迴
    函式在執行過成中,直接或間接呼叫自身

  • 官方表示: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) + 2

    print(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 b

    print(index(2, 4))

  • 如果功能需求只是二選一的情況下,推薦使用三元表示式

  • def index(a, b):
    return a if a > b else b

    print(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)))