以下のPythonコードをコンパイルすると、
IndentationError:unindentは外側のインデントレベルと一致しません
import sys
def Factorial(n): # Return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
どうして?
他のポスターはおそらく正しいです...あなたのタブと混在するスペースがあるかもしれません。検索と置換を実行して、すべてのタブを数個のスペースで置き換えます。
これを試して:
import sys
def Factorial(n): # return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
print Factorial(10)
_ important _ :スペースは好ましい方法です - PEP008を参照してください インデント および タブまたはスペース? 。 (@Sihaさん、ありがとうございます。)
Sublime Text
ユーザーの場合:
インデントにタブを使用するようにSublime Text
を設定します。View
- > Indentation
- > Convert Indentation to Tabs
上記と同じサブメニューでIndent Using Spaces
オプションをオフにします。これはすぐにこの問題を解決します。
タブやスペースの問題を簡単にチェックするには、実際にこれを行うことができます。
python -m tabnanny yourfile.py
またはもちろん、エディタを正しく設定することもできます。
インデントの空白にタブとスペースを混在させていませんか。 (それはそのエラーを引き起こします。)
Pythonコードではタブを使用しないことをお勧めします。 スタイルガイド を参照してください。タブ用のスペースを挿入するようにNotepad ++を設定する必要があります。
私がこのエラーに遭遇したときはいつでも、私はどうにか私のエディタでタブとスペースを混同したからです。
PythonのIDLEエディタを使用している場合は、同様のエラーメッセージで示唆されているように実行できます。
1)すべて選択Ctrl + A
2)フォーマットに移動 - >地域を確定しない
3)インデントがまだ正しいことを再確認し、保存してプログラムを再実行します。
私はPython 2.5.4を使っています
行result = result * i
はインデントする必要があります(for-loopの本体です)。
または - スペースとタブ文字が混在している
もしあなたがVimを使っているなら、escapeを押してからタイプする。
gg = G
この自動はすべてをインデントし、あなたが投げ込んだスペースを一掃します。
Notepad ++を使用している場合は、\ tを検索して4つのスペースで置き換えるために、拡張検索モードで "replace"を実行してください。
オン 原子
に行く
Packages > Whitespace > Convert Spaces to Tabs
その後、ファイルのインデントをもう一度確認してください。
python -m tabnanny yourFile.py
または
>python
>>> help("yourFile.py")
インデントの問題に見えます。 Pythonでは波括弧と一致させる必要はありませんが、 do はインデントレベルと一致させる必要があります。
スペースやタブの問題を防ぐ最善の方法は、テキストエディタ内に目に見えない文字を表示することです。これにより、インデント関連のエラーを簡単に防止または解決することができます。
また、コピーペーストされたコードを挿入することは、この種の問題の一般的な原因です。
atomユーザーのために、Packages ->whitspace -> remove trailing whitespaces
これは私のために働きました
まず最初に、論理エラーがあることを思い出させるために、result = 1を維持することをお勧めします。そうしないと、ループが実行された後も出力はresult = 0になります。
次に、このように書くことができます。
import sys
def Factorial(n): # Return factorial
result = 0
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
行を残すと、PythonシェルにFORステートメントが終了したことがわかります。あなたがPythonシェルを使った経験があるなら、あなたは私たちがなぜ行を去らなければならないかを理解することができます。
ちょっと追加。私はNotepad ++の両方のインデントについて同様の問題を抱えていました。
外側インデントレベル
---->検索タブ---->をタップ 置換 ---->ラジオボタンを押す 拡張 下--->\tを4つのスペースに置き換えてください。
---->検索タブ---->タップ/ 置換 ---->ラジオボタンを押します 拡張 下--->\nを何も置き換えないでください
関数を定義しましたが、その関数のコメントとは別に、 コンテンツがありませんでした ...
def foo(bar):
# Some awesome temporary comment.
# But there is actually nothing in the function!
# D'Oh!
それは叫んだ:
File "foobar.py", line 69
^
IndentationError: expected an indented block
(^
マークが指す行は空です)
-
複数の解決策:
1:機能をコメントアウトする
2:機能コメントを追加
def foo(bar):
'' Some awesome comment. This comment could be just one space.''
3:何もしない行を追加する
def foo(bar):
0
いずれにせよ、 それを明白にすることを忘れないでください なぜ それは空の関数です - あなた自身のために、またはあなたのコードを使うあなたの仲間のため
spyder
に固有の答えがないことに気づいたので、1つ追加します。基本的に、if
ステートメントを注意深く見て、すべてのif
、Elif
、およびelse
は、次のように開始時に同じ行にある同じ間隔を持ちます。
def your_choice(answer):
if answer>5:
print("You're overaged")
Elif answer<=5 and answer>1:
print("Welcome to the toddler's club!")
else:
print("No worries mate!")
私はJupyterノートブックを使用していて、上記の解決策のほとんどすべてを(私のシナリオに合わせて)試しても意味がありませんでした。私はそれから1行ずつ行き、各行のためのすべてのスペースを削除し、タブと取り替えた。これで問題は解決しました。
私は昨日同じ問題を抱えていた、それは字下げエラーだった、崇高なテキストエディタを使用していた。修正に時間がかかり、最後にコードをVIテキストエディタにコピーすることになりましたが、うまくいきました。 ps pythonは余白の影響を受けやすいので、スペースとタブを混ぜないでください。
Pythonの開発にSublimeテキストを使用している場合は、パッケージAnacondaを使用してエラーを回避できます。
- あなたのファイルを崇高に開く
- オープンスペースを右クリック
- アナコンダを選ぶ
- オートフォーマットをクリック
- 完了またはCtrl + Alt + Rキーを押します。
Komodoエディタを使用している場合は、同様のエラーメッセージのいずれかで示唆されているように実行できます。
1)すべて選択Ctrl + A
2)コードに移動 - >地域の統一を解除
3)インデントがまだ正しいことを再確認し、保存してプログラムを再実行します。
私はPython 3.4.2を使っています
私の場合、問題はEclipseでのpydevの設定でした
その価値のために、私のdocstringは過度にインデントされていて、これも同じエラーを投げます
class junk:
"""docstring is indented too much"""
def fun(): return
IndentationError: unindent does not match any outer indentation level
SPYDER usersの場合:python 3.7.1でspyder 3.3.2を使用しており、タブを使用するようにインデントを設定し、次の手順でこれを解決しました。 :
次に、タブキーを使用して「不明な」行をリセットします。
何らかの理由で、この設定なしで、ghostIndentationErrorが発生することがありました。
それより上の関数が同じように字下げされていないためかもしれません。すなわち.
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
pythonプラグインを使用したintellijで、Ctrl + Shift + Altを使用してドキュメントを再フォーマットすると、インデント/タブ/スペースの問題が修正されました
これは、タブとスペースの両方が混在しているためです。すべてのスペースを削除してタブに置き換えることもできます。
または、これを書いてみてください:
#!/usr/bin/python -tt
コードの先頭にあります。この行はタブとスペースの違いを解決します。