Pythonを勉強するために本を買ったけど,積読してる.
最初の方の数値や算術演算,文字列,変数で止まっている.
= が「等しい」という意味ではないことや,
変数に「直接」値を入れてるわけではない!?ことを
受け入れられない,または知らない.
だからこそ,変数の概念的な部分も学びたい.
そんな方が,変数を基礎から理解して,安心して関数やリストの学習に進むための記事です.
本記事の内容
プログラミングで重要な概念の1つである変数について解説します.変数の概念を理解していないと、今後の学習理解に支障が出るので、必ず最後まで読んでいただけると幸いです.解説が多めの記事ですが,これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
Pythonの文法基礎から実務的な分析・機械学習まで学べるオンライン学習サービス(1週間無料です)
変数とは
メモリ上のデータを,名前のついた「変数」に紐付ける仕組みです.一般的なイメージは,図1のように,箱(変数)に名前(変数名)をつけて,データの値を出し入れできるという理解で良いでしょう.(実はそうではないことを変数の性質で解説します.)
ここでは,「100」という整数の値を「number」という名前のついた箱に,「”文字列やで”」という文字列の値を「phrase」という名前のついた箱に入れています.また,変数にはどのような型のデータでも代入することが可能です.
変数の定義(書き方)
「=」を挟んで,変数を左,値を右に置き,変数を定義します.
この構文を代入文と呼んでいます.「=」は代入演算子(後述表2)の1つです.小学校で,「=」は「等しい」という意味として習いましたね.しかし,Pythonでは,「=」は「等しい」という意味ではなく,「右辺を左辺に代入する」という意味です.
図2のように,値を入れることを代入,出すこと(出力すること)を参照と呼びます.(概念から考えると「代入」ではなく,「割り当て」という言葉が適切なのですが…(後述))
変数を代入,参照してみましょう.
number = 100 # numberという変数に値を代入する.この時点で実行しても何も出力されない. number # 実行すると,numberに入れた100が出力される.
phrase = "文字列やで" # phraseという変数が値を代入する.この時点で実行しても何も出力されない. phrase # 実行すると,phraseに代入した'文字列やで'が出力される.
phase[0:2] # インデックスを使って参照できる.
変数の利点
では、このような書き方にどのような利点があるのでしょうか?
- 同じデータを繰り返し利用できる.
- 長いデータであっても,短いコードで表現できる.
- 名前をつけることで,何のデータか分かりやすくなる.
- 値の変更が必要な場合,変数が同じであれば,変更箇所が1か所で済む.
算術演算を用いた例
数値や文字列による算術演算を例に,変数を使ってみましょう.
num_a = 1 num_b = 2 num_c = 56 num_a + num_b * num_c / (num_b**num_b) # 変数で計算式1 + 2 * 56 / ( 2 ** 2 )を表す.
phrase_a = 'い〜つの日〜か〜' phrase_b = "I’ll be there " # thereの直後に半角スペースがあります. phrase_a + phrase_b * 3 # 文字列を代入した変数をクォーテーションで囲む必要はありません
name = 'tokkuri' # ご自身のお名前に変えて試してみてね 'こんにちは.'+ name + 'です.'
'日本酒を' + name + 'で飲みます' # 前後の文字列を変えてみてね
radius = 10 # radius:球の半径(cm) area = 4 * 3.14 * radius ** 2 / 100 # area:球の表面積(cm2) volume = 4 * 3.14 * radius ** 3 / 3 /1000 # volume:球の体積(cm^3) print('球の表面積 =',area, 'cm2', '球の体積 =',volume, 'cm3')
ここでは数行でしたが,行数が多いコードやデータが複雑な場合,変数として定義しておけば,繰り返し使用しやすく,かつ短く済むので非常に便利です.
変数のデータ型確認方法
整数,浮動小数点数,複素数,文字列などのオブジェクトには,型がありました.変数に入れたオブジェクトの型を調べるには,type()関数を使います.()内に変数を入力すると,(代入されている値の)データ型が出力されます.関数のことを詳しく説明していないので,ここではこのようなコードで確認するんだなくらいの理解で結構です.
type(number)
type(phrase)
変数のルール
好きな変数名をつけれそうですが,どんな名前にしても良いわけではありません.
変数名の付け方のルール
- 大文字と小文字の英字を使用できる.
- 数字を使用できる.
- アンダースコア(_)を使用できる.※
- 先頭に数字を使用できない.
- 予約語(例えば、def, if, while, forなど)を使用できない.
※ スネークケースと呼ぶ.英語の複合語やフレーズ,文を一語に繋げて表記する際に,単語間のスペース(空白文字)をアンダースコア(_)に置き換える方式.HTMLなどはハイフンで繋ぐケバブケース.
pythonの予約語を確認してみる
関数の定義(def)や,制御構文(if, while, for)などのように,pythonで既に用途が決まっている語を予約語と呼びます.下記のコードを実行すると,予約語の一覧が出力されます.
import keyword print(keyword.kwlist)
この35個の予約語は,変数に使用できません.
分かりやすい変数名にするポイント
ルールを理解していただいたところで,命名のポイントを列挙します.
- できるだけ英語を使う.
- プログラム上での意味に見合った命名
- 複数の単語を使うときは,アンダースコアで区切る.
- l, o, O (小文字のエル,小文字のオー,大文字のオー)は, 1(いち)や 0(ゼロ)と間違いやすいので使わない.
これらのポイントをもとに、良い変数と悪い変数の例を表1に示します.
表1.変数の良い例,悪い例
◯良い例 | ×悪い例 |
---|---|
phrase | moji |
number | suuji |
name_first | 3python |
num_a | num_ |
py_name | py-name |
変数の性質|変数は参照手段である
変数はただの名前だ.〜中略〜 名前はものの参照手段であり,もの自体ではない.名前は,メモリ内のどこか別の場所にあるオブジェクトの箱に長い糸でつながっているタグである.(入門Python3)
変数とはで,「メモリ上のデータを,名前のついた「変数」に紐付ける仕組みです.」と述べました.「紐付ける」とはいったいどういうことかを解説します.これまで入出力してもらったコードでは,あたかも変数そのものに値が代入されていたように見えたかもしれませんが,実は違います.
Pythonでは,数値や文字列を「オブジェクト」と考える話を数値の記事で簡単に解説しました.このオブジェクトは,メモリ内のどこかに保管されています.変数は直接,オブジェクトそのものを持っているのではなく,オブジェクトがどこにあるのかというメモリ内の所在情報を有しています.その所在情報を関数id()で調べることができます(図3).
以上について,初学者はあまり気にしなくて良いですが,重要なことなので頭の隅に置いておいてください.この性質を理解してもらうために,同じ値を別の変数へ代入したり(コピー),または,異なる値が代入された変数へ代入したり(再代入)して,所在情報の変化を確認しましょう.
num_d = 10 num_d
コピー
num_e = 10 num_e
num_d + num_e
id(num_d)
id(num_e)
ここで重要なのは,「値がコピーされたわけではない」ということです.num_dと,num_eが,ともに「10」というオブジェクトの,メモリ内の場所を参照するようになったのです.id()関数で所在情報を確認すると同じ参照先が出力されます.変数が直接「オブジェクト(ここでは10)」を持っているのではなく,オブジェクトがどこにあるかという所在の情報を有していることが分かります.
再代入
num_d = 20 # num_dを10から20に再代入 num_d # 実行すると,num_dが20に再代入されたことが分かる
num_d + num_e
id(num_d)
id(num_e)
num_dが,「10」ではなく,「20」という新しいオブジェクトのメモリ内の場所を参照するようになります.id()関数でnum_dの所在情報を確認すると参照先が変わっているのが分かります.
日本語では「代入」と呼んでいますが,概念から考えると「代入」ではなく,「割り当て」という言葉が適切なのがわかります.
累積代入文
ある変数に対して,一定数を累積的に演算する場合があります.例えば,こちらのような演算です.先ほどの「再代入」と同じ理屈でプログラムが動いています.
x = 10 x = x + 1 x
x = x + 1 x
数学的に見ると間違っていますが,「=」は「右辺を左辺に代入する」,すなわち「割り当てる」という意味なので,右辺に左辺と同じ変数があってもかまいません.
このような演算を以下のような累積代入文を使って,より簡潔に記述できます.表2のように,= の手前に算術演算子を入れて,演算と代入を結合させた代入演算子を使う方法です.
演算 | 演算子 |
---|---|
x = y | = |
x = x + y | += |
x = x – y | -= |
x = x * y | *= |
x = x / y | /= |
x = x // y | //= |
x = x % y | %= |
x = x ** y | **= |
分かりやすいように変数xの値を都度定義し直したコードで計算してみましょう.
x = 10 x += 1 # x = x + 1と同じ意味 x
x = 10 x -= 1 # x = x - 1と同じ意味 x
x = 10 x *= 10 # x = x * 10と同じ意味 x
x = 10 x /= 5 # x = x / 5と同じ意味 x
x = 100 x //= 3 # x = x // 3と同じ意味 x
x = 100 x %= 3 # x = x % 3と同じ意味 x
x = 100 x **= 3 # x = x ** 3と同じ意味 x
変数の扱い方と,変数の概念的な部分まで学べましたでしょうか?
次は「関数とメソッド」について学びましょう!
最後まで読んでくださり,ありがとうございます☺️