pythonday11

来源:https://www.cnblogs.com/panda-pandeyong/archive/2018/07/17/9325449.html
-Advertisement-
Play Games

一. 函數名的運用. 函數名是一個變數, 但它是一個特殊的變量, 與括弧配合可以執行函數的變量. 1. 函數名的記憶體地址 2. 函數名可以賦值給其他變量 3. 函數名可以當做容器類的元素 4. 函數名可以當做函數的參數 5. 函數名可以作為函數的返回值 二. 閉包 1. 閉包就是內層函數,對外層函數 ...


一. 函數名的運用.    

  函數名是一個變數, 但它是一個特殊的變量, 與括弧配合可以執行函數的變量.

  

  1. 函數名的記憶體地址

        def func():
            print("呵呵") 
        print(func) 
        結果: <function func at 0x1101e4ea0>

  

  2. 函數名可以賦值給其他變量

        def func():
            print("呵呵") 
        print(func) 
        a = func    # 把函數當成一個變數賦值給另一個變量 
        a()     # 函數調用 func()

  

  3. 函數名可以當做容器類的元素

        def func1():
            print("呵呵") 
        def func2():
            print("呵呵") 
        def func3():
           print("呵呵") 
        def func4():
           print("呵呵")
        lst = [func1, func2, func3] 
        for i in lst:
            i()

 

  4. 函數名可以當做函數的參數

        def func():
            print("吃了麽")
        def func2(fn):
            print("我是func2")
            fn()    # 執行傳遞過來的fn
            print("我是func2") 
        func2(func)     # 把函數func當成參數傳遞給func2的參數fn.

 

  5. 函數名可以作為函數的返回值

        def func_1():
            print("這里是函數1")
            def func_2():
                print("這里是函數2")
            print("這里是函數1")
            return func_2 
        fn = func_1()   # 執行函數1.  函數1返回的是函數2, 這時fn指向的就是上面函數2 
        fn()    # 執行上面返回的函數
 

  

二. 閉包

  

  1. 閉包就是內層函數,對外層函數(非全局)的變量的引用叫閉包.

        def func1():
            name = "alex"
            def func2():
                print(name)     # 閉包
            func2() 
        func1() 
        結果: alex        

    我們可以使用__closure__來檢測函數是否是閉包. 使用函數名.__closure__返回cell就是

  

  2. 閉包返回None就不是閉包

        def func1():
            name = "alex"
            def func2():
                print(name)     # 閉包
            func2()
           print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
         func1()     

  

  3. 如何在函數外邊調用內部函數呢? 

        def outer():
            name = "alex"    # 內部函數
            def inner():
                print(name)
            return inner 
        fn = outer()   # 訪問外部函數, 獲取到內部函數的函數地址 
        fn()    # 訪問內部函數 

  

  4. 如果多層嵌套只需要一層一層的往外層返回就行了 

 

        def func1():
            def func2():
                def func3():
                    print("嘿嘿")
                return func3
            return func2 
        func1()()() 

       

   5.閉包的優勢:

    由於我們在外界可以訪問內部函數. 那這個時候內部函 數訪問的時間和時機就不一定了, 因為在外部,

    我可以選擇在任意的時間去訪問內部函數. 這個時候. 想一想. 我們之前說過, 如果一個函數執行完畢.

    則這個函數中的變量以及局部命名空間中的內容都將會被銷毀. 在閉包中.如果變量被銷毀,那內部函

    數將不能正常執行. 所 以,python規定. 如果你在內部函數中訪問了外層函數中的變量.那麼這個變量

    將不會消亡. 將會常駐在記憶體中. 也就是說. 使用閉包,可以保證外層函數中的變量在記憶體中常駐. 

    註意: 綜上, 閉包的作用就是讓一個變量能夠常駐記憶體. 供後面的程式使用. 

 

 

三. 迭代器

  1. 我們之前一直在用可迭代對象進行迭代操作. 那麼到底什麽是可迭代對象. 本小節主要討論可迭代對象.

  首先我們先回顧一下目前我們所熟知的可迭代對象有哪些: str, list, tuple, dict, set. 那為什麽我們可以

  稱他們為可迭代對象呢? 因為他們都遵循了可迭代協議. 什麽是可迭代協議.

  首先我們先看一段錯誤代碼:

        # 對的 
        s = "abc"
        for c in s:
            print(c) 

        # 錯的 
        for i in 123:
             print(i) 
        結果: 
       Traceback (most recent call last):
          File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 8, in <module>
            for i in 123: 
        TypeError: 'int' object is not iterable
     

 

    2. 註意看報錯信息中有這樣一句話. 'int' object is not iterable . 翻譯過來就是整數類型對象是不可迭代的.

    iterable表示可迭代的. 表示可迭代協議. 那麼如何進行驗證你的數據類型是否符合可迭代協議.我們可以

    通過dir函數來查看類中定義好的所有方法. 

        s = "我的哈哈哈" 
        print(dir(s))       # 可以列印對象中的方法和函數 
        print(dir(str))     # 也可以列印類中聲明的方法和函數

  在列印結果中. 尋找__iter__ 如果能找到. 那麼這個類的對象就是一個可迭代對象.

  ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',

   '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__',   '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__','__mul__', '__ne__', '__new__',   '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',   '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',

  'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric',   'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind',   'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate',

  'upper', 'zfill']

   我們發現list, tuple, dict, set 可以進行for迴圈的東西都有__iter__函數, 包括range也有我們發現在字元串中

  可以找到__iter__.  

  3. 我們還可以通過isinstence()函數來查 看一個對象是什麽類型的 

        l = [1,2,3] 
        l_iter = l.__iter__() 
        from collections import Iterable 
        from collections import Iterator 
        print(isinstance(l,Iterable))    #True 
        print(isinstance(l,Iterator))    #False         print(isinstance(l_iter,Iterator))    #True         print(isinstance(l_iter,Iterable))    #True 

  綜上. 我們可以確定. 如果對象中有__iter__函數. 那麼我們認為這個對象遵守了可迭代協議. 就可以獲取到相應

  的迭代器. 這里的__iter__是幫助我們獲取到對象的迭代器. 我們使用迭代 器中的__next__()來獲取到一個迭代

  器中的元素.  

  

  4. 那麼我們之前講的for的工作原理到底是什麼?

  繼續看代碼 

        s = "我愛北北京天安⻔門" 
        c = s.__iter__()    # 獲取迭代器器 
        print(c.__next__())     # 使用迭代器進行迭代. 獲取一個元素  我         print(c.__next__())     # 愛 
        print(c.__next__())     #
        print(c.__next__())     #
        print(c.__next__())     #
        print(c.__next__())     #
        print(c.__next__())     #
        print(c.__next__())     # StopIteration 

 

   for迴圈的機制: 

        for i in [1,2,3]:
            print(i) 

 

   5. 使用while迴圈+迭代器來模擬for迴圈(必須要掌握)

        lst = [1,2,3] 
        lst_iter = lst.__iter__() 
        while True:
            try:
                i = lst_iter.__next__()
                print(i)
            except StopIteration:
                break
 

 

  總結:

          Iterable: 可迭代對象. 內部包含__iter__()函數

         Iterator: 迭代器. 內部包含__iter__() 同時包含__next__().

          迭代器的特點:

              1. 節省記憶體.

              2. 惰性機制

              3. 不能反覆, 只能向下執行.

        我們可以把要迭代的內容當成子彈. 然後呢. 獲取到迭代器__iter__(), 就把子彈都裝在彈夾中. 然後發射

     就是__next__()把每一個子彈(元素)打出來. 也就是說,for迴圈的時候.一開始的 時候是__iter__()來獲取

     迭代器. 後面每次獲取元素都是通過__next__()來完成的. 當程式遇到 StopIteration將結束迴圈.   

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Description 根據一些書上的記載,上帝的一次失敗的創世經歷是這樣的: 第一天, 上帝創造了一個世界的基本元素,稱做“元”。 第二天, 上帝創造了一個新的元素,稱作“α”。“α”被定義為“元”構成的集合。容易發現,一共有兩種不同的“α”。 第三天, 上帝又創造了一個新的元素,稱作“β”。“β ...
  • python3中str預設為Unicode的編碼格式 Unicode是一32位編碼格式,不適合用來傳輸和存儲,所以必須轉換成utf-8,gbk等等 所以在Python3中必須將str類型轉換成bytes類型的 在Python中使用encode的方式可以進行字元的編碼 實際用法: >>>a = "中國 ...
  • 半夜整理東西,發現一個以前沒留意到的小問題。 PHP 7.0+ 里支持了函數(和方法)的返回值類型提示,上述第二種寫法在解釋運行時會觸發一個 Fatal Error,要求返回值必須是 integer 類的一個實例: 當然,兩者在強制類型轉換時效果是一樣的: 相關鏈接 PHP difference b ...
  • 使用工具(可點擊下載) Microsoft HTML HELP javadoc2html 上述軟體基於Windows系統,javadoc2chm安裝過程中系統會檢測HTML HELP是否存在。簡單地下載安裝即可。 材料:jdk官方文檔 到oracle官網下載一個叫jdk-xuyyy-docs-all ...
  • Hibernate框架第一天 今天任務 教學導航 框架和CRM項目的整體介紹 Hibernate框架的學習路線 案例一:完成客戶的CRUD的操作 需求分析 技術分析之Hibernate框架的概述 Hibernate框架的概述 什麼是ORM(對象關係映射) Hibernate優點 技術分析之Hiber ...
  • 高階函數 概念 Scala混合了面向對象和函數式的特性,我們通常將可以作為參數傳遞到方法中的表達式叫做函數。在函數式編程語言中,函數是“頭等公民”,高階函數包含:作為值的函數、匿名函數、閉包、柯里化等等。 作為值的函數 可以像任何其他數據類型一樣被傳遞和操作的函數,每當你想要給演算法傳入具體動作時這個 ...
  • 安裝了go語言之後,還要設置路徑,如果不設置路徑,則執行 go 的時候會提示 go: command not found,提示的意思是沒有這個命令行。這個是因為還沒有設置PATH路徑。 設置路徑的方式是vi ~/.bash_profile,進去在首行添加一行 export PATH=$PATH:/u ...
  • 二分是一種常用而且非常精妙的演算法,常常是我們解決問題的突破口。二分的基本用途是在單調序列或單調函數中做查找操作。因此,當問題的答案具有單調性時,就可以通過二分把求解轉化為判定(根據複雜度理論,判定的難度小於求解)。進一步的,我們還可以通過三分(適用於求解凸性函數)解決單峰函數的極值以及相關問題。 二 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...