初めてのPython(4章)

Pythonプログラムの構造は

  • プログラムはモジュールから構成される
  • モジュールはステートメントから構成される
  • ステートメントは式から構成される
  • 式により、オブジェクトは生成・処理される


Pythonプログラムにおける演算の対象は全てオブジェクト
その種類によって、可変(mutable)なものと、不可変(immutable)なものがある。
不可変なオブジェクトの変更は出来無い
(変更を加えると新しい別オブジェクトとして生成される)


オブジェクトには2種類あり、オブジェクト毎に可能な値・演算が決まっている

  • ビルドインオブジェクト
  • ユーザ定義オブジェクト

ビルドインオブジェクトの代表例。詳細は、Pythonインタプリタでdir(__builtins__)

該当する値
数値 整数(1234)、長整数(999L)、浮動小数点(3.1415)、複素数(1+2j)
シーケンス 文字列('spam'), リスト([1, ['spam', 2L], 3.1415]), タプル{(1, 'sapm', 4, '[1, 2, 3, 4])}
写像 ディクショナリ({1:'spam', 2:'egg'})
ファイル open('work.data', 'r')
集合 set([1, 2, 3, 2, 1, 3, 4, 5]), frozenset([1, 2, 3, 2, 1, 3, 4, 5])

参考:Pythonライブラリリファレンス 3.組み込み型


ユーザ定義オブジェクトは自分でクラスを設計して作成する。
クラス設計時に扱える値・演算を決定することになる。


オブジェクトの情報を見る時は組込みの関数が有用

関数名 用途
dir() オブジェクトの属性の名称を参照
type() オブジェクトの型名を参照
help() オブジェクトの属性の詳細を参照

数値型(immutable)

整数と長整数では扱える範囲が異なる。
整数の最大値はsys.maxint、最小値は-sys.maxint - 1。
調整数の最大値はsys.maxlongかと思ったら存在せず、無限精度(2の100万乗までサポート)で数字の末尾にLがつく

kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.maxint
9223372036854775807
>>> print sys.maxlong
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'maxlong'
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
>>> print sys.maxint + 1
9223372036854775808L
>>>

floatが2進浮動小数点なのに対して、decimalという10進浮動小数点を扱うオブジェクトも存在する。

参考Python ライブラリリファレンス 6.3 decimal

シーケンス型

文字列、タプルはimmutableで、リストはmutable

シーケンス独特の操作に、インデクシングとスライシングがある。

インデクシングはCの配列操作と同じだが、マイナスのインデックスが使えることが違う。
スライシングはある範囲(開始地点:終了地点)を指定して切り出す操作。
開始地点を省略すれば先頭から、終了地点を省略すれば最後までを範囲とする
スライシングを使えば、インデクシングは代用可能!?(str[n] == str[n:n+1])

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> str='string'
>>> str[2:5]
'rin'
>>> str[-4:-1]
'rin'
>>> str[:3]
'str'
>>> str[-4:]
'ring'
>>> str[1:2]
't'
>>> str[1]
't'
>>> 
リスト内包表記

シーケンスに属する要素にそれぞれ同じ演算を加え、新しいリストを生成する。
演算はシーケンスの要素に対して左から右に順に行われる。
リストの要素を2乗する場合は、

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> list = [1, 2, 3, 4]
>>> [ x**2 for x in list ]
[1, 4, 9, 16]
>>>

写像(mutable)

'キー':'値'という形で要素を定義する。
特定の要素へのアクセスは'キー'を引数にして行う。
存在しないキーに対して値を代入すると新しい要素が作成され、既存キーに対して値を代入すると置き換えられる。
また、シーケンスと異なり順番に意味が無いため、作成順と表示があわないこともある

kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dict = {'food':'Spam', 'number':7, 'list':[1, 2, 3, 4]}
>>> dict
{'food': 'Spam', 'list': [1, 2, 3, 4], 'number': 7}
>>> dict['list']
[1, 2, 3, 4]
>>> dict['tuple'] = ('a', 'b', 'c')
>>> dict
{'food': 'Spam', 'list': [1, 2, 3, 4], 'number': 7, 'tuple': ('a', 'b', 'c')}
>>> dict['list'] = [5, 6, 7, 8]
>>> dict
{'food': 'Spam', 'list': [5, 6, 7, 8], 'number': 7, 'tuple': ('a', 'b', 'c')}
>>> 

ファイル

システム上のファイルへのインタフェース。
ファイルの作成、後始末はCのそれと同じ(open, close)。
読み書きが異なる(read/readline/readlines, write/writeline)

操作名 内容
read(size) size分の文字列をファイルから読み出す
readline() ファイルから1行文字列を読み出す
readlines() ファイルから文字列を全て読み出す
write(str) strをファイルに書き出す(改行無し)
writeline(sequence) sequenceをファイルに書き出すが(改行無し)

集合

setはmutableで、frozensetはimutable
数学の集合演算に対応できるオブジェクト