技術不須要枯燥的術語也能夠被理解java
別人的每次提問都能提醒本身學習的東西是什麼python
因此我寫了這個系列web
但願你們能在輕鬆愉快的提問中理解枯燥的技術點面試
某天,小方正在工位上哼哧哼哧寫代碼,忽然微信里老板又叫他微信
小方啊,你過來一下網絡
我內心一緊,是我上個月請假次數太多了被注意了嗎?仍是我偷偷摸魚被舉報了?懷着忐忑不安的心,我來到了老闆的辦公室閉包
哎,小方你來啦!上次不是問你 選python仍是選java嘛 ,我想了想就作個數據分析,仍是簡單點用python吧。看了一遍python的基礎語法,怎麼發現這跟我當年學的徹底不同啊!函數內部怎麼能訪問外部的成員變量呢?你快給我講講編輯器
(原來是問這個啊)噢,老闆,這個說的是python變量的做用域....函數
啥的做用域?post
變量!變量的做用域!! 咱們每一個人都在接觸變量這個概念。但變量是什麼東西呢? 說白了他就是計算機裏的一塊內存空間,就是存放數值的地方。咱們修改變量的值實際上修改的是內存空間存儲的值。當咱們寫a = 1
這行代碼時,其實是幹了兩件事:
一是新建了一塊內存空間存放a
二是把1
這個值塞到這個內存空間裏
咱們能夠在代碼的許多地方定義變量,其實就是新建了許多個存放數值的內存空間
噢噢,這些我上大學的時候學過,那你剛說的python的做用域是怎麼回事?
「做用域」簡單理解就是變量起做用的區域。咱們定義一個變量後確定不是處處都能使用的,這就須要咱們明白變量的做用範圍,也就是做用域。其實很簡單,就是一個洋蔥結構,一環套一環。
變量的做用域遵循一個原則,裏面的能夠訪問外面的,外面的不能訪問裏面的。老闆你徹底不須要記這些名詞啦,規則啦,一個例子你就懂了:
看,很簡單吧
噢,原來我直接定義的變量就是全局變量啊,不就是至關於java里加了static修飾的變量嘛,怪不得能直接訪問,早說嘛
對對對,老闆你最聰明瞭!你是最棒的!
那個嵌套做用域是咋回事啊?我咋歷來沒見過?
這是python特有的寫法。 python能夠在函數內部再定義函數,也就實現了函數嵌套。嵌套函數裏面的變量就是嵌套的局部變量,外部函數就是局部變量,他們同樣遵循變量訪問的原則噠
胡說!我剛剛試了一下,嵌套函數不能修改外部函數的變量!你是否是不行啊?!回頭就扣你工資!
別別別! 老闆!我剛說的是「訪問」,訪問啊!你用嵌套函數修改外部函數變量,這是閉包啊,閉包固然沒法直接修改局部變量了,他只有訪問權,沒有修改權!我如今給你寫個例子,你別扣我工資啊啊!!
那你剛剛一本正經的說什麼裏面訪問外面的,我懷疑你小子在晃點我!
要修改也能夠... 使用nonlocal
關鍵字聲明一下就能夠改了
真是的,話都不說清楚。對了,你剛剛說的閉包是啥玩意?
(嗚嗚嗚)咱們定義的函數,其實是一個處理一段邏輯的代碼塊,咱們能夠叫它「一塊代碼」,也能夠形象地說這是一個「包」。「閉包」呢,就是這個「包」它不知足只處理本身包含的這些邏輯,還想引用函數以外的一些變量,當它知足這些條件時,就把這個『函數+變量』總體稱爲閉包。
關於閉包有一道經典面試題,老闆你能夠看下:
下面代碼輸出的結果是什麼?
這麼簡單,不就是 [0,2,4] 嗎?你當我傻麼
是 [4,4,4] 我給你跑一下...
剛纔我不是說過變量的本質麼。看上去這個for
循環的索引值i
每次都做爲嵌套函數的一部分添加到list
裏了。但您仔細想一想,return x * i
是何時被調用的?是 print f(2)
的時候才調用的對吧,這時候的x * i
的i
的值是多少呢?i
只是一塊被定義出來的內存空間,隨着for
循環一次次改變本身存儲的值,當for
循環結束時,它的值就不會再變了,因此i
的值在被調用的時候一直是 2,結果也就是 [4 ,4,4] 了。
那我就想要 [0,2,4] 咋辦?
額,也有辦法。我第一次作這道題的時候也覺得是 [0,2,4] ,後面知道正確答案後才發現本身思惟過程當中有一個盲點。就是我默認每次for
循環的i
都存到func
裏了。若是要想要 [0,2,4] ,就是想辦法把i
的值存一下給嵌套函數func
。而函數的參數原本不就是複製值到函數內部麼。因而我就在func
外面再定義一個函數,參數值是i
,目的就是把i
保存下來提供給嵌套函數使用。這樣嵌套函數和i
就組成了一個閉包,結果也符合預期
嗨,我剛沒看清。這玩意有啥用啊,花裏胡哨的,這幫面試官就會整人!
也不是徹底沒用.... 閉包的變量能夠用來保存上一次的運行環境。當咱們有需求是須要上一次的運行結果做爲這一次的參數時,就能夠用閉包來解決。好比你寫一個「下棋遊戲中棋子移動」的代碼,棋子的每次移動都是用上一次的座標爲起點的。這時候就能夠用閉包來解決了。這裏也有一道面試題,老闆你要不要看看?
我看面試題有啥用?! 等會,那啥,待會發我微信就行了
(老闆你果真想...)好的。。
好了好了,這些我都會了,也沒什麼難的嘛,你先回去吧,好好工做啊,公司還得靠你!
(尷尬)哈哈,那我先走了
(關門)
過了一會,我把題目發給了老闆:
答案是:
輸出結果:
以上就是本期的所有內容啦,若是你喜歡這篇文章的內容,或者哪怕有一點小小的幫助,能夠點個贊再走哦 ~
求贊,求關注,求三連 ! 我翻個跟斗謝謝大夥的捧場了!
我叫方木,大家也能夠叫我小方 ~
天天我都會分享一篇文章給你們
多是「網絡」,多是「計算機基礎」,也多是「python」,「數據分析」
我一直以爲,技術不須要枯燥的術語也能夠被理解
因此我想把我理解的東西整理分享給你們
若是你有什麼建議或者意見的話 歡迎 提給我
大家的每一個 點贊 和 關注 都是我持續輸出的動力!
咱們都在這個世界中掙扎着
歡迎你們和我一塊兒成長