社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Python 言語について 新しく知った 9つのこと

Python の初心者です。
Pythonによるデータ分析入門(第二版) の第二章に Python 言語について書かれていた内容から、自分にとって新しい発見が多かったので、それを列挙します。
既に Python を学んだことがある方にとっては、常識的な内容かと思います。

1. インデントは 4つの空白で
自分は 2つの空白でよく書いてますが、4つがスタンダードらしいです。

2. セミコロンを使えば、複数の変数を1行で定義できる

a = 5; b = 6; c = 7

Java のように各行の最後に ; を置く必要はないですが、あえて置くことで、このような定義が可能になります。
しかし読みづらいので、特に推奨はされないですね。

3. すべてのものがオブジェクトである
Python の開発者が好きな言葉らしいですが、これが意味することについては、まだ理解できていないです。
恐らく、以下の記事を読んだほうが理解が深まりそうです。
http://blog.lerner.co.il/pythons-objects-and-classes-a-visual-guide/

4. リストの場合 a = b は値のコピーではなく、参照先のコピーである

a = [1, 2, 3]
b = a
a.append(4)
b
# -> [1, 2, 3, 4]

a の値を変更すると、b の値も変更されている。
すなわち a と b が参照している値は同じである。
リストの場合だけではないかもしれませんが、とりえあず。

5. 関数に渡す引数がリストの場合も値のコピーではなく、参照先のコピーである

def append_element(list, element):
    list.append(element)

data = [1, 2, 3]
append_element(data, 4)
data
[1, 2, 3, 4]

data を append_element に渡し、関数内で演算後、呼び出し元で data の値を見てみると、関数内で演算した内容が反映されている。
すなわち 関数に渡した data と元の data が参照している値は同じである。
こちらもリストの場合だけではないかもしれませんが、とりえあず。

6. 暗黙の型変換は明らかな場合のみ

a = 4.5
b = 2
a / b
# -> 2.25

float と int の計算時には暗黙的に変換してくれます。

a = 2
b = "m"
print(a + b)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-827396fae8f4> in <module>()
      1 a = 2
      2 b = "m"
----> 3 print(a + b)

TypeError: unsupported operand type(s) for +: 'int' and 'str'

int と str をつなげようとしても、エラーになります。
Java などでは、自動的に int が str に変換されて処理してくれますが、python ではより厳密に型について考えられているようです。

7. isinstance(value, type) で型のチェックができる

a = 5
isinstance(a, int)
# -> True

a = 5
isinstance(a, str)
# -> False

何の型かを調べるなら、type(a) で "int" が得られます。

8. Duck typing
“If it walks like a duck and quacks like a duck, then it’s a duck.”
"もしそれがアヒルのように歩き鳴くのであれば、それはアヒルだ。"
以下の例で言うと、、

def isiterable(obj):
    try:
        iter(obj)
        return True
    except TypeError: # not iterable
        return False

もし、そのオブジェクトからイテレータを作成できるのであれば、それは iterable である。
当然と言えばそうかもしれませんが、あるオブジェクトの型そのものは気にしなくても、その特性について意識する場合、こういったチェックが必要になってくるのだろうと思います。
"Duck typing" について、何となく分かったような気もしますが、まだぼんやりとしています。

9. 値の比較は ==, オブジェクトの比較は is

a = [1, 2, 3]
b = a
b == a # True
b is a # True

b と a は値も参照先も等しい。

a = [1, 2, 3]
c = list(a)
c == a # True
c is a # False

c と a は値は等しいが、参照先は異なる。

所感
細かい点を含めると、一節を読んだだけでも知らないことがたくさんでてきますね。
また、読んだときには分かったような気になってても、忘れてしまうことも多いので、繰り返し練習しながら理解を深めていきたい。