リテラルと変数

IPython シェルを起動してください

$ ipython

リテラル表記

これからたくさんの文字(列)や数字や, もっと複雑な構造を持った対象 (オブジェクト) を操作することになります. すべてのオブジェクトは「型」と呼 ばれる情報を持っていて, そのオブジェクトに対して許される操作が決まっています.

基本的なオブジェクトには「リテラル」と呼ばれる表記法があり, 簡便な記法によってオブジェクトを作ることができます. 文字列のリテラル, 整数の リテラル, 小数のリテラル, 複素数のリテラルなどがこのテキストで使う中でもっとも基本的なものです.

文字(列)を引用符 (" ... " or ' ... ')で囲んだものが文字列リテラルです. 引用符の中に引用符を入れたい場合は, 種類の異なる引用符を 使って囲みます.

In [1]: 'This is a string literal.'
Out[1]: 'This is a string literal.'

In [2]: "This is also a string literal."
Out[2]: 'This is also a string literal.'

In [3]: "This is a 'nested' quatation mark."
Out[3]: "This is a 'nested' quatation mark."

数字 (整数, 小数, 複素数) のリテラルは自明なものです. 虚数部分を 1j, 2j (あるいは, 1J, 2J) のように書くことに注意してください. 1j の代わりに j とすることはできません.

In [4]: 10
Out[4]: 10

In [5]: -10
Out[5]: -10

In [6]: 10 * 2
Out[6]: 20

In [7]: 1.2
Out[7]: 1.2

In [8]: 10+1j
Out[8]: (10+1j)

上で挙げた表記は特定の型のオブジェクトを生成しています. type() 関数を使って確認しておきましょう.

In [9]: type("This is another string")
Out[9]: str

In [10]: type(10)
Out[10]: int

In [11]: type(1.1)
Out[11]: float

In [12]: type(1-1j)
Out[12]: complex

このように, ある特定の型のオブジェクトを生成するための簡便な表記法を**リテラル**と呼びます. 他の型でもこのような表記法を利用できるものが あります. 組み込み型 <> のセクションで解説します.

変数

Python における変数は「特定のオブジェクトに対するラベル」のことです. 例えば,

In [13]: x = 10

と書けば, 10 という整数型のオブジェクトが生成され, そのオブジェクトに対して x というラベルを付けることになります. 変数はオブジェクトに対する 参照 であるとも言われます. 基本的な書き方は次のとおりです.

[変数名] = [オブジェクト]

変数名は, 大文字小文字を区別することに注意してください. 変数名として使用できる文字, パターンについて次節を参照してください.

によって, [オブジェクト] を [変数名] で呼び出すことができるようになります.

上のような操作を 代入 という風にいうこともあります. なんと呼ぼうと自由ではあるのですが, 「変数 x10 という数字を代入する」 という考え方では思わぬ間違いにつながることもありますので注意が必要です. これについては組み込み型のひとつである `リスト <>`_ を解説する際に 説明します.

変数が参照しているオブジェクトがどんなものかを調べるためには,

In [14]: print(x)
10

とするか, もっと簡単に,

In [15]: x
Out[15]: 10

とします. インタラクティブシェルで変数名を呼び出すと, そのオブジェクトの文字列表現が画面に出力されます.

変数はいつでも参照先を変更することができます. Python では実行中に変数の型が変わってもかまいません. このような性質を 動的型付け (Dynamic Typing) と呼びます. 変数を作るときに型を決める必要がある言語仕様を 静的型付け (Static Typing) といいます. 動的型付け 言語では, 次のような操作が許されます.

In [16]: y = "This is a string"

In [17]: type(y)
Out[17]: str

In [18]: y = 1

In [19]: type(y)
Out[19]: int

In [20]: y = 1.2

In [21]: type(y)
Out[21]: float

Python のように参照先の型を変えられるという性質にはデメリットもあります. コードが期待している型と, 実際に入力された型が異なる場合には もちろんコードは正しく動きません. このような場合に静的型付け言語では実行する前にエラーになりますが, 動的型付け言語では実行してみないとエラー であると判定されません. ひょっとすると実行しても結果を見るまでエラーとは分からないかもしれません. 動的型付けの自由度の高さを活かすためには, 注意深くコーディングする必要があります.

最後に, Python では複数の変数を同時に代入することができます.

In [22]: a, b, c = 1, -0.5, 1 - 0.5j

In [23]: a
Out[23]: 1

In [24]: b
Out[24]: -0.5

In [25]: c
Out[25]: (1-0.5j)

このテクニックを変数を入れ替えたいときに使うことができます.

In [26]: a, b = b, a

In [27]: a
Out[27]: -0.5

In [28]: b
Out[28]: 1

有効な名前

変数名にかぎらず, 関数, クラス, モジュールその他, 名前が付くもの (オブジェクト) の名前には一定のルールがあります. 基本的なルールは, アルファベットの大文字・小文字, _ (アンダースコア) と数字からなる文字の並びで, 最初の文字が数字でなくてはいけません.

したがって, 次のような名前は使うことが出来ますが

In [29]: data_2014 = []

In [30]: data_2014
Out[30]: []

次のような名前は認められません.

In [31]: 2014_data = []
  File "<ipython-input-31-7edfdf502948>", line 1
    2014_data = []
            ^
SyntaxError: invalid syntax

Python 3 では一部のUnicode文字を名前に使うことができるようになりました.

In [32]: , ,  = 100, 0, 0

In [33]:  +  + 
Out[33]: 100

漢字を使うことは滅多にないかもしれませんが, ギリシャ文字などを使うことで数式とコードの対応関係が明確になり可読性を高めるかもしれません.

In [34]: μ, σ2 = 0.0, 1.0

上記の命名規則にしたがっていたとしても, いくつかの名前は使うことができません. また, いくつかの名前は使うべきではありません.

予約語

次に挙げる名前はPythonインタプリタによって確保されていますので, これらの名前は使うことはできません.

False      class      finally    is         return
None       continue   for        lambda     try
True       def        from       nonlocal   while
and        del        global     not        with
as         elif       if         or         yield
assert     else       import     pass
break      except     in         raise

予約語に挙げられていませんが, __debug__ という名前も使うことができません.

組み込み定数

NotImplemented   Ellipsis

はPythonインタプリタが定めた定数です. これらを名前にするできではありません.

この2つと False, True, None, __debug__ の6つは組み込み定数と呼ばれています.

組み込み関数と組み込み例外, 標準ライブラリ

組み込み関数と呼ばれている, いくつかの関数があります. 例えば print() 関数は, 標準出力 (画面) に文字を出力する基本的な関数です. Python ではこのような関数名もラベルとして使用することができます. しかし, 実際に

In [35]: print = 0

といった代入を行なったとしたらどうでしょうか? その後のコードはもはや暗号です. あなたのコードを読む人 (例えば1週間後のあなた) の期待を裏切るような命名・代入は避けるべきです.

標準で使用されている名前を使う場合には, その必然性をよく考えてからにしましょう.