為什麼很多人都說 Python 簡單?
小時候總覺得英語挺簡單的。
不就26個字母嘛,比漢語簡單多了。
你說的問題是真實存在的。目前知乎後端業務代碼仍然是首選 python,一方面是因為歷史遺留問題, 有大量遺留 python 代碼,一方面是因為目前公司對 python 的基礎設施比較完善。
我從這幾年寫 python 和 維護 python 項目的經驗總結下 python 在工程上的優點和缺點:
優點:
- 抽象層次高,不用管很多底層細節。
- 語法優雅,語法糖多,寫起來爽。
- 動態類型,天然支持泛型。
- 類庫多,輪子豐富。
缺點:
- 沒有類型聲明,閱讀起來有時候會吃力。所以良好的命名非常重要,只能通過注釋或者名稱推斷其類型和含義。(這就是題主說到的問題,python3 加上了類型註解一定程度上給出類型提示)
- IDE 工具支持不完善,重構起來稍微麻煩。
- 容易出錯,比如類型不對、參數錯誤、使用了未聲明屬性等開發工具並不會提示,很多時候只能運行時才報異常,上線了才跪。(當然也說明單測不完善)
其實目前就答主了解,很多大公司和小公司的 python 代碼倉庫其實寫得比較糙,維護起來是比較吃力的,這可能也是使用動態語言的通病(也導致很多人大型項目不會選擇 python)。筆者寫 python 寫多了反倒越來越謹慎了,因為充分意識到了 python 的缺點,盡量通過良好的編碼規範、code review、單元測試等保證自己盡量不捅婁子。但是以國內很多程序員和小團隊無文檔,無單測,無注釋,無code review ,不重構的尿性,大部分Python 項目會讓你維護得比較痛苦。
說Python簡單更像是一種營銷口號,與其說簡單,不如說它靈活、表達能力強。
它的靈活性來源於動態語言的特性,比如變數的定義無需指定數據類型,變數可以重新賦值為一種新的數據類型
str_a = "abc"
str_a = 1
個人認為Java更簡單,寫過Java的一開始很定不適應動態語言,因為Java這種靜態類型的語言很多問題都可以從語法上規避,而Python只有等真正運行的時候才知道錯誤。
在 Python 中,函數作為第一類對象可以想普通對象一樣做為參數傳遞、作為返回值返回,這讓Java程序員很難理解。
說到元類,可能很多Python程序員自己都難理解,元類雖好,但如果你不嘗試寫個框架之類的東西,你永遠都用不上元類,Java中沒有這樣複雜的概念。
雖然Python、Java都是面向對象語言,但Python並不強制你基於面向對象編程,簡單的項目完全可以用函數來代替,這也是膠水語言的優勢,寫個helloworld還要寫一大段代碼這是Python程序員接受不了的。
個人認為Python比Java簡單的地方還有垃圾回收和虛擬機這層面,Python的垃圾收集更像是一個黑盒子,開放給用戶折騰的東西比較少,不像Java調個JVM參數都能長篇大論一番。
動態語言在開發速度上佔盡了優勢,但付出的代價的運行速度,不過相比開發速度,這點執行速度上的差距不算什麼,畢竟如今的硬體已經讓性能上的差距越來越小(我說的是普通的應用開發)
之所以國內在大型項目上用Python的少,主要原因在於市場供求關係。學校、培訓機構很少教Python,企業考慮到市場因素,在選擇語言時也會選擇更容易招人的語言,如果你不是北上廣深一線城市,想找個做Python開發的還真的很難,同樣的道理,學了Python想在二三線地區找個Python的工作也不簡單。
那麼到底學Python還是學Java好,聰明的人都不會問這個問題,先接觸哪個學哪個,如果純粹為了更快速的找一份工作就學Java,用Python寫代碼的速度要快一點,樂趣更多一點。
因為Python的所有對象都是自省的, 提供了無限的運行時反射能力.
Python運行時約等於加強版GDB.
C/C++在寫程序的時候, 經常會出現等到crash的時候, 離案發地不知道多遠了, 然後茫茫多代碼用二分法找bug.
典型情況對比, 比如, Python調用了a.b(), 報錯, 說找不到方法, 這很糟糕. 但你總能知道a是什麼, 然後開始思考流程哪裡錯了.
C++則完全沒辦法偵測到這種錯誤, 等到a-&>b()出錯的時候, 可能a已經是個莫名其妙的指針了, 究竟哪一步導致a亂了呢?
我能想到的問題有,
- 手賤cast
- 內存越界改數據
- a被釋放了
這些錯誤分支全都要考慮.
我寫Python的時候, 認為TDD是個笑話... 現在, 我認為C++沒有test case 95%, 最好不要發布了.
再一個典型例子, C++由於有模板的存在, GDB/LLDB hack進去的時候, 很多call是打不了的. 比如std::cout就不行, 但printf可以. STL大量庫基本都不能隨心所欲在單步跟蹤debug的時候調用函數. 我現在經常打日誌和assert, 算是C++帶來的好習慣吧.
在C++11以後的時代, 我並沒有感受到C++在實現一件事情上會比Python費力很多, 但出了錯之後debug體驗是真的很糟糕=_=. 其實很多時候C++代碼的抽象程度是高於Python的, 同時又保持類型安全.
總的來說, Python的優越性更多是來自動態語言自身的, 對比別的動態語言, 只能說靠同行襯托. 我在工作的時候, 70%的時間在寫JS, 剩餘的時間用Java和OC到處加按鈕, 依然對JS愛不起來. 對於一個合格的程序員, 其實沒什麼工業語言很複雜(簡單). 換個語言就是把磚重新搬了一遍, 願意不願意花時間的事情. 比如, Tampermonkey版Vimium, 這份代碼就是我前端生涯的巔峰之作, 完全用(現在看起來很辣雞的)ES5標準寫的.
看了前面很多大神的回答,我覺得我可能學了個假Python,或者說我還沒有學到這麼高深的地方去。
我就提一點不成熟的小想法。
說Python簡單是因為Python是一門更接近自然語言的語言,或者說邏輯上更接近人的邏輯而不是機器的邏輯,這導致它雖然犧牲了一部分機器的效率但是卻提高了人的編譯效率。
第二是寫Python代碼給我的感受就是十分的簡潔,簡潔到以前C裡面要十幾行代碼完成的事情,到Python裡面可能只需要幾行。
第三是Python有十分多的內置函數,內置函數的一個好處就是很多內容你都不需要自己去定義,直接調用函數就好了。比如我自己在寫一個小的聊天機器人的時候就比較爽(聊天智障更合適)。
第四是Python有很多的小細節比其他的語言要更優雅,比如外掛else事件,很多的初學者在首次學習語言的時候比較容易出現外掛else事件,比如在C裡面else邏輯上是合最近的if相匹配,這樣子就導致很多新手想要else與更前面if相匹配的時候就出現了bug,在Python裡面就不會這樣子,else和哪個if對齊也就會和哪個if匹配。
第五是寫個遊戲教為容易,最開始我在學Python的時候,學到第三天我自己就寫了個遊戲,後來我又寫了個打飛機的遊戲,雖然都挺簡單的,但是我要是學C或者C++的話就要痛苦不少,C++是一門想要把底層和表層統一的語言,自然也確實要難不少。
第六你如果學會了Python,其餘的語言也就相對簡單,因為什麼語言並不重要,重要的是你寫出他們的邏輯,如果你用Python寫出來的東西,用其他語言做不到,這就說明牛逼的是Python這門語言,而不是你。
六個來自Python程序員的不成熟的小想法。
以上。
.當你需要寫設計模式的時候就哭了出來。
當你需要 Proxy 動態代理類的時候就哭了出來。
當你發現用 Pandas 畫圖也是個坑的時候就哭了出來。
基本語法簡單,庫還多,而且很多庫只要掌握1%就能來知乎寫文章了,而且也沒有++--的彎彎繞,但是feature 多,理解起來也不容易,精通還是不容易的。
依賴類型檢查是軟弱的表現。你要知道參數和返回值是什麼樣的,翻一下文檔(docstring,help())、掃一眼源碼或者運行下試一下都行。類型檢查從來不能幫助你不傳錯參數。
你用C++,遇到複雜的模板類和模板函數,你也很難一下子明白它接受的參數類型和返回值類型啊,用錯了還會報一堆看不懂的錯誤信息。Python就等於每個參數都是模板化的參數,這種情況下就不要指望類型推導,老老實實去看文檔就好,輸入輸出是否清晰完全取決於介面設計和文檔,跟類型系統是沒有關係的,你知道類型也不代表你能傳對參數。
傳參的正確性、返回值的正確性應該是靠程序員清晰的頭腦來保證的,而不是類型系統。當然如果你承認自己的軟弱,也可以試試這個庫:
hubo1016/pychecktype
from pychecktype.checked import checked
@checked
def f(a: str, b: int)-&>str:
"""
check `a` is str, `b` is int, and returns str
"""
return a + str(b)
靜態檢查的話,可以看下系統庫的typing和mypy之類的檢查工具。但最好還是不要變得軟弱。
哇,大佬說的話你也敢信啊?
信了你就輸了
最主要知乎規矩,先問是不是,再問為什麼
你可以問問各位靠Python吃飯的大佬們,覺得 Python 簡單么?
哇,不信?
來來來,新增的 annotation 怎麼做 type-check 會了么?
天天寫 Python web,PEP 333 刷了么
沒事就聽人說協程什麼的,492,342,380 刷了么?
為啥官方推薦字元串拼接 join 而不 + 啊,性能差距體現在哪啊?
GIL 相關知識點看了么?
哇,年輕人,我給你講啊,大佬說的話聽聽就好的。你千萬不要聽著他們的風就是雨,不要總是想搞個大新聞,懂不懂啊?
哇,最後,給你一個友情建議,當你不知道類型怎麼處理的時候,沒事就 isinstance + assert 就好啦,暴力出奇蹟嘛
對於一個從數學系轉行到機器學習領域的人而言,如果只是為了入門機器學習,然後從事相關工作的話,其實Python對於初學者而言是一個容易上手的語言。首先,有各種各樣的機器學習演算法庫,例如scikit-learn等;其次,在使用一些工具包的時候,如果只是為了完成任務,就只需要了解輸入輸出即可,不再需要了解內部的實現原理;再次,語言容易上手,可以把各種各樣的工具包根據自己的實際需求結合在一起。現在很多機器學習的工具,都提供Python的介面,使用Python就可以很自然的把各種工具綜合在一起使用了~
不過,以上說法也就是對入門而言,無論是任何語言和技能,要想精通總是十分困難的。
之前學習數學分析的時候,每一次學習都覺得自己已經掌握了,已經能夠獨立解決很多課後習題了。但是每次一旦回顧這門課的時候,總覺得之前自己其實沒有懂。要想徹底弄懂一個東西,真的是需要花足夠的時間和精力的。
我是用c++打的基礎,寫過一段時間Python,這段時間剛轉Java。
學習成本上來說,c++學的時間最長,因為打基礎,從人類語言過渡到編程語言,變數、函數、類、繼承、多態……都有一個理解的過程,大概就是一學期的時間。剛工作那會兒沒聽過Python,公司要求,就簡單的看一下w3c菜鳥教程就開始複製、粘貼的學著做Python項目了。來這家公司之前也是一行Java代碼沒寫過,直接懟過來Java項目讓我做,昨天剛好入職100天,想想這三個月真是煎熬。從這個角度說,Python確實比較簡單容易上手。
最近剛交接完一個項目,這個項目有兩期,一期用Python寫的,二期用Java寫的,要把Python改成Java版本。實現的功能差不多,所以可以比較。從代碼的簡潔程度來看,我覺得一期的Python更簡潔,當然這也可能跟第二期Java藉助了很多框架有關係。總覺得Java看起來很龐大,可能跟它的命名規範有關係吧,哈哈哈~
我覺得接受新鮮事物,不要先入為主,一開始就站在排斥挑剔的角度,求同存異,博取眾長才好。學習一門語言一門樂器或者說任何事都是一個動態的過程,剛開始興趣盎然,之後會遇到枯燥期、倦怠期……但是過了這一階段才會真正進入到一個融會貫通跟隨一輩子的境界。大部分人可能止步於第二個階段了。不過也沒什麼。一直很喜歡《心靈捕手》中的一句話
「People call these things "imperfections",but they"re not. That"s the good stuff.And then we get to choose who we let into our weird little worlds.」
一直不排斥任何語言,也很少見程序員被語言所限制的,語言特性當初在設計的時候都有適合的應用場景,所以,怎麼用好,才是重要的。
我覺得大家都沒get到點啊,其實嘛,你只是缺少一個好用的工具。。。
那第三方庫呢,當然也是有的:
關於python是不是真的很簡單的問題,作為一個搞過.net,java,php現在寫python、nodejs的人來說,語言這東西寫helloworld當然是簡單的,但也僅限於此了...難的真的不是語言,而是怎麼實現你想要做的東西。當然了,python各種庫是多也相對好用一點(甚至某些場景下實現相同的功能python的工作量為1,但java可能就是5甚至10了),但其它的語言平台也並不是說就完全要你造輪子,python能做的事情其它語言也一樣能做。
動態語言的特定就是動態類型。好處是,寫起來超快;缺點是,多起來、合作起來就會亂。
此外,雖然比較弱,但PEP 484 -- Type Hints 好歹提供了一個「類型提示」的地兒,雖然這主要是為第三方工具或庫提供元數據用的,但至少可以在組織的代碼規範層面加以規範。比如:
def say_hello(name: str) -&> str:
return f"Hello, { name }."
「類型提示」這一點上,無疑PHP走在了前面,感興趣可參考我的這篇知乎專欄文章:《PHP 7 類型提示》。
說python簡單,可能是因為用起來簡單吧,不像c java那些需要編譯,也不需要配一大堆環境,只需要一個python命令就能運行。但事實上,沒有任何一門語言是簡單的。如果僅僅因為入門快,上手容易,就說簡單,呵呵
請看看
為何很多人認為Python 很簡單,而你不能入門?
感覺是理解、會了,其實挺深的!
因為python是面相第三方庫的api編程…
python是簡便不是簡單。
很多人都沒有理解簡單和簡便的區別。
java是簡單,Python是簡便。
說python簡單的,知道python的繼承關係么?JAVA是單繼承就很簡單。
說Python簡單的,知道python的元類么?JAVA都是老老實實寫JAVA bean(當然,JAVA也有註解,但會用註解的人應該不會說python簡單了)
說python簡單的,會用協程么?JAVA就是老老實實的多線程,簡單啊。
說python簡單的,python只是給了你一種簡單的錯覺。Python不是簡單,也不是門檻低,Python這門程序語言誕生的目標是為了降低程序員的負擔,類似於某演算法描述語言,它將很多底層的東西封裝在cpython解釋器中,使用戶(程序員)不必擔心類型和對象管理的問題
但這並不是說這門語言就簡單了,或者說,想入門很容易,想精通?先去把cpython實現源碼看一遍再說吧以Python作為入門語言有很大的問題,容易使人養成不嚴謹的思維,或者說,Python入門的人大多數很多時候都在「想當然」的寫程序從來不從底層思考問題,str+str1+str2+……照樣隨處可見反而怪罪Python慢我在用Python寫程序的時候從不考慮性能問題,或者說我從不去刻意優化代碼。為咩?因為我寫程序的時候下意識的思考怎麼樣的操作更高效,不是想當然的去寫,更不是寫i =="in" or "IN"這類蠢代碼
培訓班帶壞風氣啊,哎!入門確實簡單…… 我小學的侄子自己買了本書,自己在寫atm 取款機,自造億萬富翁
弱類型語言的語法和數據類型讓人痛心。尤其是項目大了以後,我寫JAVA大部分時間是處理編程邏輯與演算法改正,但是寫Python經常會被各種數據類型轉換以及非正常邏輯的異常吊打。。。。
10個人一起開始學cpp,中途8個人放棄了,剩下兩個人,一個人到精通水平,10個人一起學Python,中途一個人放棄了,剩下9個人,最後還是只有一個人到了精通水平。這就這麼個意思,Python的學習曲線是倒L型,極低的門檻,也帶了極高上升難度.
大概是那些人把py當作當年的PHP來用吧。
首先,我非常喜歡python的強制縮進,其次,代碼簡潔明了,寫什麼就是在寫什麼,但是,面向對象之後python就掛了。
好上手而已,妹子好說話不代表好娶。
對於很多新人來說,學C/C++的麻煩在於(能想到的按由淺入深來)
1、指針
2、鏈表
3、各種類型轉換
4、各種各樣的內存管理該注意的地方
然後Python把上面的這四項都給迴避了(噗),就給你一種好像會了的感覺
我記得當時也有大佬說ruby簡單,後來我才發現巨他媽難好嗎?我覺得所謂的簡單,是無語法上沒有那麼複雜可以使用各種類庫。但是語法不複雜,直接就造成了,我們這種學c++出身的不適。我在初學的時候當時就是在想,這是什麼狗p寫法啊,我以後都要這麼寫嗎,我怎麼可能寫的出啊,我一定不會這樣寫的好嗎!後面又去學習了python嗯⊙?⊙!遇到了同樣的問題
推薦閱讀:
※在自學的過程中,如果你遇到自己不明白的問題是怎麼解決的?
※學攝影去哪裡學 不是大學 ?
※自學AE分幾步走?
※自學英語,覺得沒什麼頭緒,沒有任何英語基礎。求方法!?
※在大學數學專業,如何組織一個數學討論班?有哪些書籍或者課題適合用來作為討論班的主題?