你學(xué)習(xí) Python 的時(shí)候,用到舒服姿勢了么?
你在學(xué)習(xí)和使用 Python 的時(shí)候,可能會(huì)遇到這么些情況:
剛學(xué) Python 語句的時(shí)候,不知道它的運(yùn)行原理是怎樣的?
報(bào)錯(cuò)了一頓重啟,能跑就行?
學(xué)習(xí)知識點(diǎn)的時(shí)候,沒有「做好姿勢」?
要不我們來模擬一下,在學(xué)習(xí)一個(gè) Python 知識點(diǎn)的過程中,怎么樣才能讓你覺得更好玩,或者說怎么樣的學(xué)習(xí)姿勢才能讓你舒服點(diǎn)?
請對號入座,走起!
比如,你在寫函數(shù)、調(diào)用函數(shù)的時(shí)候,是不是在給函數(shù)傳遞參數(shù)的時(shí)總是那么的「理所當(dāng)然」,可有時(shí)候又會(huì)覺得「不可思議」?
舉一個(gè)簡單的例子:
像這樣一個(gè)簡單的函數(shù)調(diào)用:

你覺得此刻輸出的結(jié)果是多少?
答案是 1 ,你(假設(shè)你剛學(xué) Python 不久)可能會(huì)感到困惑。
這不是調(diào)用了 add 方法,給他丫的加一了么?結(jié)果不應(yīng)該是 2 嗎?
你先別急,我們再來看看這個(gè):

你覺得此刻輸出的結(jié)果又是多少?
經(jīng)過上次的「經(jīng)驗(yàn)」,我猜你此時(shí)認(rèn)為輸出結(jié)果就是 [1, 2, 3],但不好意思,這次輸出的結(jié)果是 [1, 2, 3, 6]。
想不到吧?

我想你在學(xué)習(xí) Python 的過程中,像以上出現(xiàn)類似的困惑還有很多很多...
那如果現(xiàn)在把代碼執(zhí)行的每個(gè)步驟都清晰地、可視化地給你看清楚,又會(huì)是一種什么樣的效果呢?
我們不妨來試試第一段代碼:

從第一行開始運(yùn)行,我們定義了一個(gè)名為 add 的函數(shù),add 函數(shù)定義了一個(gè)參數(shù) x:

接著執(zhí)行 a=1, 現(xiàn)在內(nèi)存開辟了一個(gè)空間,存放對象 1,變量 a 指向了對象 1:

下一步就是調(diào)用 add(a) 方法了:

add 方法中執(zhí)行了 x += 1 操作,此時(shí)方法中 x 指向?qū)ο?2:

那我們現(xiàn)在 print(a), a 還是指向 1,所以結(jié)果是 1。

我們再來看第二段代碼:

代碼看似差不多,只不過這里是把參數(shù)的數(shù)據(jù)類型換成了列表。
從第一行開始運(yùn)行,我們定義了一個(gè) add 函數(shù),add 函數(shù)定義了一個(gè)參數(shù) x:

接著執(zhí)行 a = [1, 2, 3],現(xiàn)在內(nèi)存開辟了一個(gè)空間,存放對象 [1,2,3],變量 a 指向了這個(gè) list 對象:

下一步就是調(diào)用 add(a) 方法了 ( 此時(shí) x 指向了 list?):

add 方法中執(zhí)行了append 操作,list 變成了 [1,2,3,6]:

可以看到現(xiàn)在 a 指向的是對象 [1,2,3,6],所以 print(a) 輸出結(jié)果就是 [1,2,3,6]。
嗯,你看到區(qū)別了。
為嘛?當(dāng)參數(shù)是 1 的時(shí)候,調(diào)用 add 方法是這樣的:

而當(dāng)參數(shù)是列表時(shí),調(diào)用 add 方法是這樣的:

你很想知道為什么會(huì)這樣,于是開始搜索了一波數(shù)據(jù)類型的區(qū)別:

接著你看到了這玩意:

你發(fā)現(xiàn) Number 是不可變數(shù)據(jù),List 是可變數(shù)據(jù)。
通過搜索可變類型和不可變類型的區(qū)別,你慢慢的就明白了:
因?yàn)?Number 是不可變的,所以你開始執(zhí)行 a = 1 的時(shí)候,開辟出來的內(nèi)存用來存放對象 1 ,由于這里的 1 是不可變的,所以在調(diào)用 add 方法時(shí),就又會(huì)開辟一個(gè)新的空間來創(chuàng)造新的內(nèi)存地址給 x 引用。
而 List 是可變的,當(dāng)調(diào)用 add 方法時(shí),不需要再開辟新的內(nèi)存空間了,x 可以直接指向 list,此時(shí) x 做了 append 操作,list 變成了 [1,2,3,6],a 指向的也是它。
發(fā)現(xiàn)了么?整個(gè)過程中,你就好像在玩一樣,沒有什么所謂的「學(xué)習(xí)的痛苦」。
你自己通過「發(fā)現(xiàn)問題——找到關(guān)鍵點(diǎn)——很想弄明白——搜索——結(jié)合自己的問題找到答案」,就把一個(gè)小知識點(diǎn)掌握了。
如果下次面試被問到這相關(guān)的問題,你的腦子馬上就會(huì)浮現(xiàn)出來這兩張當(dāng)時(shí)令你困惑的圖片:


那么你肯定能對著面試官滔滔不絕,整個(gè)思路也相當(dāng)清晰。
學(xué)習(xí)的「舒服姿勢」
在我看來,整個(gè)學(xué)習(xí)的過程中,更多的是自己「主動(dòng)」起來,才能體會(huì)到那種高效,舒服。
也許有些事情別人可以手把手的教你操作,但這是有局限性的,而且自己也會(huì)顯得很是被動(dòng),沒有什么比自己通過閱讀,通過探索,通過實(shí)踐而掌握的技巧更讓人舒服了。
我之前在公眾號安利過不少好用的「工具」,有人問我說,你是如何發(fā)現(xiàn)那么些好用的工具的?我想說的是,如果你真的想知道它們,你就一定會(huì)發(fā)現(xiàn)它們的,只是時(shí)間的問題,因?yàn)檫@和你的「主動(dòng)」想要高效有關(guān)。
比如我剛剛給你演示的這個(gè)可視化代碼執(zhí)行流程:

這玩意在這:
pythontutor.com
這也是之前我在查閱資料,翻博客,不經(jīng)意間發(fā)現(xiàn)的。
另外,使用「圖像具像化」也是我常用的「姿勢」,我有時(shí)候遇到一些難題或者困惑,我會(huì)使用圖像的方式把它們表達(dá)出來,相比于文字,可以很清晰的看到問題的關(guān)鍵點(diǎn),降低了不少難度,并且解決完問題之后,過一陣子再看到類似的問題,還能夠想到當(dāng)初解決的思路,我想這可能是圖像的記憶比較深刻。你下次遇到問題的時(shí)候,不妨試試這招。
還有關(guān)于搜索能力這個(gè)我就不多說了,之前也分享過不少技巧,你可以去公眾號搜一下。
OK,以上就是小帥b今天給你帶來的分享,希望你可以主動(dòng)地通過工具的使用,閱讀的習(xí)得,問題的具像,搜索的能力,找到你最「舒服的姿勢」。
ps:公眾號最近做遷移,沒想到這過程中還給我整了點(diǎn)幺蛾子,所以留言還是得再等等了。哦對了,一直肝原創(chuàng)不容易呀,覺得對你有幫助的話,記得多多支持小帥b,能贊賞的贊賞,不能贊賞的轉(zhuǎn)發(fā)一下,滿滿的動(dòng)力呀,謝謝,愛你喲~那么我們下回見啦,peace!
