Pythonのビルドインオブジェクト

今回はPythonの主なビルドインオブジェクトについて投稿しました。
まず、Pythonには標準で組み込まれているオブジェクトの型がありますが、その中でもよく使われるであろう物が数値、文字列、リスト、ディクショナリ、タプル、ファイル等らしいです。実際に前に投稿した簡単なデータ構造のStackとQueueをインプリメントした際には数値、文字列、リストを使ったのですが、より柔軟なものや複雑なものになるとタプルやファイルも多用することになるのだと思います。Pythonではプリミティブ型は備わっていないみたいで、JAVAなどにあるプリミティブ型とは違いビルドインオブジェクトではメソッドなどが使えるとのことです。

#数値
数値はその名のとおり数字を扱うオブジェクトで短整数、長整数、浮動小数点数、８進数と１６進数、複素数と５種類に分かれています。長整数はメモリの限界までサイズを増やせる特長があるらしいですが使う事はなかなかないのではと思います。数値を扱うにあたり演算子は必ずと言っていいほど必要になると思うので紹介しておきます。+,-,*,%は他の言語と同じ記号で扱う事ができますがべき乗は＊＊とアステリスクを二つ重ねて計算するというのがCやJAVAの^とは違いますね。他にもビット演算をするのに<<,>>でビットシフトしたり、&,|,^でAND,OR,XORのビット演算もできるみたいです。set()を使って集合も作れるみたいで’|’で集合の結合、&で集合の交差も演算できるみたいですね。後はmathというモジュールをインポートすればいろいろな数学の計算もできるみたいなので最後にリンクを張っておきます。

#文字列
文字列は不変性のオブジェクトで主にシングルクオテーション(')で文字列を囲むみたいですが、ダブルクオテーション(")でもできます。他の一般的な言語ではシングルクオテーションは文字(char)の型を扱う際に使われますが、Pythonでは文字列として認識されます。では文字列にシングルもしくはダブルクオテーションを文字列の一部として使用したい場合はどうするのでしょうか。これはシングルで囲った時は文字列にダブルを組み込むと文字として認識され、逆の場合も成り立ちます。そのほかにバックスラッシュ'\'を使い' \' ',' \" 'と文字列に入れるだけで文字と認識されます。バックスラッシュでは他にもいろんな機能を使えるので頻繁に使用しそうな物だけ取り上げておきます。'\n'は文字列の改行をする時、'\t'は文字列にタブを入れる時に使います。'\\\'、これはバックスラッシュを文字と認識させる時に組み込ませられます。他の機能は後々にコードを書くようになり、その中で使用するときに逐一説明していきたいと思います。raw文字列やunicode文字列というものもあるみたいですがこれらも後々に使用した時にとっておきます。文字列オブジェクトではないと思いますが、Pythonにはトリプルクオテーション(""")というものがあり、これでコードを囲む場合にはコメントとして認識されるのでコードは実行されません。その他にも文字列にはフォーマットのためのコードがありますがこれもリンクを投稿の最後に張っておきますのでそれを参考にしてください、もしくは使用した際には軽く説明していくと思います。最初に述べた不変性とは一度そのオブジェクトを生成してしまえば、それに対して変更を加える事はできないという事です。では、もし文字列に変更を加えたくなった時にはどうすればいいのでしょうか。文字列とはシークエンスと呼ばれる特徴があり文字列の先頭の文字をインデックス0から順に文字の長さをnとしてn-1までの番号が割り振られてます。これはCやJAVAでのarrayと同じと思ってもらえれば解りやすいですね。この特徴を使いスライシングという操作ができるのもPythonの特徴であると思いますが、スライシングとはなんなのでしょうか？スライシングとは文字列の一部を抜き出し新しい文字列オブジェクトを作成するという行為です。例を下にしめしておきます。

```py:Slicing.py
# 文字列オブジェクト作成とプリント
s = 'I am tired!'
print s

# 文字列の長さの取得
print len(s)

# 文字列の一つのインデックスから一文字を取得
print s[0]

# 文字列の一部を取得するスライシングで以下はすべて同じ行為をする
print s[5:11]
print s[5:]
print s[5:len(s)]

# 文字列をコピーして内容の一部を変更する(新しく生成された二つの
# 文字列オブジェクトを連結させ手一つの文字列オブジェクトを作成)
print s[:5] + 'fine!'
s = s[:5] + 'fine!'
print s
```
この最後の例題のように新しい二つの文字列オブジェクトをつなげて一つの文字列オブジェクトを作成すれば、もとのオブジェクトに変更しなくても変更したようなオブジェクトができ、これをもとの変数に代入すれば変更した事と同じことができます。この操作は文字列オブジェクトのメソッドのreplace()などでも可能みたいですが、ここではメソッドには言及しないので使用するメソッドで興味深いものがあればその時その時で説明は入れていきます。ちなみにスライシングの際に一番最後の文字を含める場合は文字列の長さnですが、その文字単体にアクセスする場合は先述のn-1でアクセスしてください。

#リスト
リストもシーケンス型のオブジェクトで基本的な概念は文字列と同じだと思ってもよいと思います。ただし文字列とは異なる大きな特徴が２つあります。１つ目は保存できる物がオブジェクトとなる点です。文字列では１つのインデックスに一文字ずつ保存していましたが、リストでは１つのインデックスに１つのオブジェクトなら何でも保存できるようになります。したがってリスト自身もオブジェクトなのでリストをリストの中に保存する事も可能になります。例えば、リストAとリストBがあるとします。リストAのインデックス0にリストBを入れて、リストAからリストBにアクセスしてリストBの要素を取り出したりできます。これは二次元配列と同じ役割になり行列などを使った計算に使用したりもできる便利なテクニックです。２つ目は可変性のオブジェクトである事です。リストは文字列とは違いコピーをとらなくてもオブジェクトその物の形を変化する事ができます。例えばappend()を使うとリストの最後に新しい要素を加えてリストの長さが１つ長くなりますし、pop()を使えばリストの最初の要素を抜き出して短くする事もできます。ただしシーケンス型なので文字列でやったスライシングや結合等も使用可能です。注意点としてはプログラムを書いていると意図せぬ所でリストが変化する可能性もあるみたいです。
下に簡単な二次元のリストの要素にアクセス例を書いておきました。

```py:Slicing.py
#リストを３個作成
B1 = [1,2,3]
B2 = [4,5,6]
B3 = [7,8,9]

#リストに上で作成したリストを保存
A = [B1,B2,B3]

#二次元のリストが作成できているかの確認
print A

#二次元のリストのド真ん中の値にアクセス（５を出力する）
print A[1][1]
```

#ディクショナリ
ディクショナリもオブジェクトを保存するためのオブジェクトです。しかしディクショナリはシーケンスの一定の順序で保存するのとは違い乱雑にオブジェクト内に保存します。なのでディクショナリの要素をprintするたびに要素の順序がバラバラに表示されたりします。ではどうやってアクセスをするのかというと、要素（オブジェクト）を保存するときに、その要素に対するキーワードを与えます。ある要素を取り出したい時にはキーワードを指定して要素を取り出します。ですので本屋さんで見るジャンルわけがディクショナリでジャンル内のアイウエオ順がリストみたいなシステムであると感覚的に理解してもいいかもしれません。

#タプル
タプルとは不変性のシーケンスオブジェクトでほぼリストと同じものだととらえてもよいと思います。しかし不変性であるがゆえに変更を加える際には文字列同様スライシングなどを使って新しいタプルオブジェクトの生成が必要であり、またメソッドなどがないので機能的にはリストの低機能バージョンだとおもってもいいのではないかと思います。ではここでタプルって必要なの？と疑問に思うかもしれませんが、リストでの注意点で意図しない時に変更が行われてしまうときがあると言ったような事はタプルでは起きません。こうやってここの特徴に合わせて使えば有用な方法はいっぱいあるのだと思います。ちなみに私がJAVAでタプルを作った時は２つで１組の要素をどうしても配列に使用しなくてはいけない事があったので作成しました。

#その他
ファイルオブジェクトは理解不足ですのでこれから使用した際に説明していこうと思います。Boolは説明する必要は特にないと思います。これらの他にもいろいろなオブジェクトが用意されてるみたいですが参考書では特に取り上げられていないのでその都度に私の理解の範囲内で説明していきたいと思っています。

これで主なオブジェクトのメモは終わりましたので次回からはステートメント(書式？)の章を読み終えたらまとめて投稿しようと思っています。また何か間違い等を投稿内に書いていればご指摘等よろしくお願いします。


mathのモジュール: http://docs.python.jp/2/library/math.html
文字列フォーマット(5.6.2): http://docs.python.jp/2/library/stdtypes.html#string-formatting

参考資料：初めてのPython　第３版　（発行元：オーライリージャパン）