偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python中看似沒(méi)用的寫法,卻是老手都不一定會(huì)的

開(kāi)發(fā) 前端
函數(shù)里面直接使用變量就好了,非要定義成函數(shù)參數(shù)嗎?今天我們研究一下這玩意到底解決什么問(wèn)題以及它的原理。

一次無(wú)意間看到如下的代碼:

心想:咦?這不是脫褲子放屁嗎?函數(shù)里面直接使用變量就好了,非要定義成函數(shù)參數(shù)。

結(jié)果沒(méi)想到這是解決問(wèn)題的關(guān)鍵。今天我們研究一下這玩意到底解決什么問(wèn)題以及它的原理。

現(xiàn)在我們從最簡(jiǎn)單的函數(shù)使用外部變量的情況開(kāi)始:

為了在函數(shù)中使用外部的變量,這是最直觀的做法。這種在函數(shù)中直接使用外部定義的變量,還有一種叫法:'閉包'。

我相信就算不了解 python 查找變量規(guī)則的初學(xué)者,也能一下子理解函數(shù)執(zhí)行后會(huì)輸出什么。因?yàn)?python 就是為了讓其符合直覺(jué)才把規(guī)則設(shè)計(jì)成這樣。

現(xiàn)在稍微修改一下代碼:

在函數(shù)執(zhí)行之前,修改了外部的變量,大家認(rèn)為函數(shù)執(zhí)行后打印了什么?

看看結(jié)果:

不知道你猜對(duì)了沒(méi)有,不過(guò)我是覺(jué)得這個(gè)結(jié)果同樣符合直覺(jué)。

你也覺(jué)得結(jié)果符合直覺(jué)嗎?

這是因?yàn)楹瘮?shù)里面使用外部變量,就是要表達(dá):“執(zhí)行 print 時(shí),獲取變量此時(shí)此刻的值。

那么,現(xiàn)實(shí)中會(huì)不會(huì)出現(xiàn)一些場(chǎng)景,我們就是希望函數(shù)執(zhí)行時(shí),得到的是 創(chuàng)建函數(shù)的時(shí)候,外部變量的值,而非執(zhí)行時(shí)刻的值 ?

沒(méi)錯(cuò),就是文章開(kāi)篇的寫法:

真的存在這樣子的場(chǎng)景嗎?而且,這是什么原理?

我們可以歸納以上代碼的特點(diǎn):

  • 定義了函數(shù)
  • 函數(shù)內(nèi)部,希望使用外部定義的變量
  • 定義函數(shù)后,并沒(méi)有立刻執(zhí)行,并且當(dāng)函數(shù)執(zhí)行的時(shí)候,使用的外部變量很可能已經(jīng)被修改了

由于 python 寫交互的程序不多,一個(gè)函數(shù)的執(zhí)行時(shí)機(jī)基本上都是我們使用代碼明確編寫。但是大概有2種例外情況:

  • 把函數(shù)交給別的調(diào)度器,在合適時(shí)機(jī)執(zhí)行。比如多線程多進(jìn)程
  • 在界面編程中,綁定各種事件。事件函數(shù)只會(huì)在用戶與界面交互時(shí)才被觸發(fā)執(zhí)行

在這些場(chǎng)景中,最容易出現(xiàn)的情況是,在一個(gè)循環(huán)遍歷中,定義函數(shù),綁定函數(shù)。下面是一個(gè)循環(huán)創(chuàng)建10個(gè)按鈕,點(diǎn)擊時(shí)界面出現(xiàn)提示信息:

上面的代碼創(chuàng)建了10個(gè)不同的函數(shù)對(duì)象,可惜的是,行7的變量 idx 是外部的變量 idx(行4),并且在循環(huán)執(zhí)行過(guò)程中,idx 的值不斷增加,最終的值停留在 9。

因此,界面上不管點(diǎn)擊哪個(gè)按鈕,顯示信息都是 9

現(xiàn)在,我們使用之前學(xué)會(huì)的套路,定義函數(shù)參數(shù)默認(rèn)值解決:

我特意讓參數(shù)名與外部變量不一致,這更容易理解原理。

到底為什么這樣子寫可以解決問(wèn)題,我們不妨把循環(huán)給展開(kāi)(只展開(kāi)2次):

注意行15 與 行23 ,定義函數(shù)的時(shí)候,我們把此刻的 idx 值,付給了參數(shù) num 作為默認(rèn)值。相當(dāng)于如下代碼:

此時(shí),這個(gè)默認(rèn)值不再隨 idx 修改而改變。所以每個(gè)按鈕綁定的函數(shù),看似代碼邏輯是一模一樣,但是每個(gè)函數(shù)的參數(shù) num 都是不一樣的值。

你學(xué)會(huì)了嗎?

責(zé)任編輯:趙寧寧 來(lái)源: 數(shù)據(jù)大宇宙
相關(guān)推薦

2010-11-17 11:11:44

跳槽

2020-08-30 14:31:40

Python編程語(yǔ)言開(kāi)發(fā)

2021-02-26 09:04:22

數(shù)組ArrayListHashMap

2025-04-03 09:51:37

2018-01-18 05:20:59

2013-05-14 10:41:16

Palo AltoNGFWUTM

2021-01-29 09:17:00

深度學(xué)習(xí)AI人工智能

2020-05-20 09:37:45

人工智能

2009-11-25 09:20:31

Windows 7網(wǎng)絡(luò)掉線

2022-12-26 09:16:45

Guava架構(gòu)模型

2016-11-28 11:19:48

術(shù)語(yǔ)神秘

2018-05-15 16:01:53

對(duì)象內(nèi)存JVM

2018-02-08 09:11:25

Linux命令rm

2015-06-29 11:38:47

物聯(lián)網(wǎng)

2022-04-26 06:53:37

HBaseMD5RowKey

2018-03-09 10:34:48

顯卡參數(shù)超頻

2016-01-11 11:50:39

JavaScript閉包面試題

2021-06-18 10:29:17

物聯(lián)網(wǎng)安全互聯(lián)網(wǎng)IoT

2021-07-19 10:15:53

Java絕對(duì)值代碼

2023-12-18 13:10:00

finally死鎖JVM 崩潰
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)