長ったるい前置き
こんにちは、Retroidです。
プログラミングして2年くらいになると、だいぶエラーに対して耐性がつくものです。
昔は、エラー吐くたびにうんざりしていたものですが、最近は「エラー吐くだけまだマシじゃん、エラー吐かないエラーのほうがよっぽど質悪い」って思えるようになりました、ほんとに笑
プログラミングの「エラー」は、医学で言うところの「痛み」なのかな?って思います。
痛みは人間にとって不快なもんですが、無いと困ります。
痛みがなければ、体中にアザができても、手足の骨を折っても気がつくことができず、もっと深刻な事態を招きます。(酒飲んで、翌朝シャワー浴びていると、見慣れないアザがあったりするのは、アルコールで痛覚が麻痺っているからです笑)
エラー吐かないけど挙動のおかしいプログラムを直すのはめんどいです。
話を戻します。
プログラミングを続けていれば、エラーには耐性がつきますが、やっぱり初心者にとってエラーは怖いもの。
ターミナルに、どっさりエラーを示す文章が出てくると、そのたびにビクビクしてしまいますよね。
しかも英語(T_T)
ということで、今回はPythonでよく出るエラーと、その解説を自分なりにまとめてみました。
Python初学者の人、ぜひ見てみてください。
この記事は継ぎ足し継ぎ足し書いていきます
エラーの量って膨大ですし、多分一気に書くのは僕の能力的に無理なので、老舗のうなぎ屋のタレの如く、継ぎ足し継ぎ足しで記事を作っていこうと思います。
それでは本題
SyntaxError: invalid syntax
2019年5月20日記述
「無効な構文」って意味です。ほんとに初歩的なミスで多く出ます。
ほんとに初歩的なので、細かいヒントが書いてないです(笑)
エラー吐いてる行(line ○○って書いてある部分)を1分くらい見つめれば、たいてい原因が見つかるはずです。
それでもわからないなら、根本的に構文が間違っている可能性が高いです。
プライドを捨てて、初級者向けの本で構文を確認してみると、早く解決できると思います。
案外、他の言語でプログラムをちょっと書いた後、Pythonに戻ってくると陥りがちな気がする。。。前の言語の書き方がPythonで通用しなかったりするので(笑)
unexpected EOF while parsing
2019年5月20日記述
EOFとは、End Of Fileのことであり、構文を解析しているときに、ファイルの終わり方が異常だったよ、って言ってる(のだと思う)
例えば、こんなプログラムを書くとエラーが出ます。
1 2 |
my_list = ['apple','banana','tomato'] print('\n'.join(my_list) # my_listの)の横に、printのとじカッコ)が来るべきですよね(#^ω^) |
これ、2行目をよくよく見てみると、)で閉じられてないんですよね(笑)
大変初歩的なのですが、案外見つけにくいでしょ?
name ‘○○’ is not defined
○○は任意の文字です。
このエラーの意味は「○○って変数、定義されてないので事前に定義してからつかってね(#^ω^)💢」
って意味です。
僕も未だによくやります。。。(笑)
「え、だって定義されてるじゃん?💦」
と思ったそこのあなた、99.999…%あなたが間違ってます(笑)
プログラムはあなたが思っている以上に、ほんと異常なくらい正確です(そして融通が恐ろしいくらい効かない子です)
僕が思いつく限りだと、たいてい
- 変数の単語、間違ってませんか?(LとRが間違っていたり、単純に内間違えてたり)
- 単語の大文字と小文字、大丈夫ですか?(プログラムは殆どの場合、大文字と小文字を全く別のものとして扱います)
- Scope大丈夫?(後述)
のどれかに当てはまることが多いと思います(もちろん、探せばもっとあると思いますが。。。)
最後に書いたやつですが、例えば、Pyhtonでは、関数の中に書いた変数は、関数の外からつかえません。
例を上げて説明しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> def function(): ... x = 1 ... y = 2 ... return x + y ... >>> function() 3 >>> print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> print(y) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'y' is not defined >>> |
関数内でxもyも定義しているのに、xもyもdefineされていないって言ってますね?
これは、xやyが、関数の外からアクセスできないためです。
上の例において、関数のScopeをグローバルスコープといいます。
以下引用です。
Scopeとは、ある名前空間から(直接)アクセスすることができる名前空間の範囲のこと。
https://qiita.com/Liesegang/items/085f53a13ac140b84202
Scopeは視野のようなものであり、ある名前空間に立ったとき、そこから見える名前空間はどこまでかということである。
だから、関数の外からxとか yとかを呼び出そうとしても、「そんなの知らんがな !(#^ω^)💢」って突っ返されるんですね。
今日はここまで!
2019年5月21日