Python Day16

一.複習python

1.迭代器和生成器算法

可迭代對象 - 可迭代的  Iterable編程

內部含有__iter__
 from collections import Iterable
 isinstance('要檢測的值',Iterable)編程語言

~迭代器函數

內部含有__iter__,__next__
可迭代對象 包含 迭代器
 from collections import Iterator
 isinstance('要檢測的值',Iterator)
訪問迭代器中的值 : 迭代器.__next__()google

~~能被for循環的都是可迭代的spa

  for循環的本質:
  循環不是迭代器的可迭代對象 :不具有next方法的可迭代對象.__iter__()就獲得了一個迭代器
  循環迭代器:直接調用迭代器的next方法code

~生成器——迭代器對象

~~生成器函數 —— 函數內含有yield關鍵字blog

  *函數的調用返回一個生成器
  *從生成器中取值的方法和從迭代器中取值的方法是徹底相同的
    1.next —— 不經常使用
    2.for —— 最好
    3.list —— 最很差

  *生成器中的內容不獲取就不生成——惰性運算

   *在定義生成器的時候:關鍵字yield

    *在使用生成器的時候:next、send

~~生成器表達式

    就是將列表推導式的中括號改爲小括號

    列表推導式的結果是一個列表,生成器表達式的結果是一個生成器

~~~~注意事項:

      ***next  for  list 不要混用 

~~生成器函數和裝飾器函數一塊兒用

    預激生成器的裝飾器,在這個裝飾器中只作一件事:next(g)         

 

 

二.遞歸  

1.遞歸的概念:遞歸的概念是算法的範疇原本不屬於python語言的語法內容,可是在每一個編程語言系列教學都要講到遞歸。

 

  若是掌握了遞歸的方法會發現是一個很是棒的變成思路。

 

2.什麼叫作遞歸(recursion):一個函數在本身的內部調用函數自己。

def search(num,l,start = None,end=None):
    start = start if start else 0
    end = end if end else len(l)-1
    mid = (end-start)//2+start
    if l[mid]>num:
        search(num,l,start,mid-1)
    elif l[mid] < num:
        search(num,l,mid+1,end)
    elif l[mid] == num:
        print(mid,l[mid])
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
search(66,l)

輸出結果

17 66

~遞歸的深度在python中是有限制的

~遞歸的好處就是代碼簡介精煉

~定義一個遞歸函數的時候,必需要有一個限制

 

3.遞歸的反作用:1 *遞歸函數能夠調用自己,可是每次都須要進行 壓棧,彈棧保存和恢復寄存器的棧的操做,在這個上面很消耗時間和空間。

 

       2 *若是遞歸一旦忘記返回或者錯誤的設置了返回的條件,那麼在執行遞歸代碼會成爲一個無底洞,只進不出。(遞歸的口訣:遞歸遞歸,歸去來兮)

 

  使用迭代是考驗毫秒級的,而實現遞歸是考驗CPU的能力(n秒------n分鐘不等)。

 

二 解耦

 什麼叫作解耦:要完成一個完整的功能,可是這個功能的規模要儘可能的小,而且和這個功能無關的其餘代碼應該和這個函數分離。

    解耦的好處:1 加強代碼的重用性;2 減小代碼變動的相互影響;3 減小代碼的冗餘。

 

 

~~~遞歸示例:

 

#求階乘 n = 7  7*6*5*4*3*2*1
def func(n): if n == 1: return 1 else: return n*func(n-1)

 ret = func(4)
 print(ret)



輸出結果

5040

 

 

 

 

#3.三級菜單
menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '網易': {},
                'google': {}
            },
            '中關村': {
                '愛奇藝': {},
                '汽車之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龍觀': {},
        },
        '朝陽': {},
        '東城': {},
    },
    '上海': {
        '閔行': {
            "人民廣場": {
                '炸雞店': {}
            }
        },
        '閘北': {
            '火車戰': {
                '攜程': {}
            }
        },
        '浦東': {},
    },
    '山東': {},
}
#相同的數據類型 嵌套在一塊兒
# def Three_Level_Menu(menu):
#     while True:
#         for k in menu:print(k)
#         key = input('>>>')
#         if key == 'q':return 'q'
#         elif key == 'b':break
#         elif key in menu:
#             ret = Three_Level_Menu(menu[key])
#             if ret == 'q': return 'q'
# Three_Level_Menu(menu)
相關文章
相關標籤/搜索