1. 程式人生 > >遞迴函式,匿名函式配合內建函式的使用

遞迴函式,匿名函式配合內建函式的使用

一:遞迴函式

    函式遞迴呼叫(是一種特殊的巢狀呼叫):在呼叫一個函式的過程中,又直接或間接地呼叫了該函式本身
    遞迴必須要有兩個明確的階段:
        遞推:一層一層遞迴呼叫下去,強調每進入下一層遞迴問題的規模都必須有所減少
        回溯:遞迴必須要有一個明確的結束條件,在滿足該條件時結束遞推
            開始一層一層回溯

    遞迴的精髓在於通過不斷地重複逼近一個最終的結果

例子:用遞迴實現列表二分法查詢元素

有一個從小到大排列的整型數字列表

nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]

def search(search_num,nums):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    mid_index=len(nums) // 2
    if search_num > nums[mid_index]:
        # in the right
        nums=nums[mid_index+1:]
        search(search_num,nums)
    elif search_num < nums[mid_index]:
        # in the left
        nums=nums[:mid_index]
        search(search_num,nums)
    else:
        print('find it')

search(31,nums)

二:匿名函式

    1:# 有名函式:基於函式名重複使用

    2:# 匿名函式:沒有繫結名字的下場是用一次就回收了

    # f=lambda x,y:x+y
    # print(f)

    # print(f(1,2))

三:常用內建函式配合lambda函式的使用    #max min map filter sorted

    salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
     }

     # max的工作原理
     #1 首先將可迭代物件變成迭代器物件

     #2 res=next(可迭代器物件),將res當作引數傳給key指定的函式,然後將該函式的返回值當作判斷依據

      # def func(k):
      #     return salaries[k]
      # print(max(salaries,key=func)) #next(iter_s)
      #'egon', v1=func('egon')
      #'alex', v2=func('alex')
      #'wupeiqi', v3=func('wupeiqi')

      #'yuanhao', v4=func('yuanhao')

      res=max(salaries , key=lambda key:salaties[key])#配合lambda函式使用將薪資最高的人取出來

      print(res)

      print(min(salaries,key=lambda k:salaries[k])) #next(iter_s)    #取出薪資最低的人原理與max一樣

     # salaries={
     #     'egon':3000,
     #     'alex':100000000,
     #     'wupeiqi':10000,
     #     'yuanhao':2000
     # }

     # print(sorted(salaries,key=lambda k:salaries[k],reverse=True))#將字典裡的人物按照薪資進行排序,reverse可以控制      排序方式,順序或者倒序。

     # map的工作原理
     #1 首先將可迭代物件變成迭代器物件
     #2 res=next(可迭代器物件),將res當作引數傳給第一個引數指定的函式,然後將該函式的返回值當作map的結果之一
     # aaa=map(lambda x:x+"_SB",names)
     # print(aaa)
     # print(list(aaa))
     # filter的工作原理#過濾函式
     #1 首先將可迭代物件變成迭代器物件
     #2 res=next(可迭代器物件),將res當作引數傳給第一個引數指定的函式,然後filter會判斷函式的返回值的真假,如果為真則留      下res
     names=['alexSB','egon','wxxSB','OLDBOYSB']
     # print([name for name in names if name.endswith('SB')])#列表推到式取出以SB結尾的名字
     aaa=filter(lambda x:x.endswith('SB'),names)#使用過濾函式取出以SB結尾的名字
     print(aaa) #迭代器物件

     print(list(aaa)) 

四:其他需要掌握的內建函式:

       1,bytes

        # res='你好'.encode('utf-8')#將unicode字元轉成位元組型別
        # print(res)
        # res=bytes('你好',encoding='utf-8')#直接用bytes可以轉換

        # print(res) 

        2,chr 參考ascii表將數字轉成字元,ord將字元轉換成對應的數字

        # 參考ASCII表將數字轉成對應的字元
        # print(chr(65))
        # print(chr(90))
        # 參考ASCII表將字元轉成對應的數字

        # print(ord('A'))

        3,divmod  求商和餘數

        # print(divmod(10,3))#列印結果為3餘1

        4,enumerate 列舉

        # l=['a','b','c']
        # for k ,item in enumerate(l):
        #     print(k,item)

        5,  eval 把字串中的表示式拿出來執行一下

        # l='[1,2,3]'
        # l1=eval(l)#將列表形式的字串取出來,拿到一個列表,可以依靠索引取值,多用於從檔案中取出列表,字典之類的           資料型別
        # print(l1,type(l1))

        # print(l1[0]) 

        6,pow    

        # print(pow(3,2,2)) #與 (3 ** 2) % 2類似,先平方再求餘

        7,round 四捨五入

         # print(round(3.3))  #結果為3

         #print(round(3.5))#結果為4

         8,sum求和函式

         # print(sum(range(101))) #1到100的值

         9,—import—  用來匯入以字串形式輸入的模組

          module=input('請輸入你要匯入的模組名>>: ').strip() #module='asdfsadf'
          m=__import__(module) 
          print(m.time())

五:其他需要了解的內建函式

        1, # print(abs(-13))   #求絕對值的方法
        2, # print(all([1,2,3,]))  #全部為True則為真

        3, # print(all([]))    #空的可迭代物件為真

        4, # print(any([0,None,'',1])) #有一個為True則為True
        5, # print(any([0,None,'',0]))  #False

        6, # print(any([])) #空列表為假

        7, # print(bin(3)) #11  #十進位制轉換成二進位制
        8, # print(oct(9)) #11   #十進位制轉成八進位制

        9, # print(hex(17)) #11  #十進位制轉成十六進位制

        10,# print(callable(len))  #函式是否能被呼叫

        11, # import time

        12, # print(dir(time)) #列舉出所有:time.名字

        13, # s=frozenset({1,2,3}) # 不可變集合
        14, # s1=set({1,2,3}) # 可變集合 

        15, # # print(globals())  #檢視全域性變數

        16, # # print(locals())     #檢視區域性變數

        17, # hash([1,2,3])     #是否可以被hash

        18, # def func():
               #     """
               #     文件註釋
               #     :return:
               #     """
               #     pass

               # print(help(func))  #help函式檢視一個函式的幫助文件

         19,  # l=['a','b','c','d','e']
                # s=slice(1,4,2)  #類似於先定義一個切片方式,以後可以方便連續使用
                # print(l[1:4:2])

                # print(l[s])

          20,# print(vars())#返回物件object的屬性和屬性值的字典物件,如果沒有引數,就列印當前呼叫位置的屬性和屬性值 類似 locals()。