でもさ、なんか一貫性が無いように感じるんだよね。
まず、言語の大半の部分がオブジェクト指向言語っぽいデザインになってるのに、listの要素数を測る手段はlen()って*関数*なのはどうなの?
a = [1, 2, 3] len(a) # 3
俺は、sortとsortedって言う命名からこの挙動をまったく予測できなかった。
a = [1, 3, 2] a.sort() # None a # [1, 2, 3]
sorted([1, 3, 2]) # [1, 2, 3]
しかもsortedにdictを渡すとkeyがlistに変換されてソートされて返ってくる。
コードリーダビリティに関する本を開けば、どの本にだって「良い名前を選択する」ことの重要性が書かれていると思う。
「sort()が破壊的で、sorted()が非破壊的、sorted()にdictを渡すとkeyのlistがソートされて返ってくる」これって良い命名なのかな?
", ".join(['1', '2', '4', '8', '16']) # "1, 2, 4, 8, 16"
しかも、これに対する「文字列リテラル (文字列定数) のメソッドを使うのは*醜すぎる*」という意見に対しての公式の返答が、これってのも凄い。
確かにそうかも知れませんが*文字列リテラルは単なる固定された値に過ぎないというのが答えです。文字列に束縛された名前にメソッドが許されるなら、リテラルに使えないようにする論理的な理由はないでしょう。
The Zen of Pythonで「醜いより美しい方がいい」って言ってましたやん。
そもそもリテラルかどうかに関係なくstrインスタンスにこのメソッドがある事がおかしいと思った。
pythonのmapは関数として実装されている。(まただよ...)
list(map(lambda x: x*x, [1, 2, 3])) # [1, 4, 9]
なんでメソッドにしなかったの? って質問に対して公式がこう答えてる。
主な理由は歴史です。複数の型に対しての総称的な操作で、対象のオブジェクトがメソッドを全く持っていなかった (例えば、タプル) としても働くよう意図したものに関数は使われました。
(中略)
うわー、信じられねぇ…
歴史的経緯があるから一貫性が無いのは仕方ないみたいなこの感じ。
これが設計思想に「醜いより美しい方がいい」を掲げるpythonの実装なんだねぇ…
散々pythonの事を悪く言ったけど、おれ実はpythonくんの良い所もいっぱい知ってるんだ。
pythonくんの良い所:
The Zen of PythonにPythonの設計思想が色々書いてある。
「醜いより美しいほうがいい」という指針があることはさっき紹介した通りだ。
でもThe Zen of Pythonには「Although practicality beats purity.(実用性を求めると純粋さが失われることがある。)」とも書いてある。
pythonはこの設計思想を他の言語には無い高いレベルで体現してるとは思う。
pythonは、
無節操に色々取り入れた上で、「tupleからメソッドはやせないから、mapは関数にする」とか、メチャクチャな方法でそれらを統合した言語だ。
だが、そういう言語だからこそ、pythonで書いたコードを育てていく中で様々なパラダイムへとシームレスに変化させていく事ができる。
そういう「不純であるがゆえに柔軟性を持ったプログラミング」言語がpythonだと思う。
rubyの純粋性はすごいよ。イカれたくらい徹底されたオブジェクト指向。
BaseObjectをrootとする継承のツリーの中に世界のすべてが収まっている。
haskellの純粋性も凄い。「代入が無い」プログラミング言語に初めてであった時の衝撃。
もう、pythonは後戻りできないレベルであらゆる分野に使われているから、 pythonを使い続けることは正しい。