Python是一門(mén)啰嗦渊涝、雜而不精慎璧、沒(méi)有個(gè)性的平庸語(yǔ)言。
所謂平庸的語(yǔ)言跨释,即平庸的人喜歡的語(yǔ)言胸私。
當(dāng)然你一定不相信這句話,如果我們可以找出100個(gè)日常使用Python鳖谈、Ruby岁疼、Haskell、Perl6缆娃、PHP等語(yǔ)言開(kāi)發(fā)者捷绒,基本上可以排一下智商:
Haskell >>> Perl6 > Ruby >>> Python >>>>>>>>>>>>> PHP
作為宇宙最牛叉的語(yǔ)言瑰排,PHP擁有龐大的粉絲,當(dāng)然魚(yú)龍混雜暖侨。
AI跟Python一點(diǎn)關(guān)系都沒(méi)有椭住,所有能用python實(shí)現(xiàn)的,必會(huì)配備其他語(yǔ)言實(shí)現(xiàn)的
如果你能同時(shí)學(xué)會(huì)Python字逗、Perl6京郑、Ruby、Haskell 你一定不會(huì)喜歡上Python扳肛,如果你喜歡Python多半是沒(méi)學(xué)過(guò)傻挂、或?qū)W不會(huì)Ruby、Perl6挖息、Haskell罷了金拒。
Python的哲學(xué):人生苦短,我用Python套腹。
Ruby的哲學(xué):感受編程的快樂(lè)绪抛。
你一定看出兩者的差別了,Python讓你抓緊時(shí)間干活(別跟我說(shuō)你干的快不快樂(lè))电禀,而Ruby是讓你享受編程的幢码,所以最終,能讓你在編程的時(shí)候感覺(jué)到快樂(lè)尖飞,一定是最具有創(chuàng)造力症副!想想看,人們是不是在最快樂(lè)的時(shí)候政基,創(chuàng)造了下一代贞铣?
Ruby的發(fā)明者松本行弘提倡機(jī)器不是主人,是工具沮明,而真正的主人應(yīng)該是"人"辕坝,于是他打算開(kāi)發(fā)一種更人性化的編程語(yǔ)言,讓機(jī)器為人服務(wù)荐健,你在使用Ruby的時(shí)候一定能感覺(jué)出來(lái)酱畅,Ruby提供了愉悅的編程體驗(yàn)。
Python的這種哲學(xué)江场,也使我非常反感Python纺酸,我總感覺(jué)推廣Python者,有一種苦大仇深的樣子址否,寫(xiě)代碼對(duì)他們來(lái)說(shuō)似乎是一種折磨吁峻,抓緊寫(xiě)完了事。而玩Ruby、Haskell的用含,多半充滿了樂(lè)趣矮慕,悠閑的寫(xiě)著美妙的代碼,享受生活啄骇、享受編程痴鳄。
臺(tái)灣的唐鳳mm(曾經(jīng)的唐宗漢GG),說(shuō):“Ruby 就是沒(méi)有到處打廣告的Perl 6”缸夹,唐mm一人率先用Haskell實(shí)現(xiàn)了Perl6的解析器pugs
痪寻,Perl6,一門(mén)神奇的語(yǔ)言虽惭,開(kāi)發(fā)歷時(shí)10多年橡类,堪稱歷史上最精妙的腳本語(yǔ)言,融合百家之長(zhǎng)芽唇,所以到最后幾乎沒(méi)開(kāi)發(fā)出來(lái)顾画。
你可以不相信本文所寫(xiě),因我資歷淺薄匆笤,但你需要跟隨高手的選擇研侣,比如高手都在練易筋經(jīng),你卻跟了丁春秋學(xué)化功大法炮捧,還以為這種才是獨(dú)步天下的武功庶诡,豈不可笑?
對(duì)比選用: python 3.6.4
咆课,ruby: 2.4.2
末誓,perl6
1.函數(shù)調(diào)用,不可省略括號(hào):
python
print("hello")
ruby
puts "hello"
perl
say "hello"
2.if/else語(yǔ)句书蚪,if不能后置喇澡,冒號(hào)顯得多余
python
if True:
print("True")
ruby
puts "hello" if true
perl
say "hello" if True
3.沒(méi)有所謂的語(yǔ)句皆為表達(dá)式特性,即必須手動(dòng)return返回值善炫!另外python這個(gè)類(lèi)定義,非得搞個(gè)self傳遞進(jìn)去
python
class Hello:
def hello(self):
return "hello"
ruby
class Hello
def hello
"hello"
end
end
perl
class Hello{
method hello {
"hello"
}
}
4.字符串內(nèi)插值:
python不支持库继,只能用format!
python
"name:%s,age:%d" % ("python", 18)
=>'name:python,age:18'
ruby
#內(nèi)插:
2.4.0 :014 > name, age = "ruby", 20
=> ["ruby", 20]
2.4.0 :014 > "name:#{name},age:#{age}"
=> "name:ruby,age:20"
#格式化:
2.4.0 :012 > "name:%s,age:%d" % ["ruby", 20]
=> "name:ruby,age:20"
perl
#內(nèi)插:
> my ($name, $age) = "perl6", 30
(perl6 30)
> "name:$name,age:{$age}"
name:perl6,age:30
#格式化:
> "name:%s,age:%d".sprintf("perl6", 30)
name:perl6,age:30
字符串不支持變量?jī)?nèi)插箩艺,非常不方便,% 來(lái)格式化字符串宪萄,這一點(diǎn)與ruby相同艺谆。
5.構(gòu)造list:
python
>>> ['east', 'west', 'south', 'north']
['east', 'west', 'south', 'north']
ruby
2.4.0 :016 > %w(east west south north)
=> ["east", "west", "south", "north"]
perl
> <east west south north>
(east west south north)
# 5版本
qw(east west south north);
ruby、perl都支持裸詞形式直接轉(zhuǎn)化成List拜英,python則必須手動(dòng)構(gòu)造静汤。
6.列表處理:
python
>>> from functools import reduce
>>> reduce(lambda x,y: x+y, map(lambda x: x**2, filter(lambda x: x%2 == 0, [1,2,3,4,5,6,7,8,9])))
120
# 從haskell抄來(lái)的List comprehension
>>> sum([x**2 for x in range(1,9) if x % 2 ==0 ])
120
ruby
2.4.0 :026 > (1..9).select(&:even?).map{|x| x**2 }.reduce(&:+)
=> 120
2.4.0 :027 > (1..9).select(&:even?).map{|x| x**2 }.sum
=> 120
perl
> (1..9).grep({ $_ % 2 ==0 }).map({$_ ** 2}).reduce({$^a + $^b})
120
# 或者
> (1..9).grep(* %2==0).map(* **2).reduce: &[+]
120
#或
> (1..9).grep(* %2==0).map(* **2).sum
haskell
-- haskell的幾種寫(xiě)法:
Prelude> sum $ map (\x -> x^2) $ filter ((==0) . (`mod` 2)) [1..9]
120
Prelude> sum $ map (^2) $ filter ((==0) . (`mod` 2)) [1..9]
120
Prelude> sum $ map (^2) $ filter even [1..9]
120
Prelude> sum [x^2| x <- [1..9], even x]
120
-- & ( |> 管道流函數(shù)為 flip $)或者自己定義一個(gè) let (|>) x f = f x
Prelude> :m +Data.Function
Prelude Data.Function> [1..9] & filter even & map (^2) & sum
120
這里能明顯看出來(lái),python不使用 list comprehension 的列表處理,函數(shù)不斷堆括號(hào)調(diào)用虫给,非常繁瑣藤抡。
ruby、perl都能支持.method這樣的鏈?zhǔn)秸{(diào)用下去抹估,即便julia也提供 |> 這樣的管道形式來(lái)簡(jiǎn)化鏈?zhǔn)秸{(diào)用缠黍。
haskell盡管沒(méi)有如ocaml的 |> 函數(shù)(有類(lèi)似的 & ),但 組合 $ . 函數(shù)药蜻,依然能打造出最簡(jiǎn)潔的鏈?zhǔn)秸{(diào)用瓷式。
7.lambda
python
>>> (lambda x,y: x+y)(2,3)
5
ruby
2.4.0 :045 > ->x,y {x + y} [2,3]
=> 5
haskell
Prelude> (\x y -> x+y) 1 2
3
perl
> (-> $x, $y { $x + $y })(2,3)
5
# 地球最強(qiáng)黑魔法的perl6,可以簡(jiǎn)寫(xiě)成這樣语泽,有沒(méi)有激動(dòng)贸典?
> (* + * )(2, 3)
5
ruby和perl簡(jiǎn)直一樣,都是 -> p {} 形式踱卵,區(qū)別在于ruby使用[]來(lái)調(diào)用(也可使用call)
雖然ruby也有 lambda {}形式聲明廊驼,但 -> {} 形式更簡(jiǎn)潔,而python無(wú)法去掉lambda這幾個(gè)字
8.Hash
python
>>> {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
ruby
2.4.0 :048 > {a: 1, b: 2}
=> {:a=>1, :b=>2}
perl
> a => 1, b => 2
(a => 1 b => 2)
ruby構(gòu)造出來(lái)的是symbol的key颊埃,區(qū)別于字符串蔬充,perl6甚至于可以省略大括號(hào)。
9.正則表達(dá)式:
python的正則是殘廢的班利,需要導(dǎo)入re包饥漫!
python
>>> import re
>>> re.match(r'.*tel:(\d+)', 'I am jesse, tel:13812345678').group(1)
'13812345678'
ruby
2.4.0 :058 > 'I am jesse, tel:13812345678'.scan(/tel:(\d+)/)
=> [["13812345678"]]
perl
> 'I am jesse, tel:13812345678' ~~ /tel\:(\d+)/
?tel:13812345678?
0 => ?13812345678?
python的正則差太多,不僅要導(dǎo)入包罗标,而且是字符串形式庸队,并且不能部分匹配,前面需要寫(xiě)*不然不能匹配闯割,ruby彻消,perl語(yǔ)言層面提供正則支持。
10.目錄處理:
python
>>> import os
>>> list(sorted(filter(lambda x: x[0] !='.', os.listdir('.'))))[0:5]
['Applications', 'Calibre Library', 'Desktop', 'Documents', 'Downloads']
ruby
2.4.0 :069 > Dir['*'].sort.take(5)
=> ["Applications", "Calibre Library", "Desktop", "Documents", "Downloads"]
perl
> dir.map(*.Str).sort.grep(* !~~ /^\./ )[^5]
(Applications Calibre Library Desktop Documents Downloads)
#或者用.perl.say來(lái)查看有空格的目錄
> dir.map(*.Str).sort.grep(* !~~ /^\./ )[^5].perl.say
("Applications", "Calibre Library", "Desktop", "Documents", "Downloads")
python需要導(dǎo)入os宙拉,ruby宾尚、perl內(nèi)置支持,ruby谢澈、perl省略括號(hào)可以看到非常簡(jiǎn)潔煌贴。