Cのsprintfのような文字列フォーマット

Cのsprintfみたいなことをしたいというケースがあります。その場合は、文字列に%演算子を使います。
コードの例を以下のような感じです。

num = 10
str = 'taro'

# 文字列のフォーマット
formatted_msg = 'Hello %s' % str
print formatted_msg # Hello taroと出力

# 数字のフォーマット, %演算子の右側が複数の場合は括弧でかこむ
formatted_msg = '%d %x %X %f' % (num, num, num, num)
print formatted_msg # 10 a A 10.000000と出力

# 桁数を指定して数値のフォーマット
formatted_msg = '%04d %02x %02X %2.3f' % (num, num, num, num)
print formatted_msg # 0010 0a 0A 10.000と出力

ぼくがよく使う文字列フォーマットは以下です。

コード
%s 文字列
%d 10進数
%x 16進数。a-fは小文字
%X 16進数。A-Fは小文字
%f 浮動小数

精度を指定する場合は以下のようになります。

コード指定 説明
%04d '0010'というように4桁で出力
%02X '0A'などと2桁の16進数で出力
%2.3f '10.000'と整数部分2桁、小数点以下3桁で出力

文字列操作、演算

Pythonには文字列操作、演算について様々な演算が用意されています。

以下によく使いそうなもののサンプルをピックアップして、コードにしてみました。

msg = 'Hello, Python'

# 文字列の長さを取得する
msg_length = len(msg) # 13と取得できる
print 'len : ' + str(msg_length)

# findメソッド
py_idx_of_msg = msg.find('Py') # 7と取得できる。Pyのある場所のインデクス
print 'msg.find : ' + str(py_idx_of_msg)

# 文字列インデクシング
c = msg[7]
print 'msg[7] : ' + c #'P'と出力

# 文字列のスライシング
msg2 = msg[7:9]
print 'msg[7:9] : ' + msg2 # 'Py'と出力

# 特定の文字列がある文字列中に入っているかの確認
if 'Py' in msg :
    print "'Py' in msg is true"

# 文字列から1文字ずつ取得する
for c in msg:
    print 'c : ' + c

# 文字列置換
msg3 = msg.replace('Hello', 'Hola')
print msg3 # Hola, Pythonと出力

# 文字列分割してリストに。
splitted_word = msg.split(',')
print splitted_word # ['Hello', ' Python'] と出力

# 文字列を再連結
joined_word = ','.join(splitted_word)
print joined_word # Hello, Pythonと出力

一応、これくらいあれば、基本的な文字列操作はできると思いますが、今後は必要に応じて追加していきます。

タプルとリストの違い

私もすべてを理解しているわけではないのですが、共通点は「両方ともオブジェクトの集合である。」という点です。

違いはリストはオブジェクトの内容を変更できるのに対して、タプルは上書きできないということです。

タプルはリストと同じようにキーではなくオフセット(1とか2とか)によってアクセスできますが、以下のように tuple[1] = 'aaa' というようにオブジェクトの内容を上書きすることができません。違いを以下のコードの例にしてみました。

list = ['python', 'perl', 'ruby']
print 'list[0] = ', list[0]    # pythonと出力

tuple = ('python', 'perl', 'ruby')
print 'tupel[0] = ', tuple[0]  # pythonと出力

list[1] = 'php'
print 'list[1] = ', list[1]    # phpと出力

tuple[1] = 'php' # ここでエラー

# 以下のようにエラーが出ます。
# tuple[1] = 'php'
# TypeError: 'tuple' object does not support item assignment

タプルは不変性を持つことに特徴があるので、オブジェクトのリストを使いたいのだけど、プログラム中で変更されることを望まない場合に使う、などの利用例がありそうです。

ビルトインオブジェクトの種類

Pythonには最初から便利な機能を持ったビルトインオブジェクトがあります。
最初のうちはビルトインオブジェクトだけでいろいろ試してみてPythonに慣れるのがよさそうです。

ビルトインオブジェクトの型とリテラルの例、それと備考を以下にまとめました。

ビルトインオブジェクトの型 リテラル 備考
数値 1, 2, 0.1, 99L
文字列 'abc', "abc" シングルクォーテーションかダブルクォーテーションで囲む
リスト [1, 2, 3], ['python', 'perl', 'ruby'], ['abc', ['def', 'ghi']] リスト内にリストもできる
ディクショナリ {'key1':'value1', 'key2', 'value2'} キーで指定して値の設定、取得ができる
タプル ('hoge', 'kero', '...') リストと違い不変性のあるオブジェクトの集合
ファイル f = open('./hoge.txt', 'r') ファイルを処理するためのインタフェース