自學兩周搓侄,剛剛在踩過無數(shù)坑瞄桨,成功跑通了一個小爬蟲(在 linkedin 找到做過某項業(yè)務(wù)的產(chǎn)品經(jīng)理,并把他們的項目等信息寫入一個文件)之后讶踪,我想總結(jié)一下 Python 的學習芯侥。
Python 里最難的概念是什么?
這里的概念乳讥,我指的是構(gòu)成 Python 的基本概念柱查,是其他概念的基石,不包括諸如 “xx模塊”這樣的基于基石的概念云石。
Python 的基石概念唉工,我認為有變量、列表/字典汹忠、函數(shù)淋硝、類。(有些可能也是所有編程語言的基本概念宽菜,不了解其他語言谣膳,大神輕拍,下同)
這些概念是由淺入深的層級關(guān)系:
有關(guān)形狀(空間)
- 一級概念:變量
- 二級概念:列表铅乡、字典(變量及變量間聯(lián)系)
有關(guān)輸入輸出(時間)
- 三級概念:函數(shù)
- 四級概念:類(函數(shù)及函數(shù)間聯(lián)系(時空概念))
時間和空間我等下再提继谚。先解釋下層級。列表阵幸、字典是在變量基礎(chǔ)之上花履,可以描述變量之間關(guān)系的概念芽世,因而比變量高一個層級。
我剛學這一塊時就遇到了一個難點诡壁,隨便舉個例子:
假如有個列表
names=['monica','rachel','joey',ross']
要給每個名字加上 ‘hot ’济瓢,變成例如 ‘hot monica’,最簡單怎么改呢欢峰?我一開始總想用 for name in names 去改葬荷,雖然也可以(生成新變量,刪掉原列表的內(nèi)容纽帖,再把新變量加到原列表中)宠漩,但是更方便的是:
for i in range(len(names)) :
??names[I]='hot '+names[i]
所以,列表比變量高級的地方在于懊直,它還能表達變量間的關(guān)系扒吁。列表的“位置”概念(或者說屬性)就是一種變量間關(guān)系。而 for name in names 實際上還是從變量的思維在考慮室囊。
函數(shù)比前面兩個概念難的地方是在于它是一個時間概念雕崩。先有輸入后有輸出。而列表融撞、字典只有組合盼铁、位置這樣的空間概念。所以函數(shù)會更難尝偎。(但我們高中都學過可能不覺得難饶火。)關(guān)于時間和空間概念可以參考我的另外一篇文章《產(chǎn)品經(jīng)理的時空思維》。
類:最難的基石概念
剛學類的時候致扯,覺得類是一個好東西肤寝,定義好了一系列通用方法,遇到類似場景傳個參數(shù)調(diào)用一下抖僵,就可以出結(jié)果鲤看。像個萬能模子。
但實際根本不是這么一回事耍群。
先看一個《Python編程:從入門到實踐》的例子:
現(xiàn)在要做一個簡單的問卷义桂,可以收集用戶輸入的答案。
已經(jīng)有了類 AnonymousSurvey 世吨,你要怎么用呢澡刹?
函數(shù)2、4是可以直接給到輸出的函數(shù)耘婚,但必須先定義 變量 question、response/responses陆赋。
question 是需要我們提供的參數(shù)沐祷,而 response/responses 需調(diào)用函數(shù)3嚷闭。
而調(diào)用函數(shù)3 需給到變量 new_response, 這是我們需要給到的參數(shù)。
所以這里的步驟是
- 提供參數(shù) question 調(diào)用函數(shù)2赖临,得到輸出
- 提供參數(shù) new_response -> 調(diào)用函數(shù)3胞锰,獲得變量 response/responses -> 調(diào)用函數(shù)4,得到輸出
所以并不是你在入口提供參數(shù) question兢榨、new_response, 你在出口坐等函數(shù)4的輸出就好了嗅榕。你需要參與制作提供給函數(shù)4的變量。
我把函數(shù)2吵聪、4這樣的可以提供最終輸出的函數(shù)定義為“輸出函數(shù)”凌那,把函數(shù)1、3這樣的幕后工作者定義為“功能函數(shù)”吟逝,它們只有輔助功能帽蝶,參與制造用于輸出的關(guān)鍵變量,而不直接輸出块攒。把 question励稳、new_response 這樣需要我們提供的函數(shù)定義為“參數(shù)變量”,把 response/responses 這樣的在類里面的囱井,只承擔功能但無需提供的變量叫做“功能變量” 驹尼。
為了更清晰,羅列一下:
- 參數(shù)變量:question庞呕,new_response
- 功能變量: response/responses
- 功能函數(shù):1新翎,3
- 輸出函數(shù):2,4
我作為小白剛學習類時千扶,看到上面那個調(diào)查問卷的問題就傻眼了:這里的變量都可以直接拿來用么料祠?調(diào)用哪個函數(shù)呢?
但現(xiàn)在就會明白澎羞,功能變量可以直接用髓绽,但參數(shù)變量需要定義。類中的函數(shù)妆绞,不是全給你直接輸出的顺呕,有些是用來創(chuàng)造功能變量的。
所以類并不是一個模子括饶,你丟進去原料株茶,出來成品。類也不是一個超市图焰,羅列了很多工具启盛,你挑選合適的工具,得到需要的輸出。類是給到你原料和工具僵闯,你用一部分工具和原料創(chuàng)造一些關(guān)鍵配件卧抗,然后再用剩下的工具和你創(chuàng)造的配件來制造成品。
類經(jīng)歷了這么一個過程:
參數(shù)變量鳖粟,功能函數(shù) -> 功能變量 -> 輸出函數(shù)
所以它不僅有函數(shù)和函數(shù)關(guān)系這樣的空間概念社裆,還包括上面的時間關(guān)系,因而我覺得是最難的概念向图。
掌握了基石概念泳秀,就能學會 Python 嗎? Too naive…在自己寫代碼時還會有各種問題榄攀,很重要的一點是由于編程語言思維和我們?nèi)粘=鉀Q問題的思維是不一樣的嗜傅。留待下一篇講。