質問するログイン新規登録

回答編集履歴

2

edit

2018/04/29 05:45

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -25,4 +25,30 @@
25
25
  print(dir(a))
26
26
  ```
27
27
 
28
- 使えるメソッドを確認できます。
28
+ 使えるメソッドを確認できます。
29
+
30
+ ---
31
+
32
+ さらに細かいことをいうと、lenはpythonの組み込み関数です。
33
+ https://docs.python.jp/3/library/functions.html#len
34
+ `len(x)`はxに`__len__`があればそれをコールする関数です。
35
+ なければエラーになります。intとか。
36
+
37
+ これに対してmeanはなくて、numpy.meanが定義されています。
38
+ その関係でxにx.meanが定義されていなければ、とりあえずnp.arrayにキャストすることを試みます。
39
+ なのでリストとかを入れても本当はmeanは定義されていなくてもnp.arrayにしてからmeanをコールするので、エラーにならないことがあります。
40
+ それでも文字列を入れたりすれば平均が取れないのでエラーになります。
41
+
42
+ ---
43
+
44
+ かなり難しいことになってきますが、意識すべきことは、実装がどこにあるかを見極めることです。
45
+ その際にソースコードを読んだりすることや、vars/dirのようなメソッドを使いこなすことが役に立ちます。
46
+
47
+ 今回の関連事項として、シンタックスシュガーをキーワードとして調べてみると理解を深められるかもしれません。
48
+ meanの場合は単なるシンタックスシュガーではありません。
49
+
50
+ ---
51
+
52
+ 最後に、
53
+ `len(x) == x.__len__()`です。
54
+ `np.mean(x) == x.mean()`はxがnp.arrayの時に限り必ず成り立ち、他の場合は実装次第です。

1

edit

2018/04/29 05:45

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,3 +1,23 @@
1
+ 質問に直接答えますと:
2
+
3
+ メソッドはオブジェクトに付随する性質です。
4
+ オブジェクト指向で書かれているのであれば、実装はオブジェクト(クラス)でなされます。
5
+
6
+ それに対して関数はある機能を実現するために書かれることが多いです。
7
+ 例えばnp.meanは平均値を計算します。
8
+
9
+ この時、np.mean(x)として、xがnp.arrayであれば、x.meanが実装されているので、それがそのまま呼び出されます。
10
+
11
+ xがリストだと、x.meanは定義されていないので、y = np.array(x)が実行されて、まずnp.arrayであるyが作られて、次にy.meanがコールされます。
12
+
13
+ lenの場合`__len__`が少し特殊なので難しいですが、試しに考えてみてください。
14
+ こちらの挙動がわかるようになれば初心者は脱出です。
15
+
16
+ そして、それぞれのオブジェクトにどのようなメソッドが実装されているのかを確認するには以下のやり方でできます。
17
+ メソッドだけでなく、変数なども含まれていることに注意する必要があるのはコメントにある通りです。
18
+
19
+ ---
20
+
1
21
  ```python
2
22
  import numpy as np
3
23