なぜ Python では sorted 関数を sorted と命名したのでしょうか?


sort でもいいのではないかと感じました。

きっと何がしか意図があったとは思うのですが
その意図が汲み取れず質問させていただきました。

いまいち、何を言ってるか分からないかと思うのですが
思い当たることがありましたらご教示いただけると幸いです。


---
調べたり疑問に感じた点
---

list.sort 関数と同じ関数名にすると、やはり問題があるのでしょうか。
https://docs.python.org/ja/3/howto/sorting.html


現在形(引数)
返り値=過去分詞(引数)

という書き分けは
一般的な記述方法なのでしょうか。


> # list から要素を抜き出す exclude 関数, remove 関数と同義
> lst1 = [1,2,3]
> exclude(lst1, 1)
> lst1
[2, 3]

> lst2 = excluded([1,2,3], 1)
> lst2
[2, 3]


組み込み関数の一覧を見たのですが
関連する命名の規則性も見つけられませんでした。
https://docs.python.org/ja/3/howto/sorting.html

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2017/10/13 00:24:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント500pt

So the first one, "sort" is a verb, saying "sort this list".
The second one, "sorted" is more adjective-ish, so "sorted(l)" can be read like, "this list, sorted"
 

https://www.quora.com/Why-is-the-Python-sorted-function-called-sorted

Python のメンテナーが書いたわけではないと思いますが、感覚としては賛同できる(個人的な感想です)。

一般的かと言われると、特殊な部類だと思います。
破壊的ではない(自身を変更しない)sort メソッドは、javascript の Array.sort や Ruby の Array.sort なんかがそうです。
sorted という命名は、Swiftにあったりしますが、あまり見かけない感じです。

他2件のコメントを見る
id:a-kuma3

メソッドと関数で意味合いというか、感じ方は変わってくると思います。

メソッドの場合には、対象のオブジェクトに対しての命令になるので
(I make) [object] sort

[object].sort()
なのだと思います。

関数の場合は、処理が主体になりますが、語順は自然言語と入れ替わりますが、やっぱり引数に対する命令なので、
sort([object])
という命名の方が多いと思います。

# 手続き型言語から OO へ移った人には、同意してもらえると思う

sorted は、
which is)sorted [object]
という、過去分詞というよりは受け身を形容詞的に使っているイメージなのだと思います。

もしかして関数型言語の慣わしか、とか思って、Lisp とか Scheme とかを絡めて検索してみたのですけれど、そういった検索結果は得られず、という感じでした。

何やら、こだわりが感じられる気はしますが、Ruby だと
 Array.sort ─ 別インスタンスを返す
 Array.sort! ─ 破壊的
という感じなので、
 List.sorted ─ 別インスタンスを返す
 List.sort ─ 破壊的
の方が、しっくりくるなあという気がします(個人的な感想
何故に関数なんだかなあ、と >Python

2017/10/13 00:52:57
id:domodomodomo

勉強になります。ありがとうございます。
このような関係ということですね。

形容詞 名詞 sorted(list_obj)
動詞 名詞 list_obj.sort() # sort list_obj

またあまり一般的な書き方でないということで
ひとまず私の小さいコードの中で使うのは、止めようと思います。

いくつかご教示いただいた内容を元に、すこし考えてみました。

---
> 何故に関数なんだかなあ、と >Python
考えたこと
---
シーケンスについての処理は、関数として定義されていたり(max)、メソッドとして定義されていたり(index)バラバラみたいですね...。メッソドと関数にわけた理由が、可読性を意識されたのか、背景がすこし気になります。


○ 仮説: クラスごとに sorted を実装するのが面倒だから?
→ 違う。sequence は index, count などの共通のメソッドを持っている。

もし sorted 関数を属性に持つ sequence クラスのようなものが存在して、list, tuple, range がそのクラスを継承してくれていれば

sequence_object.sorted() のように使えるような仕様になっていたのだろうと思いますが

実際には list, tuple, range, str クラスは object クラスを直接継承して生成されています。

>>> list.__bases__
(<class 'object'>,)
>>> 
>>> tuple.__bases__
(<class 'object'>,)

だからここのクラスでメソッドを定義するのが面倒だからかな?とも思ったのですが index, count メソッドがシーケンスで共通に実装されています。
>>> 'Hello, world!'.index('l')
2


○ sort が list 専用のメソッドである理由
list 以外のシーケンス tuple や str は immutable であったりして、破壊的代入を行う sequence.sort を行うことができないので sort メソッドは list 専用というのは、納得が行きます。



いつも、誠にありがとうございます。
今後ともよろしくお願いいたします。

2017/10/15 12:05:13

その他の回答1件)

id:rsc96074 No.1

回答回数4503ベストアンサー獲得回数437

 こちらは参考になるでしょうか。

list.sort()は、破壊的なメソッドなので、元のリストオブジェクトの順序を入れ替えてしまいます。
sorted()は元のリストオブジェクトは壊しません。

http://akiyoko.hatenablog.jp/entry/2014/09/26/235300
http://minus9d.hatenablog.com/entry/2015/01/04/235442

id:domodomodomo

ご回答ありがとうございます。
破壊的代入であるかどうかは
②に記載下通り既に存じておりましたので
ポイントの配布は控えさせていただきます。

2017/10/13 00:21:14
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント500pt

So the first one, "sort" is a verb, saying "sort this list".
The second one, "sorted" is more adjective-ish, so "sorted(l)" can be read like, "this list, sorted"
 

https://www.quora.com/Why-is-the-Python-sorted-function-called-sorted

Python のメンテナーが書いたわけではないと思いますが、感覚としては賛同できる(個人的な感想です)。

一般的かと言われると、特殊な部類だと思います。
破壊的ではない(自身を変更しない)sort メソッドは、javascript の Array.sort や Ruby の Array.sort なんかがそうです。
sorted という命名は、Swiftにあったりしますが、あまり見かけない感じです。

他2件のコメントを見る
id:a-kuma3

メソッドと関数で意味合いというか、感じ方は変わってくると思います。

メソッドの場合には、対象のオブジェクトに対しての命令になるので
(I make) [object] sort

[object].sort()
なのだと思います。

関数の場合は、処理が主体になりますが、語順は自然言語と入れ替わりますが、やっぱり引数に対する命令なので、
sort([object])
という命名の方が多いと思います。

# 手続き型言語から OO へ移った人には、同意してもらえると思う

sorted は、
which is)sorted [object]
という、過去分詞というよりは受け身を形容詞的に使っているイメージなのだと思います。

もしかして関数型言語の慣わしか、とか思って、Lisp とか Scheme とかを絡めて検索してみたのですけれど、そういった検索結果は得られず、という感じでした。

何やら、こだわりが感じられる気はしますが、Ruby だと
 Array.sort ─ 別インスタンスを返す
 Array.sort! ─ 破壊的
という感じなので、
 List.sorted ─ 別インスタンスを返す
 List.sort ─ 破壊的
の方が、しっくりくるなあという気がします(個人的な感想
何故に関数なんだかなあ、と >Python

2017/10/13 00:52:57
id:domodomodomo

勉強になります。ありがとうございます。
このような関係ということですね。

形容詞 名詞 sorted(list_obj)
動詞 名詞 list_obj.sort() # sort list_obj

またあまり一般的な書き方でないということで
ひとまず私の小さいコードの中で使うのは、止めようと思います。

いくつかご教示いただいた内容を元に、すこし考えてみました。

---
> 何故に関数なんだかなあ、と >Python
考えたこと
---
シーケンスについての処理は、関数として定義されていたり(max)、メソッドとして定義されていたり(index)バラバラみたいですね...。メッソドと関数にわけた理由が、可読性を意識されたのか、背景がすこし気になります。


○ 仮説: クラスごとに sorted を実装するのが面倒だから?
→ 違う。sequence は index, count などの共通のメソッドを持っている。

もし sorted 関数を属性に持つ sequence クラスのようなものが存在して、list, tuple, range がそのクラスを継承してくれていれば

sequence_object.sorted() のように使えるような仕様になっていたのだろうと思いますが

実際には list, tuple, range, str クラスは object クラスを直接継承して生成されています。

>>> list.__bases__
(<class 'object'>,)
>>> 
>>> tuple.__bases__
(<class 'object'>,)

だからここのクラスでメソッドを定義するのが面倒だからかな?とも思ったのですが index, count メソッドがシーケンスで共通に実装されています。
>>> 'Hello, world!'.index('l')
2


○ sort が list 専用のメソッドである理由
list 以外のシーケンス tuple や str は immutable であったりして、破壊的代入を行う sequence.sort を行うことができないので sort メソッドは list 専用というのは、納得が行きます。



いつも、誠にありがとうございます。
今後ともよろしくお願いいたします。

2017/10/15 12:05:13

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません