為什麼很多人都說 Python 簡單?
我一開始自學java,學了一段時間,寫了些貪吃蛇,科學計算器。後來學python,發現網上許多人在講python多麼簡單,可是我在寫爬蟲,使用一些庫時發現python是動態語言,這導致在我有時我不知道返回的值和輸入的參數是什麼類型,這導致我學習是遇到很多困難和麻煩,對比java,java一些都清晰可見,我明確的知道,我要給這函數什麼,我會得到什麼,所以我對python比Java簡單不是很能理解
因為他們根本沒有意識到「類型」這個問題。所以Python在解決那些數據類型單一的問題上很方便,對需要考慮數據類型的問題卻變得很複雜。
舉個例子:在很多非強類型(誤:此處應為動態類型)的語言里,a+b的結果根據a的類型和b的類型的不同排列組合會得到不同的結果。但因為a和b的類型並沒有明確定義,需要編譯器根據初始條件和環境對其進行解讀。在小project里這不是個問題,因為這段代碼的上下文環境簡單,(這人讓很多只用過Python的人甚至沒有意識到類型可能帶來的bug)。但到了很多人一起寫的大系統,寫這段代碼的人不得不考慮所有可能的情況下編譯器對這段代碼的理解,情況就變得很複雜,或者各種isinstanceof來確保這段代碼的結果複合設計預期。
這就好像很多人覺得Java比C++簡單,因為不用考慮內存管理,但用在需要考慮內存管理的問題上Java就變得比C++還麻煩。
我從C++轉到Java的時候覺得GC的不確定性讓人很沒有安全感。後來嘗試Python時覺得類型的不確定性讓人更加沒有安全感。。。
因為Python容易給人一種自己會了的錯覺
相對於
#include &
int main()
{
printf("苟利國家生死以");
return 0;
}
和
print "苟利國家生死以"
哪種簡單?
Python這個玩意的簡單在於入門快速,不需要花很大精力去理解一些底層的東西(比如C和彙編、OS的關係),也不需要去理解一些高級封裝的包/庫(比如Java的類/包,C++的標準庫)。一發入魂,延年益壽。
但是凡事有好處也有壞處,過於簡單的語言讓大家都處於剛入門後的狀態,因為Python的學習曲線是一條基本平行於X軸,略有傾斜的直線。大部分入門級的玩家差距都不大的,所以很容易產生一種「我是你爹」的感覺,認為這個語言很簡單。
學語言我覺得還是Python學一學,C學一學,C++學一學,scheme學一學,Java學一學,都入個門,體驗一下,然後你就發現了--------------還是他娘的Python簡單啊。(當然學別的語言是為了把握不同語言的特性,比如強弱類型、動態靜態,以及一丟丟軟體工程上的理念)
類型問題確實是Python的核心問題。
沒有對比就沒有傷害,Python入門確實簡單,可是僅僅是入門。
多被ML/DL相關的庫蹂躪幾遍,你就發現Python也沒想像中的簡單。
我覺得主要原因是設計初衷。當年python做出來是為了滿足科研教學之用,替代原有的ABC語言。由於儘可能屏蔽了底層細節,並且暴露cffi介面,速度不行就用c語言糊,快糙猛出活使之成為科學計算領域的首選之一。事實上有很多人也認為,python為數不多的陣地就是科研計算了。
動態類型一時爽,萬行以上火葬場。。。
如果你花在python上的時間跟java一樣多,那你就不會覺得python複雜了。
大部分程序員都很願意學習更簡單更強大的語言。
我認識的程序員很多,只會java的,絕大部分都不肯學c++,因為太煩了,讓他搞清楚何謂傳值,何謂傳引用都會頭大無比。但是會c++的學了java就非常的歡快,因為代碼寫起來容易多了,只不過稍微啰嗦一點。
然而所有程序員學python都非常迅速和愉快,因為確實簡單又強大。這是python最大的優點呢。
當你還在背八大排序的時候
python:arr.sort()當你還在琢磨怎麼建鏈表的時候
python:deque(arr)當你還在苦惱到底誰參照了誰的時候
python:a, c = b, a當你還在想怎麼算一個超長的數的運算的時候
python:想什麼呢直接上啊當你還在琢磨怎麼判斷一個字元串是不是數字的時候
python:float(str),出結果的就是數字當你還在琢磨怎麼判斷倆數組是不是一樣的時候
python:tuple(arr1) == tuple(arr2)當你還在琢磨怎麼給數組去重的時候
python:list(set(arr))哈希表的鍵可以無中生有:dict.setdefault("a", 0)
數組元素想刪誰刪誰:arr.remove("a")數組隨便拼接,字元串還能加減乘不會忘了寫分號稍微複雜點的事pip一下手到擒來簡直就像媽媽出差前給我脖子上掛了個大餅
(其實應該還有很多)(我不是學計算機的,求放過(′?_?`))(而且你們不覺得python打字最少嗎)
我只能說這個Python 程序簡單,可是用Python 寫一個產品很難,寫一個好的產品更難,寫一個賺錢的產品是難上加難!
以前學了SQL覺得這有什麼難,後來做了數據分析這一行才知道SQL的優化是多大的學問,如何節省計算成本,如何有效率的處理大量數據,如何設計一個複雜查詢都需要再三斟酌。不要以為自己會了一點就覺得它很簡單,你看到的可能只是冰山一角,同樣的會爬了一個百度百科頁面就說自己會了Python,這樣的想法也是很不成熟的。
更新: 看見好些人還在回答說python不能做類型檢查,我看是裝睡叫不醒…
以下原文:
可是我在寫爬蟲,使用一些庫時發現python是動態語言,這導致在我有時我不知道返回的值和輸入的參數是什麼類型
題主你這個話不成立啊。
以及雖然我給最高票點了贊,但是我並不是贊同他對Python的理解。我贊同的是他對很多用Python的人的理解。
顯然,在座的各位可能對Python了解還是太少了,多看看我的相關答案和文章可能會有點幫助(逃
我們還是來看一下Python如何做類型檢查。
https://github.com/thautwarm/flowlibs/blob/master/flowlibs/typepy.py
(不僅僅是處理類型,可以任意限制輸入、輸出的數據。
一些實例:
然後我們來回答問題,為什麼很多人都說Python簡單?
我就舉個例子來說咯。
初三的時候我就出於裝逼目的,找某個酷似歷史名人的大佬學了微積分,搞奧賽也用到了不少。
不就是求導微分積分咯,簡單。
然後...(這個地方應該用一個什麼樣的轉折才好呢?
其實微積分涉及到了很多東西,我當時半點都不知道,徒具形表。
就好比最基本的極限那一套,確界定理是怎麼證的,緻密性是什麼,極限是什麼(幾周前在某個大佬群里看到一堆人對極限這個概念胡說八道,couldn"t be 監介 more。
我經常在某個高數輔導群里聽人問某個極限怎麼求怎麼求,洛必塔法則怎麼用。口口聲聲說高數簡單,能不能少一點這種問題?就沒人出來說一下無窮大和無窮小的階估計?泰勒級數又被你吃了?
但我轉念一想是這樣的,微積分學了又有什麼用呢?有個好成績,然後以後在吹逼時說兩句「微積分多簡單,我當年滿分」,或者在寫matlab和R搬磚的時候把結論往上一套,現成的,舒服,又為離開實驗室回寢室打遊戲爭取了幾分鐘啊。
好像世人皆然,這一切都很簡單。所以Python也很簡單。
但Python到底簡不簡單呢。
從語言的角度來說。
- 一個為你提供了自由定製一切的可能性的語言環境,你可以就你的問題去做特定的編程,這樣你確實不用考慮很多東西。
- 基本語法簡單。
- 默認了很多符合常理的操作,比如字元串的+, *。
- 默認的數據結構少。
- 變數檢查是trait檢查,只要擁有相應的特性,就可以放在合適的地方,而不必在意類型。
是挺簡單呢,什麼都不限制你(除開GIL),這不就是廣大的、有一丁點C基礎的入門者想要的、好讀而且自己寫起來不容易犯錯的C語言么?
我想說一下我理解中的Python是什麼:
放一個代碼,其實可以悟一下。
https://github.com/thautwarm/Stardust/blob/master/Class.py
(修正了靈劍發現的mro順序不對,以及多繼承出現元類缺失的情況。但type類型沒統一為class,懶得改了,本來就是腦洞玩具。
(圖片也修改了
我應該能用這個證明我對Python是相當了解的。此所謂Python的自由。
簡單不?
要說跟 Java 比「簡單」,那能工程實用的編程語言就不好找了。
簡潔跟簡單是兩個詞兒。
當然,Java 你要不用 IDE 一樣要查文檔記住類有哪些方法,方法有哪些參數。
用認知思維去編程,python很簡單。
用邏輯思維去編程,python更簡單。非要用底層思維甚至可能是半吊子的底層思維去編程,python也會變味。
應該是剛拿駕駛證的新手司機,總覺得自己會開車了,想把車開快。
學習python的過程,會讓自己已經很熟練的感覺。
JS 不也一樣么?覺得自己會了。然後不斷的在兼容性 複雜的業務邏輯中 不斷懷疑自己。Python與其他語言相比,顯然有簡單的地方,別的且不論,單是大量的第三方庫就已經降低了很多常規開發的工作量。然而也不是什麼都簡單,軟體開發沒有銀彈。
說Python簡單的,要分辨兩種人。一種是開發經驗豐富,對Python解釋器的實現都了如指掌的人,對於他們來說沒有什麼語言特定的東西是繞不過去的,他的簡單和你的簡單完全不是一回事。另一種,就只是拿Python當shell用的,如果有人向你推薦Python的時候說「你看排序只需要調一下sort()」,那你要警惕這個人。很可能他給不了你什麼乾貨,他對於Python的使用可能只是替代了shell,僅此而已。
學習Python,要寫好文檔,要會看文檔,要有面向dict編程的覺悟,至於好不好學就完全是主觀判斷。題主覺得Python不好學也正常,世界上沒有全是優點的東西,也不存在適合所有人的東西,設計程序語言從GC和類型就開始分叉了
你之所以覺得python簡單,是因為你需要學的很少,而誤以為自己懂了很多。
就像學了初等數學就能應付大多數生活場景一樣,但只有學了高等數學你才能初窺數學體系是如何建立的。
編程語言底層都是只有有限規則的字典集,和硬體結合的邏輯也是一樣的。
所以,你所謂的學懂了python和別人說學懂了c++內涵其實是不一樣的。學用Python的是哪些人呢?
其實只有三類,第一類人比較少,他們對世界的需求敏感而精準,對程序設計套路諳熟於心,已經形成了理論思考為重點,這些人會覺得python簡單好用;第二種人不多,已經熟練掌握某一種或幾種程序設計的心理活動模式(mental model),這些人感覺python和他們熟練掌握的語言沒有太大的差別,會覺得python並沒有簡單;第三種人是最多的人,剛開始接觸編程,憑藉著自己的感受,也隨著大溜說python簡單,並能夠舉出幾個python的例子。
我舉個栗子:
def make(n):
return lambda x: x * n
第一種人,他們先是在現實中遇到了一個需求,需要計算不同小區房子的房價。當思維構造完之後,在Python中找到可以實現自己需求,找最簡單實現自己需求的方法。對他們來說簡單,在於除了思維之外的簡單。他們想要的就是這樣的感覺,而python給了他們。
第二種人,當他們開始學習到了這種方法,第一感覺很拗口,抝腦。因為代碼中把mental model隱藏起來了,用起來有些磕絆。這最關鍵的,他們喜歡的是用代碼去思考問題,也就是使用代碼的複雜度來降低思維的複雜度。
他們喜歡的下面這樣:
def make(unit_price):
def temp(size):
return size*unit_price
return temp
第三種人,他們不知道這裡面作用域(scope)的概念,也不了解自由變數(free variable)的存在有什麼意義,更不需要理解那麼饒舌的什麼閉包。從學習的記憶強度來說,Python顯然提供了更簡單的一種方法。
我真真正正想說就是這個,最有意思的點也恰恰在於此,即使是小白,依然可以方便的使用python來做事情。
所以綜上所述,很多人都說Python簡單。