有什麼是 Python 可以做,但是 PHP 不可以做的?
本來是想要來吐槽的,不過至少先回答問題:為了儘可能避免某些強搭的所謂『php也做得到』,我這裡盡量選取沒爭議的一些php目前沒啥應用而Py框架和包一大堆的東西。
1. GUI應用,包括桌面以及移動端App(後者Py群體中很小眾)
2. 2D/3D的展示和遊戲
3. 科學計算、統計、計算金融
4. 機器學習
5. 並行計算、顯卡計算(調動Cuda/OpenCL)
其實也不是嚴格的不能,大不了多寫點代碼嘛……只不過這些方面的東西對Py而言工具性的東西都很齊全了。
然後來說笑話:
———————————————————
目前高票那個所謂的『打臉』……很暴露自己的水平啊……
說Php有多線程版,挺好啊,但也不是所有Python實現都是有GIL的,至少pypy STM版本就沒了GIL哦~
至於編碼問題,很遺憾看到一個受過正統教育,還是學信號的學生居然不明白編碼是怎麼回事並卡在Py2的編碼里……這真的真的很丟人。Php的對多國語言和編碼的處理方式類似於C,也就是所謂的『我完全不鳥你是啥編碼』的形式,字元串就是裸位元組流,『編碼』則是幾個函數行為,這樣的設計在Python 2.0及之前的時代都是這麼做的,而2.1引入unicode class的作用和意義別扯不明白了好么……至於coding標記這個東西,難道沒看過任何2.4以後的官方文檔的前三章?要不試試看好一點的諸如PyCharm這樣的IDE,在你的源碼里出現了硬編碼的非ascii字元時無論py2還是py3都會友好提示你加入個編碼標記哦~
然後吐槽os『不兼容』高版本python的,真不知道作為個解釋器,完全可以存在多個版本么?CentOS 6.4上我都能給你跑起cpython 2.6(自帶)與cpython2.7 3.5以及pypy共存,更何況還有conda和virtualenv……
至於requests的問題,首先有grequests這樣的greenlet+requests的綁定,然後還有諸如tornado和aiohttp這樣的整套網路庫。我實在看不明白一個爬蟲代碼並發100到底是在誇php還是貶低php,但100並發的網路爬蟲,這算啥並發壓力?在有GIL的情況下拿多線程都行啊……別太小看CPU性能了,哪怕是單核心。你要並發咋不上協程?tornado能讓你單線程上2k+並發,還自帶一句話多進程配合直接上10kqps呢……
至於scrapy,如果說scrapy能調度phantomjs和webdrive來解析頁面的情況下還覺得scrapy『解析頁面不方便』那也是沒啥好說了。scrapy是個框架,你要說他太重不適合日常單機爬我也認了,畢竟人家的存在是為了分散式,而你大可以用mq來自己搭分布,說人家解析能力差……這是菜不好吃賴筷子咯?黑錯方向了啊騷年……
黑一個東西前先去了解一個東西才是正解,不然黑都黑不到點上,嚷嚷著打臉有何用?又不是誰語氣沖就誰打臉了……Python 能寫出沒有美元符號的代碼。
PHP 不能。
很多人從語言層面上討論python和php。我能力有限,只能從資源生態上討論一下。
參考一下兩個awesome。
ziadoz/awesome-php
vinta/awesome-python
我們不難發現php主要還是為了web開發而生。而python涉及了很多領域,除了web之外,還有很多:
- 大數據處理
- 數據可視化
- 機器學習
- 嵌入式開發
- 各大軟體的api
- 桌面應用
得益於CPython和C之間的關係,很多軟體都出了python的api介面。至於效率方面,用python做數據處理肯定離不開numpy,pandas。當然,想快速做個webapp用php也是無可厚非,畢竟它是最好的語言。
Python 筆記一:簡單入門及點評
如果非要爭個你死我活,那麼python能讓你學會使用遊標卡尺
我覺得英文比漢語好 漢語字咋那麼多 太煩太噁心了 英文就簡單多了 就26個字母 英文能表達的意思漢語都能表達嗎? 啥?能表達? 我不管反正你用漢語就是low ! 這年頭都不會英語真的是low爆了! (手動滑稽斜眼笑。。。)
問題太主觀了
請題主精確定義下什麼叫「不可以做的」
c/c++都可以做web開發,bash也能寫出科學計算,甚至node.js也能擴展到嵌入式開發里
只有相對的、定性的「不適合做的」,沒有「不可以做的」
看到那個叫『靈劍』的python程序員一派胡言,不光是在答案里,評論里也是拿著自己過期的初級PHP資歷在那信口開河,也出來給它來幾巴掌。
首先,下面已經有人提到了,親,你聽說過『圖靈完備』嗎?沒聽說過的話可以先去維基百科(https://zh.wikipedia.org/wiki/%E5%9C%96%E9%9D%88%E5%AE%8C%E5%82%99%E6%80%A7)補習一下。php和python都是圖靈完備的語言,所以沒有什麼是其中一者能做而另外一個不能做的。
問題回答完畢,下面是說好的打臉時間,也就是來看看『靈劍』所說的所謂的python能做而php所不能做的到底是怎麼一回事(為避免重複,『溝槽』已經反駁過的部分我就不在重複了,部分奇葩言論是從『靈劍』他的評論里摘出來的):
1. 『我原來寫PHP的時候主要用的是curl,這是個C的庫。不是說它不好,但是你用這個庫的話,有一些重要的功能是不行的,比如說我要讀取一個URL,然後將返回值作為一個流來處理,讀一部分處理一部分』:請閱讀手冊 PHP: curl_setopt 中的 CURLOPT_FILE,『value should be a stream resource (using
fopen(), for example) for the following values of the
option parameter』 明確說明了是支持流的。
另外據說你還去看了一大堆第三方的庫?不知道guzzle(GitHub - guzzle/guzzle: Guzzle, an extensible PHP HTTP client )這個7000+ star的庫不知道你是否看過呢?
2. 『最好這個返回的流還可以像文件一樣統一處理,直接用outputStream之類的方法就可以把這個流寫到其他語言基本都支持這樣的功能,但PHP不行』 同上,上面已經說了,你都fopen了,當然可以像文件一樣統一處理
3. 『其他比如說自動復用HTTP/1.1的連接,也是做不到的』廢話,你這說的是web server的事情。找apache/nginx去。當然你非要拿php做web server也不是沒有,swoole是一個,但你覺得這是c寫的擴展不算。那你可以去看看workerman(什麼?這也用了c的庫所以不算?拜託,系統自帶的庫你都不讓用這也太過分了點吧)。
4. 『運維剛抱怨的來著,別的語言Web服務的前置nginx配置都是統一的,只有PHP,寫了一大堆rewrite。就因為PHP不支持按URL匹配規則綁定handler』:你業務糟糕一大堆rewrite怪誰?主流的框架現在基本上都是單入口設計全部rewrite到index.php然後再自己內部分發處理的
5. 『你們老是覺得PHP這個也可以那個也可以,我認為這完全是因為你們要實現的業務太簡單了,沒見過真正精美的設計。』:同理,你能力太差見識太少,php也是可以去實現你所謂的那些精美的設計的。
6. 『只有你們家PHP是精美設計不好使的,因為語法太死,所以你們只會寫麵條代碼,去讀讀其他語言比如Python比如Java(Java也比你們強多了),看看他們怎麼運用OOP來抽象業務邏輯,怎麼運用設計模式,怎麼用模塊化的方式管理業務功能,怎麼提供插件式的擴展,這些你們家PHP一個都做不到。』:PHP: Introduction php5(10多年前了)開始就提供了OOP,至於抽象業務邏輯、運用設計模式、模塊化插件化這些不都是程序的事情嗎?你能力差怪語言咯?
7. 『我在SAE(新浪雲服務)上寫了起碼三年的PHP,我當年的應用高峰期把SAE跑崩過(就是用fsockopen跑崩的),PHP最噁心的那些問題我全都遇到過。』講道理那是SAE垃圾怪php?我也跑崩過不止多少次,SAE背地裡改了那麼多東西能怪PHP?當時向老大推薦了SAE和新浪雲商店(好像叫這名字,就是沒有寫限制的SAE),結果部署上去各種坑啊
8. 『只有你家PHP要區分,第三方擴展只能複製進網站目錄里,沒有包管理功能,還要小心命名空間衝突,爽不?C擴展裝起來費老勁還要改配置文件,爽不?』:php的包管理請參考 Composer 命名空間衝突也順便解決了。至於C擴展請參考 pecl
9. 『但你們真的想要一個每次用一個類就搜索一遍本地目錄的語言嗎』:請閱讀 psr-0, psr-4 以及 composer的 autoload
10 『自動載入機制是靠在本地目錄里查找名稱與類名稱匹配的文件然後載入沒錯吧』:你也可以不按規範來,自己實現PHP: spl_autoload 然後你覺得怎麼爽就怎麼來吧。
11. 『命名空間衝突』:PHP: Using namespaces: Aliasing/Importing
12. 『Java的Web一大支撐就是spring,因為有spring所以能搭建起大規模的、插件式的、可以運用設計模式的Web,PHP不行,這已經是死刑了,說明PHP永遠開發不了Java這個規模的Web應用。』:我猜測一下你想說的是IOC吧?這個很多框架也都實現了啊,例如 Service Container ,
順便說一句,不知道facebook在你眼裡,規模是有多小?
槽點太多就不多說了,有些最基礎的東西我想說明一下:
首先php就是用C寫的,這有什麼問題嗎?按照你的邏輯只有能完成自舉的才能叫語言?
至於每次都要載入一遍,這是與apache/nginx協同工作的方式決定的。把你的問題翻譯的稍微專業一些,php能否自己實現web server?答案是肯定的。首先php -S 自帶了一個,另外可以參考項目swoole(c實現)、workerman(php實現) 等
最後,不了解php還要裝精通來強黑,真是辛苦你了。這麼多人打臉,疼嗎?
謝邀,PHP不熟,印象中,PHP核心在WEB開發上,其他方面的應用較為少聽說。
以下都是猜測的,歡迎指正:
1、本地gui程序,C/S架構的東西沒聽說哪家用php做的。
2、app自動化,不知道web自動化PHP能不能做。
3、據說CPU密集型的應用,用PHP的體驗都不好。
4、嵌入式開發似乎也沒聽說哪家用PHP的。
避免吵架:PHP是最好的語言!
每個存在的、有市場的語言,都有它的優點和劣勢,我們只需要在合適的項目用合適的語言就好了。
以上。謝邀!兩種語言所面對的領域不一樣,如果強行橫向對比,必然會引起無意義的爭執。
在PHP這種語言誕生之前,在WEB這一塊就已經是一片紅海了,如果按照上面的python大神所言,PHP根本就沒有出現的必要。然而PHP出現了,而且在不斷成長,現已經佔領了大部分的web開發市場。
任何事物的出現都有其必然性,以後的互聯網技術領域也將會越來越傾向於快速實現。相信如果不是Dz!的出現,前些年BBS也不會在國內發展這麼迅猛。可見PHP對於互聯網在國內以至於全世界的發展有著巨大貢獻。
很多人都在說扎克伯格後悔用PHP,但如果他當時選擇的不是PHP,可能就不會有FB的稱霸了。比爾蓋茨當年在推出視窗操作系統的時候其實並不完美,他為了早一步培養用戶習慣,寧可將自認為並不完美的軟體推入市場。如果他想去追求完美了再推出,可能那個時候即便完美了,也不會有那麼多人去使用了。
正式這種轉瞬即逝的商機才造就了PHP的輝煌。先推出可用的應用,再去花時間完善。哪怕是用C也會得到大量支持,因為市場已經應徵了應用的可行性。
所以PHP和PY是不能橫向對比的,至於有什麼是PY能做PHP不可以做的,我的答案是已經有充裕時間、充裕可行性的項目是不適合PHP的,比如量身打造的定製ERP。
忍不住了,那個靈劍的python碼農,之前也在黑php的問題下看你瞎回答。黑php沒問題我也常常黑,可是你的關於php回答簡直不懂裝懂還瞎說,這裡把你的回答一句一句。
1、」多線程支持特別差只是其中之一。」這麼說吧,php、ruby、python等這些比較主流的腳本語言裡面論多線程支持,php是做得最好的。py和ruby支持多線程偷工減料加全局鎖弄了個假的多線程,php本身改造了語言核心分了線程安全和非線程安全版本,php的多線程是真的多線程。其實腳本語言作為高級語言多線程並不魯棒所以我基本不用多線程特性,要用多線程任務我還是傾向於用java/c++靜態類型語言。
2、「比如說不區分位元組流、多位元組字元串、unicode字元串,需要在PHP文件裡面同時寫unicode、utf-8、gbk字元串的時候必須全部用16進位轉義,這是一種怎樣的令人崩潰的體驗」。用python沒被編碼災難的噁心過的有幾個?我用php基本沒有為編碼問題操心過。你說為毛不用py3?是啊,py3傻逼的不兼容py2給第三方庫社區帶來了多大的麻煩,ubuntu16.04才敢升py3的吧,對不起大部分的生產環境centos6還py2.7呢。
3、「比如說多返回值,Python可以返回元組然後用簡單的語法(a,b = my_func())將元組內容還原到不同變數,PHP只能返回數組,然後寫好幾行很醜的代碼。」php不只能返回數組,還能返回對象等等,不過我相信你的意思是php沒有py那樣的語法糖。語法糖這東西我不是很care,也是用的時候才去查,你說的這個特性php里似乎有:$my_array = array("Dog","Cat","Horse");list($a, $b, $c) = $my_array;不過這根本不重要。
4、「PHP能續命到今天主要因為第一能調C的模塊,所以依靠C程序員一步一步續上來,swoole也是這樣;」php把cpu密集型函數寫成c模塊就是為了性能啊,這有啥可黑的?php7最棒的特性也是在盡量兼容的前提下提升性能:https://pages.zend.com/rs/zendtechnologies/images/PHP7-Performance%20Infographic.pdf。就我的判斷而言,php語言和社區發展很好。
5、「第二因為PHP程序員普遍素質比較低,寫代碼的需求範圍很狹窄,所以從來沒碰到過這個語言的硬邊界。基本上去寫一兩次Python,你就不會再想重新用回PHP了。」你這樣地圖炮是不對的,每個語言都有每個語言的使用場景,我原來寫py挺多的,但是web相關的我覺得php更好用。
6、「等什麼時候有人用純PHP寫出了OpenStack這樣的雲計算管理平台,Flask這樣的小巧精緻的Web框架,Scrapy這樣的簡單好用的爬蟲框架,甚至哪怕是requests這樣的HTTP客戶端而不是到今天都還在拖著libcurl湊合著用,我們再來談PHP不能做到什麼。」OpenStack沒用過不便評價,Flask這邊組裡一直在用在遇到性能問題後重構轉java了,Scapy和requests你張口就來我今天就用這個2打你臉。Scrapy作為一個爬蟲框架基本上寫幾個配置文件就可以跑了,但是爬蟲的本質是開一個httpclient取回html+dom操作抽取數據,Scrapy封裝的很厲害適合初學者改幾個參數就跑起來了,但是擴展特別差。這邊搞爬蟲的py碼農在要完成需要特別定製的爬蟲都是直接開requests回來beautifulsoup抽數據的。requests這個httpclient是挺好用的,php的httpclient也並不只有libcurl,比較大的庫的話guzzle也很好用,而且有很棒的非同步支持。我用guzzle可以使用libevent的事件庫單進程只開一個guzzle的httpclient並發同時非同步爬100個網站,而requests並沒有非同步支持。
我說這麼多就是想,以上
-------------------------------------------------
看了Coldwings的針對我的比較有水平的回答,我興緻頓時來了,這裡回應如下:
1、關於編碼問題我相信已經討論的足夠清楚了,我覺得你說的也有道理,感性的東西這裡就不回應了。
2、py下的非同步並發方案我之前調研過很久的,grequests(GitHub - kennethreitz/grequests: Requests + Gevent = &<3)是對gevent的很薄的包裝,star很多但代碼150行不到,實際上不怎麼好用。
3、協程本質上是把非同步用同步的方式來寫,所以協程並不是說在並發上比非同步強。
4、並不是只有Scrapy能調度phantomjs(你可以把phantomjs集成到任何爬蟲裡面),實際上我有在php下並發驅動phantomjs的一些經驗(單機i7並發驅動80個phantomjs實例,包括並發下緩存、代理、資源泄漏和headless開發困難等各種坑的對應處理),我相信用py來驅動phantomjs也差不多,看你用啥順手。
5、爬蟲這塊你所謂的分散式是指多機並發爬取的話,我用redis比較多,當然了我機器不多。我自己用php寫了基於redis的多節點並發爬蟲方案,有個爬蟲2台PC並發最多150個phantomjs+150個guzzle的httpclient吧。多爬蟲協作和任務分發啥的,比起專門的消息隊列我比較推薦redis,因為redis的單機10w的qps在滿足爬蟲並發的同時,還有非常好用的5種數據結構,對爬蟲的調度、狀態查看、參數動態設置都有很大幫助。
6、我爬蟲並發100是http並發不是tcp並發,我用php在單進程單httpclient下在低cpu低內存下非同步並發跑滿了小水管。線程池方案和非同步並發方案優劣我認為已經討論的足夠清楚了(另外我真的覺得我的基於guzzle的單httpclient非同步多並發的爬蟲方案很不錯的誒,我對這個很自滿的。如果你感興趣的話可以看看我的兩篇博客討論的這個問題:談談爬蟲的並發問題和redis使用心得+高並發httpclient的理解)。
7、python的並發http方案我也之前也調查過(What is the fastest way to send 100,000 HTTP requests in Python?),裡面也有你提到的grequests和tornado的那個非同步httpclient。tornado的那個非同步的httpclient恰恰是基於libcurl的(tornado.httpclient)而且沒有並發支持的,而php的guzzle默認是libcurl但是你可以選擇別的事件庫比如libevent的,guzzle可是支持非同步並發的哦(在py和java下我找了一段時間都沒找到這樣的httpclient的)。
&
深度學習框架。。
那些吐槽PHP使用美元符號修飾變數和使用-&>訪問成員的人可以洗洗睡了(孤陋寡聞還自以為是).
C語言中結構體指針訪問結構體變數時,使用箭頭(-&>),C++中指針對象也是用-&>訪問成員,所以使用-&>並非PHP首創.另外,用美元符號修飾變數也不是PHP首創,Perl和Shell都這樣干.
PHP能"愉快地"跑在Android上,Python不能.
https://pic1.zhimg.com/v2-6d318924a450b4d28313848eb09f9fbc_b.png
愉快指的是PHP內置模板引擎,內置SQLite資料庫,內置HTTP伺服器.
無需其他,一條命令就能建立一個支持PHP編程和SQLite存儲的HTTP伺服器:
php -S 127.0.0.2:8181 -t /www
對比Python的CGI服務,寫起來不愉快:
python2 -m SimpleHTTPServer 8000
python2 -m CGIHTTPServer 8000
python3 -m http.server
python3 -m http.server --cgi 8000
附:
phpdroid_20170117.apk 我打包的APK包(5MB)
https://pan.baidu.com/s/1mia21HA
phpdroid_20170117.7z 項目源代碼(Android Studio)
https://pan.baidu.com/s/1miuLk96
用musl-cross-compilers交叉編譯Android版PHP(無腦下一步)
cross_compile_php.txt
https://pan.baidu.com/s/1dEEnBtJ
crossx86-arm-linux-musleabi-1.1.12.tar.xz
https://pan.baidu.com/s/1micZBWc
有的不是不能做,是做起來特別噁心,就算用上swoole之類的也一樣。多線程支持特別差只是其中之一。比如說不區分位元組流、多位元組字元串、unicode字元串,需要在PHP文件裡面同時寫unicode、utf-8、gbk字元串的時候必須全部用16進位轉義,這是一種怎樣的令人崩潰的體驗……
比如說多返回值,Python可以返回元組然後用簡單的語法(a,b = my_func())將元組內容還原到不同變數,PHP只能返回數組,然後寫好幾行很醜的代碼。
PHP能續命到今天主要因為第一能調C的模塊,所以依靠C程序員一步一步續上來,swoole也是這樣;第二因為PHP程序員普遍素質比較低,寫代碼的需求範圍很狹窄,所以從來沒碰到過這個語言的硬邊界。基本上去寫一兩次Python,你就不會再想重新用回PHP了。
PHP的庫基本上都是C寫,Python的庫大部分都是純Python寫,這足夠說明兩個語言的差距了:同時會PHP和C的寧可寫C,同時會Python和C的則願意寫Python。等什麼時候有人用純PHP寫出了OpenStack這樣的雲計算管理平台,Flask這樣的小巧精緻的Web框架,Scrapy這樣的簡單好用的爬蟲框架,甚至哪怕是requests這樣的HTTP客戶端而不是到今天都還在拖著libcurl湊合著用,我們再來談PHP不能做到什麼。
=================================================================
我承認我PHP用的沒你們多,但是我覺得很多東西一眼就發現了的東西,我不會去研究一年然後寫個報告。如果你也是寫過C++、C#、Java、Javascript、Python的實際代碼之後再去看PHP,你也一眼能發現問題,而不是滿足於這個也有那個也有。一看就是沒學過編譯原理,還在糾結編程語言的高下。
開源就是 You can you up, no can no BB.有打嘴炮的功夫,多給你支持的語言生態添磚加瓦。php就是專精web後端開發的,gui之類的python做更好,php理論上也能寫gui,但是真要這麼用,完全是自取其辱。
至於說php不好,每次我只要拿facebook打臉就行了。至於php這麼多黑點,只能說,這屆開發真不行。
py交易
想來想去,只有這個了:
&>&>&> "中文" + u"abc"
Traceback (most recent call last):
File "&
UnicodeDecodeError: "ascii" codec can"t decode byte 0xe4 in position 0: ordinal not in range(128)
Python可以被說有缺陷而不招人罵。
PHP不可以。
謝邀,在web上據我現在所知是沒有,樓上所說的多線程php可以使用swoole完成,也並不是不能做到。
php在設計上最好的一個地方就是擴展這個機制,就算以後py在web上出了其他新的特性功能,會C語言的php大神也能用C出一個擴展給php用。
總之每個語言存在都有它存在的意義,不要相對比,如果你有這相對比的時間,還不如多寫幾段代碼。
推薦閱讀:
※PHP socket通信問題, 如何按照自定義的協議進行通信?
※php 如何取img屬性值 src?
※wordpress 代碼質量怎麼樣?
※新手適合學什麼計算機語言?
※大型的 PHP應用 ,通常使用什麼應用做 消息隊列 的?