Day11 遞歸函數、模塊、迭代器和生成器

遞歸函數

  1. 什么是遞歸

    在函數中調用本身的函數被稱為遞歸函數

  2. 遞歸的作用:循環可以做的事情遞歸函數都可以做,
    如果循環可以做,就不要用遞歸

  3. 怎么用遞歸來解決實際問題
    第一步:確定臨界值 - 循環結束的條件,在臨界值的位置讓遞歸函數結束
    第二步:找關系 - 找當次循環和上次循環的關系
    ? 找f(n)和f(n-1)的關系
    第三步:假設函數f的功能已經實現,通過f(n-1)來實現f(n)的功能

  4. 循環能做的事情不能使用遞歸做

    # 1+2+3+4+5+6+···+n
    
    
    def ff_sum(n):
        # 1.找臨界值
        if n == 1:
            return 1
        # 2.找關系
        # ff_sum(n):1+2+3+···+n
        # ff_sum(n-1):1+2+3+···+n-1
        return ff_sum(n - 1) + n
    
    
    print(ff_sum(100))
    

模塊

  1. 什么是模塊
    在python中一個py文件就是一個模塊
    a.系統模塊(標準庫) - 系統提供的模塊(安裝解釋器時已經導入到解釋器中,使用的時候在代碼中直接的導入)
    random - 提供隨機數
    math - 提供數學運算
    json庫 - 提供json相關操作
    re模塊 - 提供正則表達式相關操作
    socket模塊 - 提供python的套接字編程
    time模塊 - 時間操作
    threading - 提供多線程操作
    b.自定義模塊(第三方庫) - 自己創建的py文
    自己寫的
    別人寫的(第三方庫) - 需要先下載到解釋器中,然后才能在代碼中導入

    標準庫和第三方庫一般是通過模塊提供變量和類

  2. 怎么使用模塊
    import 模塊名 --- 直接導入指定的模塊,導入后可以使模塊中所有的全局變量(包含了變量、函數和類)
    ? 導入后通過哦'模塊名.變量'來使用模塊中的內容
    from 模塊名 import 變量1, 變量2, - 在程序中導入指定的模塊,導入后只能使用import后面的變量
    ? 導入后直接使用變量
    from 模塊名 import * -- 導入模塊,并且可以直接使用里面的全局變量,

  3. 導入模塊的實質
    a.無論是那種導入模塊的方法,導入模塊的時候都會執行模塊中所有的代碼
    b.python中一個模塊不會重復導入多個模塊,系統會自動檢測當前模塊是否已經導入

  4. 怎么阻止模塊中的內容被其他模塊執行
    將不希望被其他模塊執行的代碼放在if語句中
    if __ name__ == 'main'
    如果希望被其他模塊執行的代碼就放在if語句的外面

    原理:
    每個模塊都有一個屬性__ name__屬性,屬性默認的值是這個py文件的文件名
    當當前模塊正在被執行(直接執行)的時候,模塊的屬性__ name__的值就會變成__ main __

  5. 5.重命名 - 導入模塊的時候可以對模塊或者模塊中的內容重新命名

    import 模塊名 as 新模塊名
    from 模塊名 import 變量1 as 新變量1, 變量2 as 新變量2, 變量3
    通配符不支持重命名

迭代器

  1. 什么是迭代器
    是python提供的容器型數據類型
    獲取迭代器中的元素的時候只能從前往后一個一個的取,而且取了之后這個元素在迭代器中就不存在了

  2. 迭代器的字面量
    迭代器沒有指定格式的字面量。迭代器作為容器,里面的元素只能通過將其他序列轉換或者通過生成器生成

    list1 = [1, 2, 3, 4]
    # 將字符串轉換成迭代器,迭代器中的元素就是字符串的每個字符
    iter1 = iter('hello')
    # 將列表串轉換成迭代器,迭代器中的元素就是列表中的每個元素
    iter2 = iter(list1)
    
    iter3 = iter({'name': '小明', 'age': 18})
    print(iter1)
    print(iter2)
    print(iter3)
    
  3. 獲取元素
    迭代器中的元素只支持查,不支持增刪改
    迭代器是通過next函數獲取單個元素,for-in遍歷一個一個的獲取所有的元素。
    不管是那種方式獲取,已經獲取的元素在迭代器中就不存在了

    next(迭代器) --> 獲取迭代器中最新的數據(最頂層的數據)

    # 練習:看打印結果
    iter4 = iter([10, True, 'abc', 1, 2])
    index = 0
    for x in iter4:
        index += 1
        if index == 2:
            break
    
    print(next(iter4))
    """
    index = 0
    x = 10 iter4 = True, 'abc', 1, 2
    index = 1
    x = True iter4 = 'abc', 1, 2
    """
    

生成器

  1. 什么是生成器
    生成器就是迭代器,迭代器不一定是生成器

  2. 生成器是怎么產生元素的
    調用一個帶有yield的關鍵字函數就能得到一個生成器

    不帶yield的函數:調用的時候會執行函數體,并且會獲取返回值
    帶yield的函數:調用的時候不會執行函數體,也不會獲取返回值,而是產生一個生成器(函數調用表達式就是一個生成器)
    ? 這個生成器中的元素就是yield關鍵字后面的值

    def func1():
        print('=========')
        return 100
    
    
    func1()
    print(func1())
    
    # =========
    # 100
    
    
    def func2():
        print('==========')
        return 100
        yield
    
    
    print(func2())  # <generator object func2 at 0x0000027F9599A830>
    
    
    """
    3.生成器的元素
    生成器中的元素也是通過next  或   for in 
    生成器獲取元素實質就是去執行生成器對應的函數, 每次執行到yield語句為止,并且會將yield后面的值作為當次獲取到的元素
    下次獲取元素的時候會接著上次結束的位置往后執行,知道下一個yield····
    以此類推,知道函數結束。如果執行到函數結束,沒有遇到yield,那么就會報錯'Stop異常'
    """
    
    
    def func3():
        print('``````')
        yield 100, 200
        print('!!!!!!!')
        yield 300
    
    
    # gen1 = func3()      # gen1就是一個生成器(生成器就是迭代器)
    # next()
    # print(gen1)
    # re = next(gen1)
    # print(type(re), re)
    # print('第一次結束')
    #
    # re = next(gen1)
    # print(re, type(re))
    
    # for x in gen1:
    #     print(x)
    
    
    # py1809001 - 80
    
    
    def create_num():
        num = 1
        while True:
            yield 'py1809%d' % num
            num += 1
    
    
    num_gen = create_num()
    for _ in range(10):
        print(next(num_gen))
    
    print('上課了')
    
    
    print(next(num_gen))
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容