日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python中看似沒用的寫法,卻是老手都不一定會的原理。解決閉包延遲綁定

來源: 責編: 時間:2023-12-08 09:14:41 255觀看
導讀一次無意間看到如下的代碼:心想:咦?這不是脫褲子放屁嗎?函數里面直接使用變量就好了,非要定義成函數參數。結果沒想到這是解決問題的關鍵。今天我們研究一下這玩意到底解決什么問題以及它的原理。現在我們從最簡單的函數

一次無意間看到如下的代碼:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

心想:咦?這不是脫褲子放屁嗎?函數里面直接使用變量就好了,非要定義成函數參數。g0P28資訊網——每日最新資訊28at.com

結果沒想到這是解決問題的關鍵。今天我們研究一下這玩意到底解決什么問題以及它的原理。g0P28資訊網——每日最新資訊28at.com

現在我們從最簡單的函數使用外部變量的情況開始:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

為了在函數中使用外部的變量,這是最直觀的做法。這種在函數中直接使用外部定義的變量,還有一種叫法:'閉包'。g0P28資訊網——每日最新資訊28at.com

我相信就算不了解 python 查找變量規則的初學者,也能一下子理解函數執行后會輸出什么。因為 python 就是為了讓其符合直覺才把規則設計成這樣。g0P28資訊網——每日最新資訊28at.com

現在稍微修改一下代碼:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

在函數執行之前,修改了外部的變量,大家認為函數執行后打印了什么?g0P28資訊網——每日最新資訊28at.com

看看結果:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

不知道你猜對了沒有,不過我是覺得這個結果同樣符合直覺。g0P28資訊網——每日最新資訊28at.com

你也覺得結果符合直覺嗎?g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

這是因為函數里面使用外部變量,就是要表達:“執行 print 時,獲取變量此時此刻的值。g0P28資訊網——每日最新資訊28at.com

那么,現實中會不會出現一些場景,我們就是希望函數執行時,得到的是 創建函數的時候,外部變量的值,而非執行時刻的值 ?g0P28資訊網——每日最新資訊28at.com

沒錯,就是文章開篇的寫法:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

真的存在這樣子的場景嗎?而且,這是什么原理?g0P28資訊網——每日最新資訊28at.com

我們可以歸納以上代碼的特點:g0P28資訊網——每日最新資訊28at.com

  • 定義了函數
  • 函數內部,希望使用外部定義的變量
  • 定義函數后,并沒有立刻執行,并且當函數執行的時候,使用的外部變量很可能已經被修改了

由于 python 寫交互的程序不多,一個函數的執行時機基本上都是我們使用代碼明確編寫。但是大概有2種例外情況:g0P28資訊網——每日最新資訊28at.com

  • 把函數交給別的調度器,在合適時機執行。比如多線程多進程
  • 在界面編程中,綁定各種事件。事件函數只會在用戶與界面交互時才被觸發執行

在這些場景中,最容易出現的情況是,在一個循環遍歷中,定義函數,綁定函數。下面是一個循環創建10個按鈕,點擊時界面出現提示信息:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

上面的代碼創建了10個不同的函數對象,可惜的是,行7的變量 idx 是外部的變量 idx(行4),并且在循環執行過程中,idx 的值不斷增加,最終的值停留在 9。g0P28資訊網——每日最新資訊28at.com

因此,界面上不管點擊哪個按鈕,顯示信息都是 9g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

現在,我們使用之前學會的套路,定義函數參數默認值解決:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

我特意讓參數名與外部變量不一致,這更容易理解原理。g0P28資訊網——每日最新資訊28at.com

到底為什么這樣子寫可以解決問題,我們不妨把循環給展開(只展開2次):g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

注意行15 與 行23 ,定義函數的時候,我們把此刻的 idx 值,付給了參數 num 作為默認值。相當于如下代碼:g0P28資訊網——每日最新資訊28at.com

g0P28資訊網——每日最新資訊28at.com

此時,這個默認值不再隨 idx 修改而改變。所以每個按鈕綁定的函數,看似代碼邏輯是一模一樣,但是每個函數的參數 num 都是不一樣的值。g0P28資訊網——每日最新資訊28at.com

你學會了嗎?g0P28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-39512-0.htmlPython中看似沒用的寫法,卻是老手都不一定會的原理。解決閉包延遲綁定

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解并發控制:掌握鎖的精髓,你學會了嗎?

下一篇: Netty入門實踐:模擬IM聊天

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 波密县| 淄博市| 襄城县| 简阳市| 龙川县| 扎赉特旗| 稻城县| 咸宁市| 泰顺县| 景洪市| 阳泉市| 南溪县| 拉孜县| 齐齐哈尔市| 时尚| 平原县| 盱眙县| 化德县| 仪陇县| 柳河县| 墨脱县| 时尚| 攀枝花市| 三门峡市| 赞皇县| 普安县| 哈巴河县| 始兴县| 灵寿县| 蚌埠市| 房山区| 昌宁县| 泌阳县| 梁河县| 丽江市| 花莲市| 诸暨市| 光山县| 鲜城| 冷水江市| 阿勒泰市|