68162


Pythonにて配列をソートする方法は、とりあえずsort()とsorted()がよく出てくるのですが、なぜ配列のメソッドとしてsorted()がないのでしょうか?

[code]

    a = [4, 1, 2, 6]
    a.sort() # [1, 2, 4, 6] 破壊的操作でaの並びが書き換えられる
    a = [4, 1, 2, 6]
    sorted(a) # 戻り値として[1, 2, 4, 6]、aは非破壊
    
[/code]

`a.sorted()` のほうがわかりやすい(混乱しにくい)気がするのですが、どういういきさつなのでしょうか?  
英語の文法的、英語の語感的問題?

※ もちろん `sort(a)` の実装というのもアリかもしれない、いずれにしても関数とメソッドがごっちゃになってるのが気持ち悪いということ


CC BY-SA 4.0
2020-06-01T01:36:31.063
67179
2020-07-01T01:49:08.153
2236
question
python
Pythonのsortメソッドとsorted関数について


**語** 感というより **文法的** 感覚ではないかと思います。

そもそも Objective 指向の Object は文法用語では目的語のことです。動詞（instruction, procedure,
method）の対象ですから、`a.sort()` の `a` が Object である限り、`sort` という動詞の目的語として `a`
を捉える方が、文法感覚的にはナチュラルなんだと思います。

一方、`sorted(a)` の場合は、`a` のメソッドとしての記述ではありませんから、`a` はあくまでも `sorted` という関数に与えられる
argument の扱い。関数の場合は、式（expression）として戻り値が得られるという感覚の方がプログラミング言語的に自然な感覚ですね。そして
`sorted` は過去分詞であり、「ソートされたもの」ということで、ソートされた結果として得られる戻り値に対する表現となっているわけです。

つまり、`a.sort()` の方は目的語（object）としての `a` を中心にして捉えてそれを「sort する」。

`sorted(a)` の方は、式として（記述された関数の出力として）戻ってくる値を中心にして捉えて、それが「sorted（sort
された）もの」である、と。

Ruby との仕様の違いは、作者が日本人だからということに起因するのかどうかはわかりませんが……。

あと、その
[FAQ](https://docs.python.org/3/faq/design.html?highlight=array%20sort#why-
doesn-t-list-sort-return-the-sorted-list) で述べられているのは、a.sort() で戻り値を返さない（a
自身を破壊的に sort しつつ、戻り値も返す仕様にしないで、何も返さない）理由で、経緯ではないですね。


CC BY-SA 4.0
2020-06-01T03:41:24.247
67185
2020-06-01T03:47:53.843
2020-06-01T03:47:53.843
7290
7290
67179
answer


すでに解決にされたようなので今更な回答ですが回答してみます。

歴史的な経緯についてはわからないのですが、おそらく以下のような理由でこの作りになったのではないかと思います。

  * 前提として、 Ruby はオブジェクト指向言語としての一貫性を重視していて、 Python はオブジェクト指向言語と関数型言語のよいとこ取りをしている。
  * Ruby は複数のクラスにまたがって使用できる機能を通常ミックスインで実装するが、 Python はそのような機能をミックスインで実装することもあれば関数で実装することもある。
  * 「関数で実装することもある」の代表例は iterable を受け取る組み込みの関数群。今回あげられた `sorted()` の他にも `all()` `any()` `enumerate()` `filter()` `map()` `min()` `max()` `reversed()` `sum()` `zip()` 等がある。
  * iterable を受け取るこれらの関数には副作用が無い点が共通している（関数型言語的）。

ということで、 `sorted()` は `list` の他にもさまざまな iterable に対して使えて副作用の無い汎用的な機能だから関数で用意しよう。
`sort()` は副作用があり広く iterable に使える機能ではないので、 `list` のメソッドで用意しよう。となったのではないかと思います。

個人的な感覚では、 Python の `sorted()` はどちらかというと `sort.list()` よりも `all()` や
`reversed()` に近いイメージで捉えています（ Ruby の破壊的メソッドと非破壊的メソッドが `!`
のあるなしでペアになっているのもそれはそれで直感的でわかりやすいと思います）。

ご参考になればと思います。


CC BY-SA 4.0
2020-07-01T01:49:08.153
68162
2020-07-01T01:49:08.153
28632
67179
answer