Python_基礎個人理解_閉包

来源:https://www.cnblogs.com/sly-666/archive/2018/09/12/9638182.html
-Advertisement-
Play Games

閉包 ———— 個人理解簡述 閉包在某種含義上其本身其實也是一個函數。 定義的格式簡單來說為在一個函數內部再創建一個函數, 也就是一個外函數包裹了一個內函數, 在內函數里使用了外函數的臨時變數, 外函數的“return”返回值為內函數的引用(函數名)。 在形式上與迴圈嵌套有些相似, 暫且也可稱之為函 ...


閉包

                       ———— 個人理解簡述

 

閉包在某種含義上其本身其實也是一個函數。

定義的格式簡單來說為在一個函數內部再創建一個函數,

也就是一個外函數包裹了一個內函數

在內函數里使用了外函數的臨時變數,

外函數的“return”返回值為內函數的引用(函數名)。

在形式上與迴圈嵌套有些相似,

暫且也可稱之為函數嵌套。

閉包的使用可以有效的隱藏函數內部的工作細節,

只給外部使用者提供一個可以執行的內部函數的應用。

如果在外函數里自定義了變數並且需要在內函數中對其進行修改,

需要將變數聲明為 “nonlocal”nonlocal 聲明變數為非本地變數,

如果確定在程式要修改外部變數,那麼建議將 nonlocal 寫在內部函數的第一行。

 

舉個慄子:

如圖:

      在這段代碼中,在實際開發中並沒有實際意義,只是簡單示意了函數可以被當做參數和返回值使用。

 

有兩點需要註意:

   1>  儘量不要使用全局變數,因為全局變數會破壞程式的封裝性。

     2>  如果 show 函數不想被 callFunc 以外的函數進行訪問時,是無法控制的

 

基於以上兩點,圖中代碼可以進行優化修改:

 

 

代碼進行優化後,去不再使用全局變數。而且將 show 函數封裝在了 callFunc 函數內部,使外部不可見,不能使用 show 函數,隱藏了實現細節

程式在執行時,callFunc 函數返回了內部定義的 show 函數,並且 在 show 函數內部使用了外部函數的變數

在 show 函數返回時,保存了當前的執行環境,也就是會在 show 函數中使用的外部變數 n 。

因為 n 是一個 callFunc 函數中的局部變數,正常情況下 callFunc 函數執行結束後,n 就會被釋放。

但是現在因為 callFunc 函數中返回了 show 函數,show 函數在外部還會再執行,所以程式會將 show 函數所需的執行環境保存下來。

 

水平一般,能力有限,如有不足,加以改正。

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 一.JDK的下載和安裝 這裡提供32位和64位JDK的下載鏈接 百度網盤:https://pan.baidu.com/s/1xtiVOE2gPCvlGCTy0vfBaw 密碼:c5m4 官網:https://www.oracle.com/technetwork/java/javase/downloa ...
  • 做Qt開發的會知道QLineEdit是預設沒有clicked事件的,但是Qt有很好的一套信號/槽機制,而且Qt是基於C++面向對象的思想來設計的,那麼我們就很容易通過自己定義一些類,重寫QLineEdit的一些方法去實現沒有的方法,比如clicked事件.本人就以QLineEdit 添加clicke ...
  • 首先聲明,賭博一定不是什麼好事,也完全沒有意義,不要指望用彩票發財。之所以寫這個,其實是用來練手的,可以參考這個來預測一些其他的東西,意在拋磚引玉。 啰嗦完了,馬上開始,先上偽代碼 打開網址 讀取內容內容解析 根據源碼得到需爬取內容 1、開獎日期:2018年8月26日 2、紅球 <li class= ...
  • 原文:developer.okta.com/blog/2018/07/30/10 ways to secure spring boot 譯文:www.jdon.com/49653 Spring Boot大大簡化了Spring應用程式的開發。它的自動配置和啟動依賴大大減少了開始一個應用所需的代碼和配置 ...
  • 題意 題目鏈接 求 $F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)$的最小值 Sol 強上模擬退火,註意eps要開大! ...
  • c3p0鏈接池初步使用:直接上代碼 1、在使用鏈接池的時候,需要加入如下依賴 2、鏈接池的配置c3p0-config.xml文件如下,需要載入到classpath環境下 3、代碼及測試 4、關於c3p0的其他參數配置,可以參照如下: ...
  • c/c++ 標準容器 之 初始化, 賦值, swap, 比較 知識點 1,容器的初始化,對應代碼里的test1 2,標準庫array的初始化,對應代碼里的test2 3,容器的賦值 ,對應代碼里的test3 4,容器的swap,對應代碼里的test4 5,容器的比較(==,!=, , =, incl ...
  • 本文旨在兩個線程交替運行,不多嗶嗶直接看代碼吧 該實現的原理也非常簡單,定義一個對象,因為一個對象有且只有一個鎖,所以讓兩個線程迴圈讓此對象解鎖->加鎖,從而達到線程交替運行的目的; 個人覺得此方法還不夠好,後續總結了再繼續補充,還望看到的大佬們多指點指點! ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...