# まず、調べ物のやり方〜pythonで幾何をやりながら、調べ物のやり方を覚える

• 調べものができるようになることは大事。まずは、ここここを読む
• コードを探すにはNULLEGEサーチも便利
• わからない関数、使われているオブジェクトに対して、OBJ.__doc__、OBJ.__class__、help(OBJ)を使う
• 例。複素数zを作って、それについてやってみる
z = 1.2 + 0.3j
z
Out[32]: (1.2+0.3j)
# zのクラスは？
z.__class__
Out[33]: complex
# zのdocは?
z.__doc__
Out[34]: 'complex(real[, imag]) -> complex number\n\nCreate a complex number from a real part and an optional imaginary part.\nThis is equivalent to (real + imag*1j) where imag defaults to 0.'
# こうやって表示したほうが読みやすい
print(z.__doc__)
complex(real[, imag]) -> complex number

Create a complex number from a real part and an optional imaginary part.
This is equivalent to (real + imag*1j) where imag defaults to 0.
# help()を使うと、classもdocも出る
help(z) # help(complex)と同じ記事が出る
Help on complex object:

class complex(object)
|  complex(real[, imag]) -> complex number
|
|  Create a complex number from a real part and an optional imaginary part.
|  This is equivalent to (real + imag*1j) where imag defaults to 0.
|
|  Methods defined here:
|
|  __abs__(...)
|      x.__abs__() <==> abs(x)
|
|  __add__(...)
|      x.__add__(y) <==> x+y
|
|  __coerce__(...)
|      x.__coerce__(y) <==> coerce(x, y)
|
|  __div__(...)
|      x.__div__(y) <==> x/y
|
|  __divmod__(...)
|      x.__divmod__(y) <==> divmod(x, y)
|
|  __eq__(...)
|      x.__eq__(y) <==> x==y
|
|  __float__(...)
|      x.__float__() <==> float(x)
|
|  __floordiv__(...)
|      x.__floordiv__(y) <==> x//y
|
|  __format__(...)
|      complex.__format__() -> str
|
|      Convert to a string according to format_spec.
|
|  __ge__(...)
|      x.__ge__(y) <==> x>=y
|
|  __getattribute__(...)
|      x.__getattribute__('name') <==> x.name
|
|  __getnewargs__(...)
|
|  __gt__(...)
|      x.__gt__(y) <==> x>y
|
|  __hash__(...)
|      x.__hash__() <==> hash(x)
|
|  __int__(...)
|      x.__int__() <==> int(x)
|
|  __le__(...)
|      x.__le__(y) <==> x<=y
|
|  __long__(...)
|      x.__long__() <==> long(x)
|
|  __lt__(...)
|      x.__lt__(y) <==> x<y
|
|  __mod__(...)
|      x.__mod__(y) <==> x%y
|
|  __mul__(...)
|      x.__mul__(y) <==> x*y
|
|  __ne__(...)
|      x.__ne__(y) <==> x!=y
|
|  __neg__(...)
|      x.__neg__() <==> -x
|
|  __nonzero__(...)
|      x.__nonzero__() <==> x != 0
|
|  __pos__(...)
|      x.__pos__() <==> +x
|
|  __pow__(...)
|      x.__pow__(y[, z]) <==> pow(x, y[, z])
|
|  __radd__(...)
|      x.__radd__(y) <==> y+x
|
|  __rdiv__(...)
|      x.__rdiv__(y) <==> y/x
|
|  __rdivmod__(...)
|      x.__rdivmod__(y) <==> divmod(y, x)
|
|  __repr__(...)
|      x.__repr__() <==> repr(x)
|
|  __rfloordiv__(...)
|      x.__rfloordiv__(y) <==> y//x
|
|  __rmod__(...)
|      x.__rmod__(y) <==> y%x
|
|  __rmul__(...)
|      x.__rmul__(y) <==> y*x
|
|  __rpow__(...)
|      y.__rpow__(x[, z]) <==> pow(x, y[, z])
|
|  __rsub__(...)
|      x.__rsub__(y) <==> y-x
|
|  __rtruediv__(...)
|      x.__rtruediv__(y) <==> y/x
|
|  __str__(...)
|      x.__str__() <==> str(x)
|
|  __sub__(...)
|      x.__sub__(y) <==> x-y
|
|  __truediv__(...)
|      x.__truediv__(y) <==> x/y
|
|  conjugate(...)
|      complex.conjugate() -> complex
|
|      Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.
|
|  ----------------------------------------------------------------------
|  Data descriptors defined here:
|
|  imag
|      the imaginary part of a complex number
|
|  real
|      the real part of a complex number
|
|  ----------------------------------------------------------------------
|  Data and other attributes defined here:
|
|  __new__ = <built-in method __new__ of type object>
|      T.__new__(S, ...) -> a new object with type S, a subtype of T
• 次の記述を見てみる
|  Methods defined here:
|
|  __abs__(...)
|      x.__abs__() <==> abs(x)
• これは、complexクラスのオブジェクトxには、"x.__abs__()"という使い方があって、それは"abs()"と同じこととある。やってみる
z.__abs__()
abs(z)
• ヘルプ記事の下のほうに、以下の記述がある
|  conjugate(...)
|      complex.conjugate() -> complex
|
|      Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.
• これは、"x.__hoge__"という定義の仕方ではなく、関数conjugate(x)と使う、と言う意味。やってみる
conjugate(z) # エラーになる(conjugate()関数がcomplex配下の関数だから)
complex.conjugate(z) # エラーにならない
conjugate(z)
Traceback (most recent call last):

File "<ipython-input-70-d0155d636572>", line 1, in <module>
conjugate(z)

NameError: name 'conjugate' is not defined

complex.conjugate(z)
Out[71]: (1.2-0.3j)
• ヘルプ記事のさらに下に、以下の記述がある
|  Data descriptors defined here:
|
|  imag
|      the imaginary part of a complex number
|
|  real
|      the real part of a complex number
• これは、オブジェクトの属性なので
z.imag
Out[72]: 0.3
• のように、「関数的に使う(z.imag()のように使う)」のではなくて、z.(zの)imagは？と問いかけて取り出す