C - 1.02.プログラムの書き方とエラー 解説 /

実行時間制限: 0 msec / メモリ制限: 0 KB

前のページ | 次のページ

キーポイント

  • Python プログラムを書く際には行の書き出し位置・改行などのルールに従う必要がある
  • 読み込み時エラーとは Python プログラムの記述ルールに従っていない場合に起こるエラーのことで、プログラム自体が実行されない
  • 実行時エラーとはプログラムの処理が継続できない事象が生じた場合に起こるエラーのことで、プログラムが異常終了する
  • 論理エラーとはプログラムの動作が意図したものと異なる場合に起こるエラーのことで、プログラムの実行は問題なく終了するため発見が難しい
  • 読み込み時エラーや実行時エラーが出たときはエラーメッセージをよく読み、少しずつ慣れていくことが重要

プログラムの書き方

プログラムは通常の文章を書くときには無いルールが存在します。他の言語と異なる Python 特有の事情も存在しますので、基本的なルールを紹介していきます。

行の書き出し位置とインデント

Python は各行の書き出し位置を揃える必要があります。理由も無く行の書き出し位置がずれるとエラーになるため、行の先頭に余分なスペースが入らないように注意してください。
逆に、後の節で扱う「構文を表すキーワード + コロン」を記述した場合、次の行では書き出し位置を右にずらす (インデントする) 必要があります。

参考までに、インデントしている部分を含むコードの例を紹介します (現時点で意味が分かる必要はありません)。

# 何もない行は左詰め
print("hoge")

def function():
    # 関数定義のコロンの後、インデントする
    # 複数行記述する場合、ずっとインデントしたまま
    print("foo")
    return 0

for i in range(10):
    # for 文のコロンの後、インデントする
    print("bar")
    for j in range(10):
        # 二重 (以上) にインデントすることもある
        print("baz")

C++などの他の言語では見やすくするためにインデントを行いますが、Python ではルールとして強制的にインデントを行う点が特徴的です1

改行について

Python では実行文2同士を区切るために改行もしくはセミコロン ; を使用します。
今まで print を複数記述する際には必ず改行をはさんでいましたが、次のようにセミコロン ; を使って複数の実行文を 1 行にまとめて記述することも可能です。

print("hello"); print(123)
実行結果
hello
123

逆に、1 つの実行文を複数の行に分けて記述したい場合、バックスラッシュ \ を用いて次のように書くことができます。次の例は 1 から 8 までの整数を足し合わせた結果を表示するプログラムです。足し合わせる数が多いため、途中でバックスラッシュを用いて改行をはさんでいます。

res = 1 + 2 + 3 + 4 \
     + 5 + 6 + 7 + 8
print(res)
実行結果
36

一部のケースではバックスラッシュなしで改行をはさむことができます。具体的には、丸カッコ () や四角カッコ []、波カッコ {} などの内側です。次のような書き方のイメージになります(意味は気にしなくて構いません)。

print(
    123,
    "hoge",
    "foo",
    sep="\n"
)
lst = [
    10,
    20,
    30
]

カッコの中身は記述が長くなりやすいため、改行を使うことで読みやすいコードになります。

スペースについて

Python では記述する要素同士の切れ目には半角スペースを何個でも置くことができます。

print(123,   456 ,  789)

注意として、半角スペースでなく全角スペースを記述するとエラーとなってしまうので気をつけてください。

プログラムのエラー

プログラムは書き終わったら完成ではありません。動かしてみてその動作が正しいことを確認して、はじめて完成と言えます。
しかし書き終えたばかりのプログラムを実行しようとすると、たいてい何らかのエラーが発生します。そのときにエラーの原因を理解して修正できることも重要なスキルです。

Python プログラムのエラーは次の3つに大別できます。

  • 読み込み時エラー
  • 実行時エラー
  • 論理エラー

それぞれについて説明します。

読み込み時エラー

書いたプログラムの文法にミスがあるときに発生するエラーです。
全角スペースがプログラム中に入り込んだり、インデントが不正である場合、コードを読み込んだ時点でエラーになります。

プログラミング言語では「文法」が厳密に決められています。
日本語などの人間が使う言語では、文法的に少し崩れた文でも意図が通じますが、プログラミング言語ではそうはいきません。

読み込み時エラーが起きた場合、プログラムは一切動作しません。AtCoder のジャッジの実行結果は CE となります。

実行時エラー

「プログラムを動かす」ことを「プログラムを実行する」といいます。

実行時エラーとは、プログラムの文法に間違いはなかったが、内容に致命的な間違いがあったときに発生するエラーです。
具体的には3÷0のように、0で割り算を行ってしまった場合や、書き間違い (printpritn と書くなど) で存在しない要素を記述した場合などに発生します。
スマホアプリやゲーム等が強制終了してしまったとき、多くの場合実行時エラーが発生しています。

実行時エラーが起きた場合、実行時エラーが起きる直前までプログラムは動作しますが、エラー以降は動かなくなってしまいます。AtCoder のジャッジの実行結果は RE となります。

論理エラー

論理エラーとは、プログラムは一見正しく動作しているが、その動作が実は正しくないときに発生するエラーです。
例えば、「300円のクッキーと100円のアメを買ったときに払うお金」を計算するプログラムでは300 + 100と計算するべきですが、間違って300 - 100としてしまった場合などは論理エラーに当たります。
論理エラーは勘違いで生まれたり、タイピングのミスで発生したりと様々です。

論理エラーは一見問題なくプログラムが動作しますが、意図と異なる結果を返すため、発見することが難しくなりやすいです。AtCoder のジャッジの実行結果は(偶然実行結果が合うということが無い限りは) WA となります。

エラーの例

この時点でよく遭遇すると思われるエラーを紹介します。

全角スペース

次のコードには文末に全角スペースが入っており、SyntaxError という読み込み時エラーとなっています。エラー文の中で U+3000 と記述されているものが全角スペースに相当します。記述されている箇所も教えてくれるため、修正は容易です。

print(123) # (123) の後に全角スペースがある
File "Main.py", line 1
    print(123) 
              ^
SyntaxError: invalid non-printable character U+3000

カッコの閉じ忘れ

開きカッコに対応する閉じカッコがない場合、SyntaxError となります。

print(123
File "Main.py", line 1
    print(123
         ^
SyntaxError: '(' was never closed

インデントのミス

理由もなくインデントしてしまうと IndentationError という読込み時エラーが発生します。

print(123)
  print(456)
Sorry: IndentationError: unexpected indent (Main.py, line 2)

スペルミス

書き間違いなどで存在しない名称3を記述してしまった場合、NameError という実行時エラーになります。次のエラーでは pritn という名称は存在しないということと、print の書き間違いではないか?というヒントを与えてくれています。

pritn(123)
Traceback (most recent call last):
  File "/judge/Main.py", line 1, in <module>
    pritn(123)
    ^^^^^
NameError: name 'pritn' is not defined. Did you mean: 'print'?

エラーへの対処

プログラムにエラーはつきものなので、うまく付き合う必要があります。以下でエラーへの対処方法、心構えについて紹介します。

エラーをよく読む

Python の場合末尾にエラーの要点が書かれていることが多いです。大量のエラーが表示された場合読みたくなくなりますが、まずエラーの最後を見て大意がつかめないかトライしてみてください。
具体的な行数や箇所の表示を見て不自然な点が無いか確認してみるのもよいでしょう。

検索する

初心者の段階で遭遇するエラーはよくあるものが多いので、検索すればすぐにわかるケースも多いと思われます。
検索する場合はエラーの末尾の部分など、自分の環境固有の記述が含まれない部分を検索ワードに設定するとよいでしょう。

エラーの利点?

書くたびにエラーが出てうまく動かないと嫌な気持ちになるかもしれませんが、考えようによってはミスを Python の実行プログラムが教えてくれているだけ有益ともとれます。
前述の論理エラーのような「表示されないエラー」はミスが明らかにならないため発見が遅れ、大きなバグに繋がってしまうこともあります。

問題

リンク先の問題を解いてください。

EX2.エラーの修正

前のページ | 次のページ


  1. 面倒に感じるかもしれませんが、自然と読みやすいコードになるという利点もあります。 

  2. 今までの print("hoge") のように、ひとつの処理を実行する単位のことを実行文と呼びます。 

  3. 「存在する名称」は以下のいずれかです: 1. print のように Python の組み込みオブジェクトとして用意(予約)されている。 2. 自身で定義した変数やモジュール。これらに該当しない名称を記述した場合、エラーになります。