"sep".join()は気持ち悪くないよ!
- "sep".join(list) が気持ち悪い理由
- そんなに Array.join がいいのか
- Pythonの','.join()がキモいと思ってた時代が僕にもありました
- Pythonの文字列連結(join)にまつわる議論 まとめと考察(2)
"".join()が色んなところで話し合われているんですね。
眺めていると「気持ち悪い派」が多数派のようです、主な肯定派はid:methaneさんくらい?
みんな気持ち悪いと思うのかぁ・・・
逆に私は「よく考えてあるなぁ」と感心したんですが・・・
私も"".join([])を見たときは「???」と思いましたよ、だって今まで見てきた言語とは逆なんですから。
ずっと「なんでだろう・・・?」と思っていたんですが、ある時ひらめきました。
そうか!左辺と右辺の対応をわかりやすくするためだったのか!!
それに気づいた時はしびれましたね、同時期に勉強してたRubyがすっかり霞んでしまいました。
Pythonは言わずとしれた動的型付言語です。
教育言語であるPythonにとって、ダックタイピングは当然の選択といえるでしょう(静的型付言語でダックタイピングをやろうとすると、飛躍的に覚える事が増える)
そんな動的型付言語にも、大きなデメリットがあります。
それは「変数の中に何が入ってるかわかりにくい」ということです。
書いている時は良いんです、あとになってからコードを読んでいると「あれ、この変数には何が入ってるんだっけ?」って悩むときってありませんか?
そんな動的型付言語の一番の泣き所を、Pythonは少しでも緩和するよう設計されています。
PythonとRubyのコードを見比べてみましょう。
#Ruby s = ["Tim","Jack","Mathhew"].join(",") #Python s = ",".join(["Tim","Jack","Mathhew"])
Rubyでは行を最後まで読んで、やっと文字列が返ってくる事がわかります。
逆に言うと、文を最後まで読まないと左辺に何が代入されるか分かりません。
Pythonでは右辺の先頭さえ見れば、文字列が返ってくる事がわかります。
len()がリストのメソッドでないのも同じ理由です。
オブジェクト指向的に考えれば、リストのメソッドであるべきなのに、わざわざビルトイン関数にしたんです。
#Ruby l = [1,2,3,4,5,6,7].length #Python l = len([1,2,3,4,5,6,7])
メソッドチェインを使っていたりすると、「碧い海、青い空、照りつける太陽、そんな南の島に行ってません」みたいな、最後の最後にきて否定形みたいな事になります。
#Ruby s = [2,4,8,3,5].sort.reverse.join(",") #Python s = sorted([2,4,8,3,5],reverse=True) s = ",".join([str(x) for x in s])
書いている方は意識しなくても、読んでいる方は「リスト、リストと来ているのに、最後は結局文字列かいっ!」と思っちゃいます。
あれ?思っちゃいません?私は思っちゃいますけどね。
このようにPythonでは、左辺と右辺の対応が文の先頭だけでわかるように設計されているのです。
こういう工夫の積み重ねが、Pythonのコードの読みやすさに繋がっているのかなと思います。
(でも、整数/整数が整数を返すのは失敗だったよね・・・)
Rubyは「書いてて楽しい言語」、Pythonは「読みやすい言語」だと思います。
でも、プログラムって「書く時間」は一瞬しかないけど、デバッグしたりメンテしたりの「読む時間」は圧倒的に多いんですよね。
私はPythonの考え方が好きかな。
やっぱり、Guidoさんはパネェっす!!
ところでGuidoさん、Pythonに定数はないんですか?(しつこい)
P.S
比較対象にRubyを入れたのは、単に比べやすかったからです。
別にRubyをDisってるわけじゃないですよ・・・(びくびく)