『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

変数と予約語

【Python】変数に値を代入する方法

一般にプログラミングでは、3.141593 のような数値や「今日は良いお天気ですね」というような文字列のデータを逐一そのままで記述することはほとんどありません。変数と呼ばれる名前のついた箱にデータを入れておくだけで、その箱の名前でデータを扱うことができるからです。たとえば pi と名づけた変数に円周率の値 3.141593 を入れておけば、この pi を円の面積や球の体積を求める計算に使うことができます。
 
Excel で描いた Python 変数の説明図
Python においては、変数の定義に特別な宣言は必要ありません。好きな名前の変数に代入演算子「=」でデータを格納すれば、新しい変数が生まれたことになります。変数 pi に円周率の値を、変数 r に半径 1.25 の値を入れて、円の面積(円周率 × 半径 の 2 乗)を求めてみます。Python では掛け算は * で、2乗は ** で実行するという決まりがあります。先頭に # の付いた灰色の行はコメント文なのでプログラムに影響を与えません。

# PYTHON_VARIABLE

# In[1]

# 円周率の値を変数piに入れる
pi = 3.141593

# 半径1.25を変数rに入れる
r = 1.25

# 円の面積を計算して変数sに入れる
s = pi * r ** 2

# 面積sを表示する
print(s)
# 4.9087390625

ここでは自分で円周率の値を定義しましたが、一般に Python による数値計算で円周率が必要な時には、math や numpy といった拡張モジュールの数学関数ライブラリから高精度の円周率の値を呼びだして計算に用います。そうした関数については別の記事で説明するので、ここで深くは立ち入りませんが、そのように呼びだされた値も変数として扱われます。たとえば、NumPy というモジュールを np という名前で読み込むと、円周率は np.pi という変数名で扱います。

# In[2]

# NumPyをnpという名前で読み込む
import numpy as np

# 半径1.25を変数rに入れる
r = 1.25

# 円の面積を計算して変数sに入れる
s = np.pi * r ** 2

# 面積sを表示する
print(s)
# 4.908738521234052

先ほどとは若干値が異なっていて、桁数も増えていますね。
もちろん、こちらのほうがずっと精度が高くなっています。
 
変数には数値以外にも文字列が入ることがあります。
2 つの変数 x と y に文章を入れて足してみます。

# In[3]

x = "おはようございます。"
y = "今日は良い天気ですね。"
print(x + y)
# おはようございます。今日は良い天気ですね。

文字列のデータは必ずクォーテーション (‘) かダブルクォーテーション (“) で囲みます
Jupyter NoteBook のようなエディタを使っている場合は、片側にクォーテーションを入れると自動的にもう片方が現れるようになっています。
 
変数は値を変えられます
だから「変数」とよばれているのです。
たとえば、先ほどのコードは次のように書き直すことができます。

# In[4]

x = "おはようございます。"
y = "今日は良い天気ですね。"
x = x + y
print(x)
# おはようございます。今日は良い天気ですね。

x に元々入っていたデータを破棄して新たに x と y を連結した文字列を入れています。
上のコードは複合代入演算子「+=」を使って、さらに洗練された書き方をすることができますが、それについては複合代入演算子の記事で改めて解説します。まずは変数の基本的な使い方に慣れてください。

変数の命名規則

変数の名前のつけかたには簡単なルールがあるので、下にまとめておきます。
 
数字から始まる変数は使えません
 たとえば、51_Ichiro というような変数は使えません。
 
・and や if など、Python の構文で用いられる 30 余りの 予約語 は使えません
 
大文字と小文字は区別されます
 たとえば、myword と myWord は別の変数として認識されます。
 
変数名にアンダースコアを使うことができます
 Pythonでは、単語をアンダースコアで結びつけるスネークケース (snake case) とよばれる記法が一般的です (例:my_word, real_numbers, total_count)。

こうしたルールを守るだけでなく、わかりやすいコードを書くための作法も大切です。たとえば、日本語を変数に使うこともできますが、Python のコードは様々な国の人が読む可能性があるので、公開するコードにアルファベット以外の文字を用いることはおすすめできません。
また、アルファベットは基本的に小文字を使うようにします。Python では慣習的に大文字で記述された変数を、値を変えない定数として決めておくことが多いからです。

【Python】keywordモジュールで予約語を調べる

上で述べたように、予約語(キーワード)を変数名として採用することはできません。標準ライブラリの keyword モジュールには Python における予約語(キーワード)の情報が収められています。

keyword.kwlist

keyword.kwlist で予約語の一覧を取得できます。

# PYTHON_KEYWORD

# In[1]

import keyword

# 予約語(キーワード)の一覧を取得
kw = keyword.kwlist

print(kw)
'''
['False', 'None', 'True', 'and', 'as', 'assert', 'async','await', 'break',
 'class', 'continue', 'def', 'del', 'elif','else', 'except', 'finally',
 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
'''

len() で予約語の数を調べると合計 35 個であることがわかります。

# In[2]

# 予約語(キーワード)の数を調べる
print(len(kw))
# 35

keyword.iskeyword()

keyword.iskeyword(s) は文字列 s が予約語リストに含まれているときに True を返します。

# In[3]

# awaitが予約語リストに含まれているかを確認する
x = keyword.iskeyword("await")

print(x)
# True

予約語リストに含まれていなければ False を返します。

# In[4]

# blogcatが予約語リストに含まれているかを確認する
x = keyword.iskeyword("blogcat")

print(x)
# False

コメント

  1. HNaito より:

    keywordモジュールのソースコード : keyword.py が紹介されていたので見てみたら、63行のコードの中で kwlist と iskeyword( ) に関係しているところは下記の 2 行だけでした。
     
    kwlist = [ . . . 35ヶのキーワード . . . ]   # ここで37行使われている
    iskeyword = frozenset(kwlist).__contains__
     
    モジュール名+変数でアトリビュートが呼び出せて、モジュール名+変数( ) でメソッドを関数として呼び出せる。type(keyword.iskeyword) で型を調べると、
     
    builtin_function_or_method
     
    時々関数の型を調べると、このような結果が返ってくることがあったのですが、モジュール内でこのような仕組みが使われていたからでしょうか。
    自分でも簡単なモジュール( py ファイル ) を作ってから import していろいろ試してみましたが、なるほどうまく作ったものだなと感心してしまいました。

    • あとりえこばと より:

       おっしゃるように、モジュール内の変数はモジュール名.変数、関数はモジュール名.関数で呼び出せます。たとえば、my_module.py に次のようなコードが書かれていたとします。
      ――――――――――――――――――――――
      # my_module.py
      a = 10
      def hello():
        print(‘Hello!’)
      ――――――――――――――――――――――
       このファイルをインポートすれば、a は変数なので、my_module.a で呼び出せます。
       hello() は関数なので、my_module.hello() で実行できます。
      ――――――――――――――――――――――
      import my_module
      print(my_module.a)
      my_module.hello()
      # 10
      # Hello!
      ――――――――――――――――――――――
       詳しいことは「Pythonスクリプトファイル」の記事に書いてあるので参考にしてください。
       keyword.py の一部を抜粋します。
      ――――――――――――――――――――――
      kwlist = [
      ‘False’,
      ‘None’,
      …]
      iskeyword = frozenset(kwlist).__contains__
      ――――――――――――――――――――――
       frozenset(kwlist) は list オブジェクト kwlist を frozenset 型に変換しています。__contains__ は、frozenset オブジェクト s について、任意の x が s のメンバーに含まれるかを判定する演算 x in s を定義する特殊メソッドです。すなわち、iskeyword はモジュール内の「変数」として定義されていますが、その中身は「関数オブジェクト」です。それで、keyword.iskeyword(s) は、kwlist に s が含まれているかを判定する関数として振る舞う仕組みになっています。def 構文を使わずに関数を定義する巧みな手法といえます。
       
       おっしゃるように、type(keyword.iskeyword) は builtin_function_or_method を返しますが、これは keyword がビルトインスコープ(一般的な自作モジュールの外側にある組み込み関数専用スコープ)に定義されているからです。自作モジュールの関数オブジェクトを type() で調べたら、class ‘function’ が返るはずです。

      • HNaito より:

        なるほど、自作モジュールの関数に対しては function が返ってきました。
        そしてクラスのインスタンスを作ってからクラスの関数の型を
         
        type(インスタンス.関数)
         
        で表示させると method が返ってきました。ビルトインの関数やメソッドの場合は、どちらも builtin_function_or_method と一括りで扱われているということですね。

  2. あとりえこばと より:

    【AI連載小説】羽村陽子のプログラミング日記(4)
     
    編集部のオフィスでは、陽子がPythonの基本に興味津々で学び始めていた。同僚たちもその成長ぶりに期待と応援の視線を送っていた。ある日、橋本が陽子のデスクに立ち寄り、新たな知識を教えてくれることになった。
    「陽子、Pythonでは変数っていうのが大切なんだよ。変数にデータを格納して使うことで、プログラムを柔軟に操ることができるんだ。」
    陽子は興味津々で橋本の話を聞いた。
    「変数ってどうやって使うんですか?」
    橋本はデスク上のホワイトボードに手を伸ばし、サンプルのコードを書きながら説明した。

    # 変数に値を格納する
    name = "陽子"
    age = 24
    height = 163.5
    
    # 変数を使って表示する
    print("名前:", name)
    print("年齢:", age)
    print("身長:", height)

    「こうやって変数にデータを入れて、それを使ってプログラムを組むんだ。名前、年齢、身長のような情報を変数に格納して、後から使えるようにしているんだ。」
    陽子は真剣な表情でコードを見つめ、
    「なるほど、これで情報を柔軟に取り扱えるんですね。でも、変数の名前はどうやって決めるんですか?」
    と質問した。橋本は微笑みながら続けた。
    「変数の名前は自由に決められるけど、予約語っていうのがあって、それは使えないんだ。」
    陽子は興味津々で聞き入っていた。
    「予約語って何ですか?」
    橋本はホワイトボードにいくつかの予約語を書きながら説明した。
    「これらはPythonが特別な意味を持つ単語で、変数の名前として使えないんだ。例えば、printやif、elseなどが予約語になるね」
    陽子は新しい知識を手に入れ、変数と予約語の使い方に興奮しながら、Pythonの世界への探求がますます深まっていくのであった。