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
So the first one, "sort" is a verb, saying "sort this list".
https://www.quora.com/Why-is-the-Python-sorted-function-called-sorted
The second one, "sorted" is more adjective-ish, so "sorted(l)" can be read like, "this list, sorted"
Python のメンテナーが書いたわけではないと思いますが、感覚としては賛同できる(個人的な感想です)。
一般的かと言われると、特殊な部類だと思います。
破壊的ではない(自身を変更しない)sort メソッドは、javascript の Array.sort や Ruby の Array.sort なんかがそうです。
sorted という命名は、Swiftにあったりしますが、あまり見かけない感じです。
こちらは参考になるでしょうか。
list.sort()は、破壊的なメソッドなので、元のリストオブジェクトの順序を入れ替えてしまいます。
sorted()は元のリストオブジェクトは壊しません。
http://akiyoko.hatenablog.jp/entry/2014/09/26/235300
http://minus9d.hatenablog.com/entry/2015/01/04/235442
ご回答ありがとうございます。
破壊的代入であるかどうかは
②に記載下通り既に存じておりましたので
ポイントの配布は控えさせていただきます。
So the first one, "sort" is a verb, saying "sort this list".
https://www.quora.com/Why-is-the-Python-sorted-function-called-sorted
The second one, "sorted" is more adjective-ish, so "sorted(l)" can be read like, "this list, sorted"
Python のメンテナーが書いたわけではないと思いますが、感覚としては賛同できる(個人的な感想です)。
一般的かと言われると、特殊な部類だと思います。
破壊的ではない(自身を変更しない)sort メソッドは、javascript の Array.sort や Ruby の Array.sort なんかがそうです。
sorted という命名は、Swiftにあったりしますが、あまり見かけない感じです。
メソッドと関数で意味合いというか、感じ方は変わってくると思います。
メソッドの場合には、対象のオブジェクトに対しての命令になるので
(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
勉強になります。ありがとうございます。
このような関係ということですね。
形容詞 名詞 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/13 00:52:57メソッドの場合には、対象のオブジェクトに対しての命令になるので
(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
勉強になります。ありがとうございます。
このような関係ということですね。
形容詞 名詞 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 クラスを直接継承して生成されています。
だからここのクラスでメソッドを定義するのが面倒だからかな?とも思ったのですが index, count メソッドがシーケンスで共通に実装されています。
2017/10/15 12:05:13>>> 'Hello, world!'.index('l')
2
○ sort が list 専用のメソッドである理由
list 以外のシーケンス tuple や str は immutable であったりして、破壊的代入を行う sequence.sort を行うことができないので sort メソッドは list 専用というのは、納得が行きます。
いつも、誠にありがとうございます。
今後ともよろしくお願いいたします。