1. プログラムで数と文字を扱ってみよう¶
この章からはいよいよプログラムを書きます。 まずは数や文字をプログラムで扱えるようになりましょう。
コマンドラインから、Python処理系を対話モードで立ち上げましょう。
1.1. 数値¶
1.1.1. 初めてのプログラミング:対話モードに数値を入力¶
Pythonの処理系にプログラムを処理させましょう。
プロンプト(>>>
)の後に 5
と入力します。
数値1つですが、これも立派なプログラムです!
Enterキーを1回押してください。
入力した数値 5
が表示され、再度プロンプトが現れました。
「対話モードに 5
というプログラムを入力し、Enterキーを押す。処理系が処理した結果 5
と表示される」ことを、本の中では次のように表記します。
>>> 5
5
Pythonの処理系は数値を計算できますが、5
のようにそれ以上計算できない数値は、そのまま処理結果とします。
続いて 数式を入力 してみましょう。
1.1.2. 四則演算¶
数の足し算・引き算・掛け算・割り算を順に見ていきましょう。 4つをまとめて「四則演算」と言います。 人間が計算するのと同じ ように、プログラミングでも計算できます。
1.1.2.1. 足し算¶
5+7
と入力してEnterキーを1回押してみましょう。
>>> 5+7
12
Pythonの処理系が 5+7
というプログラムを処理し、足し算の結果である 12
が表示されました。
1.1.2.2. 引き算¶
今度は 33-4
と入力してEnterキーを押してみましょう(Enterキーの入力についてはこの後は省略します)。
>>> 33-4
29
引き算の結果の 29
が表示されていますね!
1.1.2.3. 掛け算¶
掛け算のプログラムは *
(アスタリスク)という記号を使います。
算数や数学で使う \(\times\) 記号とは違うことに注意しましょう。
>>> 9*3
27
\(9 \times 3\) という掛け算が計算されていますね。
1.1.2.4. 割り算¶
割り算も記号が異なります。
\(\div\) 記号ではなくて、/
(スラッシュ)という記号を使います。
>>> 7/2
3.5
割り算の結果は小数で求まります。 割り切れるときも小数です。
>>> 6/2
3.0
四則演算が必要になったら、プログラミングで計算してもいいですね。
1.1.3. 計算の順番¶
ここで問題です。 \(5 + 3 \times 4\) はいくつですか。
皆さんは掛け算が足し算より先に計算されると知っていますよね。 ですから、答えは17(\(= 5 + 12\))です。 プログラミング言語処理系も、掛け算を先に計算します。
>>> 5+3*4
17
それでは、5 + 3
という足し算を先にするにはどうすればいいでしょうか。
そうです、カッコ \(()\) を使って、\((5 + 3) \times 4\) のように書きますね。
プログラミングでも同じで、カッコに入れた足し算は、掛け算より先 に計算されます。
>>> (5+3)*4
32
ここまでで、プログラミングを電卓代わりに使えるようになりましたね。 胸を張っていい成果です。
1.1.4. 式を評価して計算結果を得る¶
プログラミングでも電卓のように計算できることは、あまり驚きがないかもしれません。
ですが、5+7
というプログラムが処理されて足し算の結果が求まることには、プログラミングの本質が凝縮しています。
ここで少しだけ掘り下げてみましょう。
四則演算に使った +
や -
、 *
、 /
の 記号 を「演算子」と呼びます。
そして、演算子を使ったプログラム (例えば 5+7
)を「式」と呼びます。
プログラミング言語の処理系に 5+7
のような式を入力すると、処理系は式を「評価」します。
評価した結果、\(5 + 7\) が 計算 され、計算結果が表示されます。
評価は、演算子の優先順位に沿います。
5+3*4
という式は、まず 3*4
が評価されます(その結果は 12
ですね)。
次に 5+12
が評価され、17
という計算結果が表示されます。
プログラミングの本質とは、プログラミング言語処理系が式を評価する ことです。 今の段階ではこのことだけ押さえておいてください。 これから先、演算子を使わない式も紹介しますが、式が評価されるというのは共通です。お楽しみに!
1.1.5. 練習問題¶
日常生活を題材に、電卓代わりにプログラミングを使う練習をしましょう。
ある日nikkieは昼休みにコンビニで、279円のサンドイッチと100円の惣菜パンを買いました。 頭が疲れたときの息抜き用に120円の菓子パンも買いました。 消費税率を8%としたとき、合計金額はいくらでしょう。
[解答]
税抜価格の合計を求めてから、消費税を加算します。
>>> (279 + 100 + 120) * (1 + 0.08)
538.9200000000001
金額の端数部分(小数部分)ですが、 消費税の端数の扱いは切り捨てが多いので、ここでも切り捨てることとします。 合計金額は 538円 です。
例えば家計簿など、たびたび行う計算にプログラミングを使ってみると、身に付けやすいでしょう。 試したいことが浮かんだら、本から離れて大丈夫ですので、どんどん試してみてください。
[コラム] 式に半角スペースを入れてもいい?
ここで式の「書き方」について補足します。 演算子の前後に半角スペースを1つずつ入れても、評価結果は変わりません。
>>> 5 + 7
12
半角スペースを2つ以上入れても、評価結果は変わりません(3つずつ入れてみた例)。
>>> 5 + 7
12
半角スペースの有無や数の違いがあったとしても、式を評価した結果は変わりません。 プログラミング言語処理系にとっては、式に含まれる半角スペースの数は重要ではないのです。
この本では、演算子の前後に 半角スペースを1つずつ 入れます。
[コラム] 式に半角スペースを入れるのはなぜ?
式に半角スペースを入れる理由は、私たちプログラマーにとって読みやすくするため です。
5 + 7
のように演算子の前後に半角スペースを1つずつ入れることで、式が見やすくなります。
Pythonを書くプログラマーの多くは、演算子の前後に半角スペースを1つずつ入れます。 その方が読みやすいと実感しているので、本書の筆者もこの慣習を採用しています。 皆さんがプログラムを入力するときも、キーのタイプは増えますが、半角スペースを入れることをおすすめします。
なお、複数の演算子を使った式では、それぞれの演算子の前後に半角スペースを1つずつ入れます。
>>> 5 + 3 * 4
17
1.2. 文字列¶
数の次は文字をプログラムで扱います。 文字の並びは「文字列(もじれつ)」と呼ぶのでしたね。
1.2.1. プログラムで文字列を表す¶
プログラムでは、文字の並びを '
(シングルクォート)で囲んで扱います。
文字列を使ったプログラムをPython処理系に処理させましょう。
>>> 'こんにちは世界'
'こんにちは世界'
処理系が文字列を評価し、そのまま処理結果としました。 処理結果にはシングルクォートが付いていて、文字列と示されています。
文字の並びを "
(ダブルクォート)で囲んでも同じです。
>>> "こんにちは世界"
'こんにちは世界'
シングルクォートでもダブルクォートでも、文字列に違いはありません (ダブルクォートで文字列を作った例では、処理結果はシングルクォートになっていますよね)。 どちらでも違いはないので、この本ではダブルクォートで囲む ように統一します。
一つ注意が必要なのは、文字の並びを囲むのはシングルクォートかダブルクォートの どちらかに揃える ことです。
例えば 'こんにちは世界"
のように、シングルクォートで始めてダブルクォートで終えてはいけません。
1.2.2. 文字列の計算¶
数値の四則演算と比べると、文字列には「足し算」と「掛け算」があります。
1.2.2.1. 文字列の「足し算」¶
演算子 +
を使って、文字列も「足し算」できます。
>>> "吾輩は" + "猫である"
'吾輩は猫である'
文字列 + 文字列
という式を評価すると、結果は 2つの文字列がくっついた(連結した) 新しい文字列です。
"吾輩は"
と "猫である"
がつながって '吾輩は猫である'
という文字列ができていますね。
1.2.2.2. 文字列の「掛け算」¶
演算子 *
を使って、文字列と整数の間でのみ 「掛け算」ができます。
>>> "万歳!" * 3
'万歳!万歳!万歳!'
文字列 * 整数
という式を処理すると、整数の数だけ繰り返した文字列 ができます。
ここでは "万歳!"
が3回繰り返されていますね。
文字列と整数を逆にして 整数 * 文字列
と書いても、同じ結果となります。
>>> 3 * "万歳!"
'万歳!万歳!万歳!'
例えば、文章の区切り線を作るために記号 "ー"
を繰り返す時、文字列の「掛け算」の出番です。
1.2.3. 練習問題¶
万歳!を10回表示するプログラムを書いてみましょう。
[解答]
万歳!を10回表示と聞いて、 *
で繰り返す方法が浮かびましたか。
>>> "万歳!" * 10
'万歳!万歳!万歳!万歳!万歳!万歳!万歳!万歳!万歳!万歳!'
万歳!を10回表示する方法は、上記以外にも考えられます。
"万歳!" + "万歳!"
のように10回足す方法や、演算子を使わずに10回繰り返した文字列を入力する方法です。
ですから、"万歳!" * 10
でなくても、万歳!を10回繰り返した文字列ができていたら正解です!
数値の他に文字も扱えるようになりました。 プログラミングでできることが広がりましたね!
[コラム] 「プログラムを処理系に処理させる」の他の言い方
「プログラムをプログラミング言語処理系に処理させる」には別の言い方があります。
プログラムを 実行する
プログラムを走らせる
どれも意味は同じです。 本書では「実行する」を主に使っていきます。
ちなみに、英語ではexecuteやrunを使います。 これらを訳して、日本語では「実行する」「走らせる」になっています。
[コラム] 文字列以外は、半角英数記号で揃える
この節では "こんにちは世界"
や "万歳!"
などの文字列を作りました。
プログラミングで 全角文字が使えるのは、文字列の中だけ です。
文字列以外は、半角英数記号で揃えます。
例えば、文字列を作るときに使うダブルクォートを全角にすると、処理系はエラーを出します。 先の章では、ダブルクォートや演算子の他にも、イコールやアンダースコアなどの記号が登場しますが、すべて 半角記号 です。
1.3. 値には種類がある:型¶
この節では、数値と文字列は 種類が異なる ことを見ていきます。
これまでに出てきた数値や文字列のことをまとめて、「値」(あたい)と呼びます。 実はプログラミングでやっていることは、プログラマーは値と演算子から式を作り、それを 処理系に評価させ て、結果の値を得る ことです。
1.3.1. 値の種類を指定する¶
復習を兼ねて、次の式を評価した結果は何でしょうか?
3 + 3
"3" + "3"
[解答]
1は 数値 の 3
と 3
の足し算ですね。
>>> 3 + 3
6
2は 文字列 の "3"
と "3"
をつなげます。
>>> "3" + "3"
'33'
この2例は、プログラミングでは 値の種類を明確にして記述する ことを示しています。
単に
3
と書いたら 数値ダブルクォートを付けて
"3"
と書いたら 文字列
と 種類を書き方で指定 しているのです。
値の種類 をプログラミングでは「型(かた)」と言います。 この本を読み進める中で、数値や文字列を表す型の他に、日付などの型と出会います。お楽しみに。
1.3.2. 初めてのエラー:処理できない型の組合せのとき¶
では、3 + "3"
のように、数値(整数)と文字列の「足し算」の式を、実行したら(プログラミング言語処理系に処理させたら)どうなるでしょうか。
>>> 3 + "3"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
式の評価結果ではなく、文字が大量に表示されましたね。
結果が出ていませんが、あなたの コンピューターやインストールした処理系が壊れたわけではない ので安心してください
(対話モードは >>>
と次のプログラムの入力を待っていますね)。
Errorという文字は、処理系がエラーを出したことを表しています。
式 3 + "3"
の評価で出たエラーの情報は、
最後の行の「TypeError: unsupported operand type(s) for +: 'int' and 'str'」に示されています。
int
と str
は型の名前です(それぞれ英単語integer(整数)、string(文字列)に由来します)。
数値 3
の型は int
、文字列 "3"
の型は str
です。
つまり、整数と文字列とに +
を使った式はサポートされていない(すなわち、評価できない)ということです。
TypeError
は型についてのエラーです(プログラミングにおける型は英語でtypeです)。
整数 + 文字列
という式は、適切ではない型の組合せのために評価できない ことを表しています。
式 3 + "3"
に対し、処理系は 常に TypeError
を出します。
つまり、整数と文字列の「足し算」はできません。
この例のように、演算子がサポートしない型があり、そのために評価できない式があります。 型は 式の評価に制約を課し ているわけです。 プログラマーは人間ですから、見落としや思い込みのために、処理系が評価できないプログラムをときどき書いてしまいます。 そんなプログラムに処理系はエラーを出すので、プログラマーは自分のミスに気づけます。
[コラム] エラーは怖くない
初めてエラーを経験しましたね。 エラーは英語でずらずらと書かれており、「不気味なもの」「よく分からないもの」「自分を否定された」と あまりいい印象ではないかもしれません。
私は先輩から「エラーは怖がらずどんどん出そう。 エラーを見た数だけ、そして、その原因を解決した数だけ、プログラミングは上達する」と教わりました。 この言葉は、エラーを見ても原因が分からずくじけそうになるときに支えとなりました。
スポーツの試合でのエラーは失点につながってしまう避けたいものですよね。 ところが、プログラミングでのエラーは、どんどん経験したい 上達のきっかけ です。 プログラミングのエラーは間違いではなく、皆さんの今後のプログラミングに役立つ財産 です。
皆さんに上達してほしいので、この本ではこの後もどんどんエラーを出します。 合わせてエラーの解説もしますので、エラーの原因を解消する方法 を理解しましょう。 エラーの経験を積み重ねると、「これはあのときに見たエラーだ。 あのときはああしたら解決したから、今回はここをこう変えたら直るはず」と 経験したエラーをヒントに、自力で解決できるようになります。
[発展] エラーの読み方
エラーには 処理系がエラーを出したときの情報 が英語で書かれています。 これを手がかりにすると、エラーは、エラーを解決するためのヒント になります。
>>> 3 + "3"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
エラーとして表示されるのは、Traceback(トレースバック)です。 次の2つに着目しましょう。
line
の表示(プログラムの何行目で、処理系がエラーを出したか)最後の行(処理系はどんなエラーを出したか)
「line 1」とあるのは、入力したプログラム(3 + "3"
の1行)のうち、1行目の実行で処理系がエラーを出したということです。
何行目かを手がかりにすることで、原因箇所 が特定できます
(6 章 「3大構造 一. 順次」以降は、何行もあるプログラムを書きますよ)。
最後の行 には TypeError
と出ていて、エラーが出た原因も示されています(本文で示したとおりです)。
こうして、プログラムの どこが原因で、どんなエラーが出たか 特定できます。 その後は解決策を試しましょう。 エラーの経験を積み重ねると、過去のエラーの経験から解決策がいくつか浮かぶようになります。
なお、プログラミングでは、エラーのことを「例外」とも言います。
[コラム] コマンドラインの履歴を使おう
3 + "3"
を実行して、処理系がエラーを出したとき、もう皆さんはその理由が分かりますね。
「文字列の "3"
どうしをつなげようとしていたのに、1つ目の3を数値にしてしまっていた」と気づくかもしれません。
エラーが出た後、プログラムを初めから入力し直すのは少し面倒ですよね。
実は 上矢印キー (↑)を1回押すと、直前に入力したPythonのプログラム 3 + "3"
が現れます。
左矢印キー(←)・右矢印キー(→)でカーソルを左右に動かして "3" + "3"
のように修正できます。
このようにプログラミング言語処理系は 履歴 を持っています。 またシェルにも履歴があり、2つの履歴は分かれています。
履歴の対象 |
説明 |
例 |
シェル |
コマンドの履歴 |
|
処理系(対話モード) |
対話モードに入力されたプログラムの履歴 |
|
上矢印キー(↑)を押すことで、最新から過去へと辿ることができます。 もし過去に戻りすぎてしまったときは下矢印キー(↓)を押してください。
[発展] プログラミングにおける小数
数値は小数点を含むか含まないかで2つの型に分かれています。
小数点を持たない数(例えば、-4, 0, 123)は 整数(int
)という型です。
小数点を持つ数(例えば、-5.6, 0.9, 34.0)は 浮動小数点数 (ふどうしょうすうてんすう。float
)という型です。
浮動小数点数は、皆さんの知っている小数とは少し異なります。
数値の練習問題で合計金額が 538.9200000000001
となりましたね。
電卓を使って計算すれば 538.92 と求まります。
コンピューター内部では どんな値も0と1の並び で表されます。 小数点を持つ数も0と1の並びで表しますが、小数点を持つ数そのものとは一致しません。 正確に表そうとすると0と1が無限に続くのですが、コンピューターの大きさは決まっていますから、やむなく打ち切る ためです。
例に出した練習問題では 0.08
が途中で打ち切られた値です。
これは正確な0.08ではないため、評価結果が 538.9200000000001
と端数を含む値となるのです。
なお、これでは金額を計算するときに不便なので、プログラミングでも電卓と同じように計算する仕組みが用意されています
(この本を読み進めると 標準ライブラリ が登場します。その中の decimal
モジュールを使います)。