要學就學Python?
個人認為,這實際上反映了編程語言(教學)史上兩大學派--C和Lisp學派經久不息的爭論.
C學派和Lisp學派分別代表了自底向上(from bottom to up)和自頂向下(from top to bottom)兩種教學方式."自底向上"派觀點認為,應當從計算機底層的知識開始教起,然后一步一步提高程序的抽象層次直至達到應用程序水平,所以在學習二進制之前,應該先具有邏輯電路的相關知識;在編寫任何嚴肅的程序以前,必須先掌握內存架構和內存分配相關知識,是一個從具體到抽象的過程.而另外一派的觀點則截然相反:應當先教授抽象的程序,這些程序是用什么語言寫的不重要,甚至這些程序只不過是偽代碼,只能"在心靈中執行",程序的思想不依賴于我們有沒有計算機,然后在實現的過程中再教授具體的東西(譬如,如果我們要實現一個排序算法,應該采用什么數據結構,這些數據結構用C語言的結構體如何實現,內存如何管理等等),是一個從抽象到具體的過程(所以Lisp非常適合這一目的,因為Lisp本來可看做一種符號語言,在紙上也能執行演算).
這兩種爭端在別的學科中也有,比如在數學中有布爾巴基學派(對應著"自底向上").兩種方法各有優越性,最后也是殊途同歸:C學派最后也會教授程序抽象和結構化程序設計,而Lisp學派也會涉及到計算機底層的細節(譬如內存分配,大概會從垃圾回收器來入手,而不是從C學派所用策略).只不過就目前的趨勢來看,"自頂向下"一派似乎更有優勢一些.
其實也沒什么奇怪的,考慮到計算機的普及,越來越多非專業人士也有編程的需要,這些并不關心任何計算機實現的細節,他們僅僅希望將手頭的任務完成,他們需要一門編程語言來實現他們頭腦中的想法,編程語言抽象層次越高越好,因為這樣就越接近他們的想法,實現的難度也就下降.例如抽象數據結構(Abstract DataStructure),一個人只需要知道這個數據結構上的接口(例如Python的List可以append,extend等等),就可以使用這個結構,而無須擔心這個List到底在堆上還是在棧上,實現的時候是單鏈表還是鏈表加上數組等等.
注意,這并不是說(像這個回答下一些人表達的觀點),采用"自頂向下"方法的人,就比采用"自底向上"方法的人,要"低級"一些.只不過這些人不必做某事,不代表他們不能做某事.
一個使用Python的人,一樣可以學習內存分配的相關知識(或者Java在這里更加合適),只不過,他并不像在C語言中那樣要頻繁使用到這個內存分配的知識,因為垃圾回收使得手動內存分配這件事情變得沒有必要.這也不是說內存分配知識在動態語言中毫無必要,只不過在動態語言中,內存分配的相關知識的運用,并不在于進行手動分配這一點上,而在于如何與編譯器的內存優化(局部變量放在棧上,逃逸變量檢測)和垃圾回收器協作.同樣的,Python沒有顯式的指針,不代表在Python不能學習指針這個概念,在動態語言中,引用是和指針對應的概念(引用是隱式的指針,動態語言的變量和靜態語言的變量不是一回事).
換句話說,如果上述底層實現的知識對于一個人而言是必要的(不管這個人是出于好奇還是什么緣故),那么從理論上說,他可以從Python出發來獲得這些知識,只不過實際上有一些因素限制了這一點,那就是絕大多數的較為底層的應用和教材都是用C語言寫的(也還有一些是用Java或者偽代碼之類的寫的),由于C的設計比別的語言更加simple(不像例如Rust之類的基于LLVM的語言,優化就有好幾層,編譯以后代碼都嚴重變形了),可以更好在課堂上教授(例如匯編代碼更加好閱讀等等,類型系統更加簡單).
所以這又產生了一個新的問題:任何試圖了解更多的人(尤其是操作系統和網絡編程的這些知識)都不可能繞過C語言(不管是考慮到歷史還是教育因素等等).但這并不能證明C語言沒有過時(當然也不能證明C語言就過時了).
如果"過時"的含義是從編程語言設計的角度說的,不是從編程語言流行程度的角度說的.從某種意義上看,C語言和Python語言都"過時"了(當然Python還是比C年輕),因為他們都差不多是上個世紀80,90年代的產物了,至多只能反應當時的編程語言的設計水平,也就是面向對象風靡的時刻,而像近幾年出現的Typescript等編程語言才能算是比較"先進",從這個角度說,沒有吸收最新編程語言研究成果的C語言確實就已經"過時"了.不過這種"過時"并不說C語言就不好,只不過是說對于這種編程語言,大家都已經研究透徹了,所以大家在著手設計更加復雜,更加抽象的編程語言.簡單的語言包含在更加復雜的語言之中,這并不代表簡單的語言過時.舉例而言,正則表達式比圖靈完備的語言簡單,但是日常編程的時候程序員仍然大量使用正則表達式,但這也并不代經常使用的正則表達式就要比更少使用的更加強大LL(1)優越一些。
說了那么多,就想指出一件事情:如果我們抽象的看待編程語言,那么C語言是完全包含在Python之中的,因此理論上,任何使用C的教材可以改成用Python來寫(但是這種改寫實際上至多發生在程序員的心靈之中,不會有人真的干這種事情),因此Python程序員無須因為Python比C更好寫而感到自不如人或者低人一等.從編程語言設計的角度上(和上手難易度)說,C語言確實比不上現在出現的新語言,但是從實際的使用上看,C語言還是比較比較主流的選擇.
其實這種糾結并不只是你有,還有800多萬的小伙伴在陪你一起糾結。
讓我來說,答案很簡單:選你感興趣的!我們都知道,興趣是好老師,所以培養興趣很重要。而如果你不確定自己對哪個語言更感興趣,那么可以參考下面的方案:
如果你想做技術,走技術路線,那毫無疑問先學C語言百利而無一害。
如果還不確定以后的路想怎么走,那無所謂先學Python還是C,隨緣吧。
如果確定了不想走技術路線,那么請先從Python開始。
其實,從兩種語言入門,各有各的好處。
從C語言開始入門的話,它的語法結構比較嚴謹,把C語言學透徹了,再學其他的語言就簡單多了,可謂是一通全通。C語言是一種面向過程的語言,而Python是一種面向對象的解釋型計算機程序設計語言。先了解什么是面向過程,然后去了解什么是面向對象,這樣學習更有效率。
從Python入門,也有它的道理。Python入門程序比較簡單,在前期也比C語言容易學一些。學習C語言就比較枯燥,很難迅速見到成效,可能會摧毀你的學習積極性。先學習Python,雖然可能對底層實現方面了解比較模糊,但是這方面也可以等學完Python再補上。
當然,這個問題沒有標準答案。最終,還是要靠你自己實踐,才能知道什么最適合自己。