1. 程式人生 > 其它 >python 函式遞迴 演算法 三元表示式

python 函式遞迴 演算法 三元表示式

內容概要

  • 遞迴函式

  • 演算法(二分法)

  • 三元表示式

  • 列表生成式 字典生成式

  • 匿名函式

內容詳細

遞迴函式

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

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