以下の例では,入力と出力をプロンプト (">>
> " と "... ") の
有無で区別する。
だから,例を再現するには,君はなんであれプロンプトより後にあるものを,
プロンプトが現れているときに打鍵しなくてはならない。
プロンプトで始まらない行はインタープリタからの出力である。
例の中で二次プロンプトだけの行は, 君が空行を打鍵しなければならないことを意味することに注意しよう。 これは複数の行からなるコマンドを終わらせるために使われる。
このマニュアルにある例の多くは,対話プロンプトで入力されるものでさえ, コメントを含んでいる。 Python のコメントはハッシュ文字 "#" で始まり, 物理行の終わりまで続く。 コメントは行の先頭にも,空白やコードの後にも現れてよいが, 文字列リテラル (string literal) の内部に現れることはできない。 文字列リテラル内部のハッシュ文字はただのハッシュ文字である。
例:
# これは1番目のコメント SPAM = 1 # そしてこれは2番目のコメント # ... そしてこれは3番目! STRING = "# これはコメントではない。"
簡単な Python コマンドを試してみよう。インタープリタをスタートさせ,
一次プロンプト ">>
> " が現れるのを待とう。(長くはかからないはずだ)
インタープリタは単なる電卓のように振舞う。
つまり,君がインタープリタに式を打鍵すると,インタープリタがその値を書く。
式の構文は素直だ。
演算子 +
, -
, *
, /
は (Pascal や C など) ほかの
大多数の言語と同じように働く。かっこはグループ化のために使うことができる。
たとえば,
>>> 2+2 4 >>> # これはコメント ... 2+2 4 >>> 2+2 # そしてこれはコードと同じ行にあるコメント 4 >>> (50-5*6)/4 5 >>> # 整数の除算は floor (実数の解を越えない最大の整数) を返す: ... 7/3 2 >>> 7/-3 -3
C と同じく,等号 ("=") は変数へ値を代入するために使われる。 代入値は書かれない。
>>> width = 20 >>> height = 5*9 >>> width * height 900
いくつもの変数へ一つの値を同時に代入することもできる。
>>> x = y = z = 0 # x と y と z を零にする >>> x 0 >>> y 0 >>> z 0
浮動小数点数もフルにサポートされている。 混合型のオペランドをもつ演算子は,整数オペランドを浮動小数点数に変換する。
>>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.5
複素数もサポートされている。 虚数は接尾辞 "j" または "J" を付けて書かれる。 非零の実部をもつ複素数は "(real+imagj)" と書かれるか, または "complex(real, imag)" 関数で造られ得る。
>>> 1j * 1J (-1+0j) >>> 1j * complex(0,1) (-1+0j) >>> 3+1j*3 (3+3j) >>> (3+1j)*3 (9+3j) >>> (1+2j)/(1+1j) (1.5+0.5j)
複素数はいつも実部と虚部の二つの浮動小数点数として表現される。
複素数 z から
実部と虚部を取り出すには z.real
と z.imag
を使う。
>>> a=1.5+0.5j >>> a.real 1.5 >>> a.imag 0.5
浮動小数点数や整数への変換関数 (float(), int(),
long()) は複素数には働かない -- 複素数を実数に変換する
唯一の正しい方法というものはない。
絶対値 (magnitude) を (浮動小数点数として) 得るには abs(z)
を
使い,実部を得るには z.real
を使う。
>>> a=3.0+4.0j >>> float(a) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: can't convert complex to float; use e.g. abs(z) >>> a.real 3.0 >>> a.imag 4.0 >>> abs(a) # sqrt(a.real**2 + a.imag**2) 5.0 >>>
対話モードでは,最後に印字された式が変数 _
に代入される。
これにより,Python を電卓として使う時,連続した計算が多少楽になる。
たとえば,
>>> tax = 12.5 / 100 >>> price = 100.50 >>> price * tax 12.5625 >>> price + _ 113.0625 >>> round(_, 2) 113.06 >>>
利用者はこの変数を読取り専用として扱うべきである。 これへ値を陽に代入してはならない -- そんなことをすれば, 同じ名前をもった別個のローカル変数が造られ, 魔法の振舞をもった組込み変数が隠されてしまう。
数のほかに,Python は文字列も操作できる。 文字列はいくつもの方法で表現できる。 文字列はシングルまたはダブルのクォートで囲まれる。
>>> 'spam eggs' 'spam eggs' >>> 'doesn\'t' "doesn't" >>> "doesn't" "doesn't" >>> '"Yes," he said.' '"Yes," he said.' >>> "\"Yes,\" he said." '"Yes," he said.' >>> '"Isn\'t," she said.' '"Isn\'t," she said.'
文字列リテラルはいくつもの方法で複数行にまたがる事ができる。 次の行が論理的に継続した行である事を表すバックスラッシュを行の最後に記 述する事で行の継続ができる。3.1,
hello = "This is a rather long string containing\n\ several lines of text just as you would do in C.\n\ Note that whitespace at the beginning of the line is\ significant." print hello
改行する場合は \n
の文字を記述する必要がある。
改行に続くバックスラッシュは捨てられる。この例では下記を印字する事になる。
This is a rather long string containing several lines of text just as you would do in C. Note that whitespace at the beginning of the line is significant.
しかし,文字列リテラル ``raw'' 文字列を作成すると,\n
は改行に
変換されないし,行の最後のバックシュラッシュ,ソース中の改行文字の両方
は文字データその物として含まれる。例えば
hello = r"This is a rather long string containing\n\ several lines of text much as you would do in C." print hello
これは下記を印字する。
This is a rather long string containing\n\ several lines of text much as you would do in C.
または,対になった
三重クォート """
または '
で文字列を囲むこともできる。
三重クォートを使ったときは,行末をエスケープする必要はないが,
それら行末も文字列に含まれることになる。
'
'
print """ Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to """
は下記の出力を生成する。
Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to
インタープリタは文字列演算の結果を, 文字列が入力のために打鍵されるのと同じ形式で印字する。 つまり,正確な値を表示すべく,クォートで囲み, クォート自身やその他の奇妙な文字をバックスラッシュでエスケープする。 もし文字列がシングル・クォートを含み,ダブル・クォートを含まないならば, 文字列はダブル・クォートで囲まれるが, そうでなければシングル・クォートで囲まれる。 (後述の print 文を使えば,クォートやエスケープなしに文字列を 書くことができる)
文字列は +
演算子で連結させる (くっつけ合わす) ことができ,
*
演算子で反復させることができる。
>>> word = 'Help' + 'A' >>> word 'HelpA' >>> '<' + word*5 + '>' '<HelpAHelpAHelpAHelpAHelpA>'
互いに隣あった二つの文字列リテラルは自動的に連結される。 したがって,上記の最初の行は "word = 'Help' 'A'" と書くこともできた。 ただし,これは二つのリテラルにだけ働くのであって, 任意の文字列式に働くわけではない。
>>> import string >>> 'str' 'ing' # <- これは ok 'string' >>> string.strip('str') + 'ing' # <- これは ok 'string' >>> string.strip('str') 'ing' # <- これはダメ File "<stdin>", line 1, in ? string.strip('str') 'ing' ^ SyntaxError: invalid syntax
文字列は添字付け可能であり,C と同じく,文字列の最初の文字の 添字 (subscript ないし index) は 0 である。 独立した文字型というものはなく, 文字 (character) はサイズ 1 の文字列 (string) にすぎない。 Icon と同じく,部分文字列はスライス記法 (slice notation), つまりコロンで分けた二つの添字で指定できる。
>>> word[4] 'A' >>> word[0:2] 'He' >>> word[2:4] 'lp'
C の文字列と異なり,Python の文字列は変更できない。 文字列内の添字付けられた位置への代入はエラーになる。
>>> word[0] = 'x' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support item assignment >>> word[:1] = 'Splat' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support slice assignment
しかし,組み合わせた内容をもつ新しい文字列を造ることは簡単で効率的である。
>>> 'x' + word[1:] 'xelpA' >>> 'Splat' + word[4] 'SplatA'
スライス添字には便利なデフォルト値がある。 第1の添字を省略すると,0 と見なされる。 第2の添字を省略すると,スライスされる文字列のサイズと見なされる。
>>> word[:2] # 最初の2文字 'He' >>> word[2:] # 最初の2文字を除くすべて 'lpA'
スライス演算には便利な不変式がある: s[:i] + s[i:]
は s
に等しい。
>>> word[:2] + word[2:] 'HelpA' >>> word[:3] + word[3:] 'HelpA'
外道なスライス添字は,たしなみよく取り扱われる。 すなわち,大きすぎる添字は文字列のサイズに置き換えられ, 上限が下限より小さいときは空文字列が返される。
>>> word[1:100] 'elpA' >>> word[10:] '' >>> word[2:1] ''
添字は負の数でもよい。そのときは右から数える。たとえば,
>>> word[-1] # 最後の文字 'A' >>> word[-2] # 最後から二つめの文字 'p' >>> word[-2:] # 最後の2文字 'pA' >>> word[:-2] # 最後の2文字を除くすべて 'Hel'
だが -0 は 0 と実際のところ同一であり,したがってこのときは 右から数えるわけではないことに注意しよう!
>>> word[-0] # (-0 は 0 に等しいから) 'H'
範囲外の負数のスライス添字は切り捨てられる。 しかし,これを単一要素の (スライスでない) 添字で試みてはいけない。
>>> word[-100:] 'HelpA' >>> word[-10] # エラー Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
スライスの働きかたをおぼえる最も良い方法は, 添字が文字と文字のあいだ (between) を指していると考え, 先頭文字の左端を 0 と数える方法である。 このとき,n 文字の文字列の最後の文字の右端が添字 n になる。 たとえば,
+---+---+---+---+---+ | H | e | l | p | A | +---+---+---+---+---+ 0 1 2 3 4 5 -5 -4 -3 -2 -1
第1の行の数は文字列の添字 0...5 の位置を示し, 第2の行は対応する負の添字を示す。 i から j までのスライスは, それぞれ i, j と位置付けられた端と端のあいだの文字すべてからなる。
スライスの添字がともに非負で,ともに文字列の範囲内にあるならば,
スライスの長さはその添字の差に等しい。
たとえば word[1:3]
の長さは 2 である。
組込み関数 len() は文字列の長さ (length) を返す。
>>> s = 'supercalifragilisticexpialidocious' >>> len(s) 34
Python 2.0 以降,テキスト・データを格納するための新しいデータ型が プログラマに利用可能になった。それが Unicode オブジェクトである。 これは Unicode データ (http://www.unicode.org/ 参照) を格納し, 操作するために使用できるとともに,必要なところで自動変換を用意して, 既存の文字列オブジェクトと上手く統合している。
Unicode には,現代および古代のテキストで使われたあらゆるスクリプトの あらゆる文字にそれぞれ一つの順序数を与える,という利点がある。 以前は,スクリプト文字に対し高々 256 個の順序数しかなく, テキストは典型的には 順序数をスクリプト文字へ写像するどれか1個のコードページに束縛されていた。 このことはとりわけソフトウェアの国際化 (internationalization, 普通 "i18n" と書かれる -- "i" + 18 文字 + "n") に 関して非常に大きな混乱をもたらした。 Unicode はこれらの問題を,すべてのスクリプトに対して唯一のコードページを 定義することで解決する。
Python で Unicode 文字列を造ることは, 通常の文字列を造ることと同じくらい簡単だ。
>>> u'Hello World !' u'Hello World !'
クォートの前にある小文字の "u" が Unicode 文字列を造ることを示す。 もし文字列の中に特殊な文字を含めたければ, Python の Unicode-Escape エンコーディングを使ってそうすることが できる。 下記の例はその方法を表している。
>>> u'Hello\u0020World !' u'Hello World !'
エスケープ列 \u0020
は
順序数の値 0x0020 の Unicode 文字 (スペース文字) を与えられた位置に
挿入することを示す。
他の文字はそれぞれの順序数の値をそのまま Unicode の順序数として使うことに よって解釈される。 もしも君のもっているリテラル文字列が 多くの西洋諸国で使われている標準 Latin-1 エンコーディングならば, Unicode の下位 256 文字が Latin-1 の 256 文字と同じであることを, 君はきっと便利だと思うだろう。
エキスパート向けに,通常の文字列の場合と同じく raw モードもある。
文字列のはじめのクォートに 'ur' を接頭して,
Python に Raw-Unicode-Escape エンコーディングを使わせる。
これは小文字の 'u' の前に奇数個の逆スラッシュがあるときだけ
上記の \uXXXX
変換を適用する。
>>> ur'Hello\u0020World !' u'Hello World !' >>> ur'Hello\\u0020World !' u'Hello\\\\u0020World !'
raw モードは,正規表現を記述する時などの沢山のバックスラッシュを入力し なければならないとき最も役に立つ。
これら標準のエンコーディングに加えて,Python は, 既知のエンコーディングに基づいて Unicode 文字列を造る一連の手段を提供している。
組込み関数 unicode() はすべての登録されている Unicode codec (COder and DECoder, 符号化器および復号化器) へのアクセスを提供する。 これらの codec が変換することのできるエンコーディングのうち, よく知られているものには, Latin-1, ASCII, UTF-8 および UTF-16 がある。 後者二つは可変長のエンコーディングであり, 各 Unicode 文字を1バイトまたは複数バイトに格納する。 デフォルト・エンコーディングは通常は ASCII にセットされている。 これは 0 から 127 までの範囲の文字を通過させ, 他の文字はすべて受理せずエラーとする。 Unicode 文字列が印字されたり,ファイルに書き込まれたり, str() で変換されるときには, このデフォルト・エンコーディングを使った変換が行われる。
»> u"abc"
u'abc'
»> str(u"abc")
'abc'
»> u"äöü"u'\xe4\xf6\xfc'
»> str(u"äöü")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)
Unicode 文字列を, 特定のエンコーディングを使った8ビット文字列へ変換するために, Unicode オブジェクトは encode() メソッドを用意している。 これは1引数をとる。引数はエンコーディング名である。 エンコーディング名には小文字を使うのが望ましい。
»> u"äöö".encode('utf-8')'\xc3\xa4\xc3\xb6\xc3\xbc'
もしも特定のエンコーディングで書かれているデータから, それに対応する Unicode 文字列を生成したいならば, unicode() 関数を,第2引数にエンコーディング名を与えて使えばよい。
>>> unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8') u'\xe4\xf6\xfc'
Python は,別々の値を一緒にしてグループ化するために 使う複合 (compound) データ型を数多く備えている。 その最も汎用的なものがリスト (list) である。 リストは,かぎかっこに囲まれ, コンマで分けられた値 (項目) の並びとして書かれる。 リストの各項目は必ずしもすべて同じ型でなくてもよい。
>>> a = ['spam', 'eggs', 100, 1234] >>> a ['spam', 'eggs', 100, 1234]
文字列の添字と同じく,リストの添字は 0 から始まる。 スライスや連結ができることなども文字列と同様である。
>>> a[0] 'spam' >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['eggs', 100] >>> a[:2] + ['bacon', 2*2] ['spam', 'eggs', 'bacon', 4] >>> 3*a[:3] + ['Boe!'] ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boe!']
変化不可能 (immutable) な文字列とは異なり, リストは個々の要素を変更することが可能である。
>>> a ['spam', 'eggs', 100, 1234] >>> a[2] = a[2] + 23 >>> a ['spam', 'eggs', 123, 1234]
スライスへの代入も可能である。 そしてこれはそのリストのサイズを変更させることさえできる。
>>> # いくつかの項目を置換する: ... a[0:2] = [1, 12] >>> a [1, 12, 123, 1234] >>> # いくつかの項目を除去する: ... a[0:2] = [] >>> a [123, 1234] >>> # いくつかの項目を挿入する: ... a[1:1] = ['bletch', 'xyzzy'] >>> a [123, 'bletch', 'xyzzy', 1234] >>> a[:0] = a # それ自身 (のコピー) を先頭に挿入する >>> a [123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
組込み関数 len() はリストにも適用できる。
>>> len(a) 8
リストを入れ子にする (ほかのリストを含むリストを造る) ことも可能である。 たとえば,
>>> q = [2, 3] >>> p = [1, q, 4] >>> len(p) 3 >>> p[1] [2, 3] >>> p[1][0] 2 >>> p[1].append('xtra') # 5.1節を見よ >>> p [1, [2, 3, 'xtra'], 4] >>> q [2, 3, 'xtra']
最後の例で p[1]
と q
が実際には同一のオブジェクトを
参照していることに注意しよう!
オブジェクトの意味論についてはまた後で立ち戻ることにする。
もちろん,私たちは Python を 2 足す 2 よりも複雑な仕事のために 使うことができる。 たとえば,私たちは Fibonacci 級数の最初の部分列を次のように書くことが できる。
>>> # Fibonacci 級数: ... # 二つの要素の和が次の要素を定義する ... a, b = 0, 1 >>> while b < 10: ... print b ... a, b = b, a+b ... 1 1 2 3 5 8
この例は,いくつかの新しい機能を導入している。
a
と b
は同時に新しい値 0 と 1 を得ている。
最後の行にも多重代入が使われているが,それを見て分かるとおり,
代入が行われるのは右辺の複数の式がすべて評価されてからである。
右辺の複数の式は,左から右へと評価される。
b < 10
) が真である限り
実行される。
Python では,C と同じく,非零整数値は真であり,零は偽である。
条件は文字列値やリスト値であってもよく,実際どんな列であってもよい。
その場合,非零の長さならば真であり,空列ならば偽である。
例で用いられたテストは単純な比較である。
標準の比較演算子は C と同じように書かれる。すなわち,
<
(less than),
>
(greater than),
==
(equal to),
<=
(less than or equal to),
>=
(greater than or equal to) および !=
(not equal to) である。
>>> i = 256*256 >>> print 'The value of i is', i The value of i is 65536
末尾のコンマは,出力後の改行を防ぐ。
>>> a, b = 0, 1 >>> while b < 1000: ... print b, ... a, b = b, a+b ... 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
最後の行が完了していないとき,インタープリタは一つ改行を書き込んでから 次のプロンプトを印字することに注意しよう。