Python初心者にありがちなエラーの詳細


前言
Pythonは簡単で分かりやすい文法形式で他の言語と鮮明な対照をなしています。初心者の一番多い問題はPythonの規則に従わないことです。プログラミング経験のあるプログラマーでも、固有の思考と文法形式でPythonコードを書きやすいです。彼を通訳して元の基礎に理解を追加しました。これらの穴を避けてほしいです。
0、コロンを書き忘れた
if、elif、else、for、while、class、def文の後に「:」を追加することを忘れます。

if spam == 42
print('Hello!')
結果:SyntxError:invalid syntax
1、「=」を誤用して等値比較をする
「=」は値付け操作ですが、2つの値が等しいかどうかは「=」です。

if spam = 42:
print('Hello!')
結果:SyntxError:invalid syntax
2、間違ったインデントを使う
Pythonはインデントでコードブロックを区別し、よくあるエラーの使い方:

print('Hello!')
print('Howdy!')
結果:Indentation Error:unexpected indent。同じコードブロックの各行のコードは同じインデント量を維持しなければなりません。

if spam == 42:
print('Hello!')
print('Howdy!')
結果:Indentation Error:unindent does not match any outer indentation level。コードブロックが終了したら元の位置にインデントします。

if spam == 42:
print('Hello!')
結果:Indentation Error:expected an indented block、「:」の後にインデントを使う
3、変数が定義されていません。

if spam == 42:
print('Hello!')
結果:NameError:name'spam'is not defined
4、リスト要素の索引位置を取得するためにlenメソッドを呼び出すのを忘れました。
インデックス位置から要素を取得すると、リストの長さをlen関数で取得するのを忘れます。

spam = ['cat', 'dog', 'mouse']
for i in range(spam):
print(spam[i])
結果:TypeError:range()integer end argment expected、got list。正しいやり方は:

spam = ['cat', 'dog', 'mouse']
for i in range(len(spam)):
print(spam[i])
もちろん、もっとPythonicの書き方はenumerateを使います。

spam = ['cat', 'dog', 'mouse']
for i, item in enumerate(spam):
print(i, item)
5、文字列の変更
文字列オブジェクトは、インデックスで要素を取得することをサポートしていますが、リストオブジェクトとは異なり、文字列は可変オブジェクトではなく、変更はサポートされていません。

spam = 'I have a pet cat.'
spam[13] = 'r'
print(spam)
その結果:Type Error:'str'object does not support item assign mentが正しいやり方は:

spam = 'I have a pet cat.'
spam = spam[:13] + 'r' + spam[14:]
print(spam)
6、文字列と非文字列の接続

num_eggs = 12
print('I have ' + num_eggs + ' eggs.')
結果:Type Error:cannot contentate'str'and'int'object
文字列と非文字列を接続する場合は、非文字列オブジェクトを強制的に文字列タイプに変換する必要があります。

num_eggs = 12
print('I have ' + str(num_eggs) + ' eggs.')
または文字列の書式設定を使用します。

num_eggs = 12
print('I have %s eggs.' % (num_eggs))
7、使用エラーインデックスの位置

spam = ['cat', 'dog', 'mouse']
print(spam[3])
結果:IndexError:list index out of range
リストオブジェクトの索引は0から始まります。3番目の要素はspam[2]を使ってアクセスするべきです。
8、辞書に存在しないキーを使う

spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'}
print('The name of my pet zebra is ' + spam['zebra'])
辞書の対象に訪問するkeyは[]を使用することができますが、keyが存在しないと、KeyError:'zbra'となります。
正しい方法はget方法を使うべきです。

spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'}
print('The name of my pet zebra is ' + spam.get('zebra'))
keyが存在しない場合、getはデフォルトでNoneに戻ります。
9、キーワードで変数名を作る

class = 'algebra'
結果:SyntxError:invalid syntax
Pythonでは変数名としてキーワードの使用は禁止されています。Python 3は全部で33のキーワードがあります。

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', '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']
10、関数内の局所変数の割り当て前に使用されます。

someVar = 42
def myFunction():
print(someVar)
someVar = 100
myFunction()
結果:Unbound LocalError:local variable'someVar'referenced before assigment
関数に大域作用領域と同名の変数があると、LEGBの順にこの変数を検索します。関数内部の局所作用領域に同名の変数が定義されていると、外部作用領域の検索は行われなくなります。このため、myFunction関数ではsomeVarが定義されていますので、print(someVar)は外で検索しなくなりましたが、printの場合はまだ値が与えられていませんので、Unbound Locallerrorが現れました。
11、自己増加「+」を使ってマイナス「-」

spam = 0
spam++
ははは、Pythonには自増自減操作符がありません。C、Javaから回転したら、注意してください。+++の代わりに「+」を使ってもいいです。

spam = 0
spam += 1
12、クラス中のメソッドをエラーで呼び出します。

class Foo:
def method1():
print('m1')
def method2(self):
print("m2")
a = Foo()
a.method1()
結果:TypeError:method 1()tars 0 positional argments but 1 was given
method 1は、Fooクラスのメンバシップ方法であり、この方法は任意のパラメータを受け入れず、a.method 1()を呼び出すのはFoo.method 1(a)に相当するが、method 1は任意のパラメータを受け付けないので、エラーを報告しました。正しい呼び方はFoo.method 1()であるべきです。
上記のコードはすべてPython 3に基づいており、Python 2において同じコードであってもエラーは異なります。特に最後の例です。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。