001:リテラル
リテラルとは、組み込み型の定数を表すものです。
123 # 整数リテラル、 int 型に対応 4.5 # 浮動小数点数リテラル、 float 型に対応 3.14j # 虚数リテラル、 complex 型に対応 "abc\n" # (Python 2) 8 ビット文字列リテラル、(Python 3) 文字列リテラル、 str 型に対応 'abc\n' # ', " どちらを使っても可。これは abc改行(LF)の4文字 "Jon 'Maddog' Orwant" # ダブルクォート内ではシングルクォートをエスケープなしで書ける 'Jon "Maddog" Orwant' # シングルクォート内ではダブルクォートをエスケープなしで書ける 'Jon \'Maddog\' Orwant' # バックスラッシュでエスケープすれば同種のクォートを含めることができる r'abc\n' # raw(生)文字列。バックスラッシュによるエスケープが無効となる。これは abc\n という見たままの5文字 u"abc" # (Python 2) ユニコード文字列リテラル、 unicode 型に対応 b"abc" # (Python 3) バイトリテラル、 bytes 型に対応
次のものは正確にはリテラルではなくアトムですが、 Ruby レシピブックの配列リテラル、ハッシュリテラルに対応するものであるため、ここで説明します。
[1, 2, 3] # リスト、 list を表す
(1, 2, 3) # タプル、tuple を表す
{1:'a', 2:'b', 3:'c'} # 辞書、 dict を表す
整数 (Python 2.0 - 2.5)
整数を表すリテラルには「整数リテラル」と「長整数リテラル」の 2 種が存在します。それぞれ int型、 long型に対応しています。整数リテラルは数字の並びです。長整数リテラルはこれの末尾に l もしくは L を付けたものです。なお Python 2.4 以降では長整数リテラルおよび long 型は使用する必要がありません。理由は後述します。
0 # int 型の 0 1 # int 型の 1 1L # long 型の 1
負の値は - を頭につけることにより表現できます。実はリテラルには - を接頭するという仕様は無く、単項演算子 - と整数リテラルの組み合わせです。
-1 # int 型の -1 -1L # long 型の -1
int 型の値域は環境にもよりますが、 32-bit 整数を使っている環境では -2147483648 から 2147483647 までです。long 型には値域の制限はありません。 Python 2.2 以降から int と long を統一する作業が進められました(PEP 237)。値域に制限がある int 型を削除し、 long 型とされているものを新しい int 型とする作業です。このため 表向きは 「整数の表現には int 型のみを使用する」、「long 型は遺物」、「int の値域に制限は無い」、という状況になっています。long 型を意識して使用する必要がなくなり、長整数リテラルも不要となりました。裏側では int 型は必要に応じて long 型に変換されています。 Python 2.4 以降ならば 2 << 32 のような左シフト演算でも long 型に変換されます。
8 進数、 16 進数を書き表すための記法も存在します。 8 進リテラルは 0 を、 16 進リテラルは 0x を頭につけます。
010 # int 型の 8 0x10 # int 型の 16 0xff # int 型の 255 0x10L # long 型の 16
整数 (Python 2.6)
Python 2.5 からの変更点として 2 進リテラルと新しい 8 進リテラルの追加があります。 2 進リテラルは 0b を、新しい 8 進リテラルは 0o を頭につけます。
0b1111 # int 型の 15 0o10 # int 型の 8
整数 (Python 3.0)
Python 2.2 から進められていた int と long を統一する作業が完了しました。 Python 2 の int 型は取り除かれ、Python 2 の long 型が Python 3 の int 型となっています。つまり Python 3 の int 型には値域の制限はありません。これによって言語仕様が簡易になっています。
0 # int 型の 0 1 # int 型の 1 -1 # int 型の -1
また、古い 8 進リテラルが仕様から取り除かれました。 8 進リテラルを表記する際は 0 ではなく 0o を頭につけるようにしてください。
浮動小数点数
浮動小数点数リテラルは float 型に対応しています。
0.0 .0 # 0.0 1.0 .1 # 0.1 1.23 1.23e2 # 123.0 1.23e-2 # 0.0123 45e2 # 4500.0 45e-2 # 0.45
浮動小数点数リテラルの仮数および指数は 10 進数とみなされるので注意してください。
010.0 # 10.0 010 # int型の 8 1.0e010 # 10 の 8 乗ではなく 10 乗
負の値は - を頭につけることにより表現できます。これも実はリテラルではなく単項演算子 - と浮動小数点リテラルの組です。
-1.23
虚数
虚数リテラルは complex 型に対応しています。虚数リテラルは実数部 0.0 の複素数を表します。
1.23j 4.5e6j 7j
実数部が 0.0 以外の複素数はリテラルとしては書き表せません。浮動小数点リテラル、整数リテラルなどと加算してください。
3.0+4.0j 6+8j
文字列 (Python 2)
文字列リテラルは ' もしくは " で囲われた文字列です。 str 型に対応しています。
'abc' "abc"
シングル、ダブルクォートには大きな差異が無いという点が Ruby とは異なります。Ruby の式展開に相当する機能が無いからです。 これらの違いは自分自身をリテラル内に直接含めることができない、というだけです。
''' # エラー! ' を表したいが意図したとおりにはならない """ # エラー! これも " にはならない '"' # これで " 1 文字を表すことができる "'" # ' 1 文字
自身を含める必要がある場合は \', \" という表現を使います。バックスラッシュはエスケープ文字として働きます。\x[16進数]? で任意のバイトを表現することもできます。
'\'' # ' 1 文字 "\"" # " 1 文字 '\\' # \ 1 文字 '\n' # 改行 1 文字(正しくは LF) '\x41' # 16 進数値 0x41 で表される文字、すなわち A
str 型はバイトの並びです。つまり 1 文字は 1byte = 8bit です。テキストデータの表現のほか、バイナリデータの表現にも用いられています。 Shift-JIS, EUC-JP などのマルチバイト文字を表現することもできますが、 Python 上の文字数(= バイト数)と意味上の文字数とは不一致が生じます。
'\x82\xa0' # Shift-JIS の「あ」 1 文字。「0x82 0xa0」の 2 文字、 2 byte
文字列先頭に r もしくは R を付与すると raw 文字列になります。この中ではバックスラッシュのエスケープが無効です。
r'\n' # 見たまま \n の 2 文字 r'(\d+)-(\d+)-(\d+)' # 2009-01-25 などにマッチする正規表現パターン
改行を含めた長い文字列を手軽に表現するために三重クォート文字列が存在します。この中には直接改行を書き込むことができます。 Ruby のヒアドキュメント相当の目的を果たします。
"""Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. """ # The Zen of Python の冒頭 4 行です
Python の文字列リテラルの変わった特徴として、隣接させることで各々を結合させることができる、というものがあります。これはあくまで文字列リテラルの機能であって、文字が入った変数を並べたとしても結合できないので注意してください。
"abc" "def" # abcdef 6 文字
"abc" 'def' # 同上
re.compile("[A-Za-z_]" # letter or underscore
"[A-Za-z0-9_]*" # letter, digit or underscore
)
# 括弧などと組み合わせることで 1 つの文字列を複数行に分けて記述できる
# 文字列と行末間にはコメントも書ける
ユニコード文字列 (Python 2)
ユニコード文字列リテラルは ' もしくは " で囲われた文字列に u もしくは U を接頭したものです。 unicode 型に対応しています。
u'abc' # abc 3 文字 u'あ' # あ 1 文字 u'パイソン' # パイソン 4 文字
ただし、ソースコードのデフォルトエンコーディングは 7bit-ASCII であるため、日本語文字を上記の形式で記述するには、最初の行もしくは2行目に エンコード宣言 が必要です。エンコード宣言は正規表現 coding[=:]?\s*([-\w.]?+) にマッチするように記述します。たとえば Emacs エディタが用いている次の形式が Python でも使用できます。
# -*- coding: euc-jp -*-
もしくはソースファイルを BOM 付の UTF-8 テキストで作成することで UTF-8 であると認識させることができます。
バックスラッシュがエスケープ文字として働く点は文字列リテラルと同じです。\u[16進数]? で任意の文字を表現することもできます。
u'\'' # ' 1 文字 u"\"" # " 1 文字 u'\\' # \ 1 文字 u'\n' # 改行 1 文字(正しくは LF) u'\u3042' # 16進数値 0x3042 を持つ文字、日本語の「あ」 1 文字
unicode 型はデータを保持するのに Unicode 文字セットを用いているため、 str 型のような Python 上の文字数と意味上の文字数との不一致が生じません。テキストデータを扱うときはこちらを用いるようにするとよいでしょう(ユニコードにまったく欠点が無いわけではないですが)。
文字列 (Python 3)
文字列リテラルは ' もしくは " で囲われた文字列です。 str 型に対応しています。
'abc' "abc"
Python 3 の str 型は Python 2 の unicode 型とほぼ同じもので、 Unicode 文字セットを用いています。
バイトリテラル (Python 3)
バイトリテラルは ' もしくは " で囲われた文字列に b もしくは B を接頭したものです。 byte 型に対応しています。
b'abc' b"abc"
Python 3 の byte 型は Python 2 の str 型とほぼ同じもので、バイト列です。
リスト
リスト表現は式を [] を囲んだものです。 list に対応しています。 Ruby における配列に相当します。
[1, 2, 3] # , で区切ることで複数の要素を記述する [0] # 要素が 1 つだけのリスト [] # 空リスト [4, 5, 6,] # 最後の , はあっても無くてもよい [ 'a', 'b', 'c', 'd', 'e', 'f', ] # カッコ内には改行を含めてもよい。このため複数行での記述が可能
タプル
丸括弧形式 (parenthesized form) は式を () を囲んだものです。 tuple に対応しています。タプルはリストに似ていますが要素の変更が不可能であること、不変ゆえにハッシュ可能である点が異なります。
(1, 2, 3) # , で区切ることで複数の要素を記述する
(0,) # 要素が 1 つだけのタプルを書くには , が必要
(0) # 意図したとおりにならない! これではただの整数 0 になってしまう。
# これは(0+1) * 2 といった演算順の指示に使われる括弧の意に取られるため
() # 空タプル
(4, 5, 6,) # 最後の , はあっても無くてもよい
(
'a', 'b', 'c',
'd', 'e', 'f',
)
# カッコ内には改行を含めてもよい。このため複数行での記述が可能
辞書
辞書表現は {} で囲われたキーと値のペアです。ペア間は : で区切ります。 dict に対応しています。 Ruby におけるハッシュに相当します。
{1: 2} # 要素が 1 つのみの辞書
{'a': 'b', 'c': 'd'} # 要素が 2 つの辞書
{} # 空の辞書
{
u'name': u'PythonRecipe',
u'url': u'http://lightson.dip.jp/zope/ZWiki/PythonRecipe',
u'info': u'『Ruby レシピブック』を Python で書くたくらみ',
}
# カッコ内には改行を含めてもよい。このため複数行での記述が可能