7
while x < len(Hand):
    while y < len(Hand):
        if Hand[x][0] == Hand[y][0] and y != x:
                sameRank += 1
        y += 1
    x += 1

「if」の直前のスペースを強調表示し、構文エラーを示します...意味がありません。

4

3 に答える 3

8

ここではエラーは表示されませんが、ifステートメントの下のブロックをインデントしすぎている可能性があります。プログラムの残りの部分がインデントに4つのスペースを使用していることに注意してください。インデントを4スペースに減らして、実行されるかどうかを確認してください。

ただし、コードには論理エラーがあります。各xの開始時にyを再初期化しない場合、各xのyをループすることはありません。

論理エラーを修正して実行したサンプルコードは次のとおりです。

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    x = 0 
    sameRank = 0 

    while x < len(Hand):
        y = 0
        while y < len(Hand):
            if Hand[x][0] == Hand[y][0] and y != x:
                sameRank += 1
            y += 1
        x += 1

if __name__ == "__main__":
    example()

最後に、このコードは、より「pythonic」にすることで、より読みやすくすることができます。 このことを考慮:

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    sameRank = 0 

    for x in Hand:
        for y in Hand:
            if x[0] == y[0] and y != x:
                sameRank += 1

if __name__ == "__main__":
    example()

Handこのコードは、インデックス演算子で使用する一時的な整数変数をインクリメントするのではなく、の内容を繰り返し処理します。「メンテナンス」行(など)が少なくx += 1、読みやすく、リストを含む反復可能なオブジェクトで機能するため、型に依存しないため、より優れています。

または多分(ヘイデンのコメントによると)これ:

def example():
    Hand = [[1],[2],[3],[3],[4],[5],[2],[2],[1]]
    sameRank = sum(1 for x in Hand for y in Hand if x[0] == y[0] and y!=x)

if __name__ == "__main__":
    example()

sumこのコードは、関数の呼び出しとジェネレーター式を組み合わせたものです 1 for x in Hand for y in Hand if x[0] == y[0] and y!=x。この式は、条件に一致するリスト内のアイテムごとに1を生成するジェネレーターsameRankを返します。合計関数は、これらすべての1を合計することで、必要な値を提供します。

Pythonイディオムの概要については、この記事をご覧ください。

最後に、使用しているエディターはわかりませんが、インタープリターのstderr / stdoutから直接メッセージやトレースバックの代わりにダイアログボックスが表示される場合は、実際の問題を覆い隠しているようです。あなたが学ぼうとしているとき、時々あなたの編集者からのあまりにも多くの助けは本当に悪いことです。私は個人的にVimを使っていますが、これは初心者に聞いてみると多分少し多いでしょう。IDLEの経験はあまりありません(それはあなたが使っているものかもしれません)、しかし私はそれを学習ツールとして使うことについて良いことを聞いたことがあります。ただし、本格的な開発を行っている場合は、すぐにそれを超えてしまいます。いずれにせよ、IDLEを使用する場合は、IDLE自体からではなく、コマンドラインからプログラムを実行することに慣れてください。個人的には、これにより多くの場合、より良いフィードバックが得られると思います。最後に、PyDev IDE(Eclipse上に構築)があります。これは、堅牢な組み込みのビジュアルデバッグに特に役立ちます。これは良い選択かもしれませんが、それは確かにヘビー級のオプションであり、Eclipseにまだ精通していない場合は、「中級」レベルの難易度で学習することにします。Eclipseに精通している場合は、PyDevをすぐに使用できます。

于 2012-10-02T19:11:43.493 に答える
1

前にスペースのような文字がある可能性がありますif-TextMateを使用しているときにこれを取得していました。ここで、alt+spaceは通常のスペースの代わりに改行なしのUnicode文字を挿入します。

ファイルの先頭にあるようなもの# coding: utf-8はありますか?その場合は、それを削除してください。そうすれば、より良いエラーメッセージが表示される可能性があります。

ちなみに、sum/generation式(Pythonの学習に役立つよりも混乱する可能性があります)を使用せずに、ループを次のように簡略化できます。

for x in range(len(Hand)):
    for y in range(len(Hand)):
        if Hand[x][0] == Hand[y][0] and y != x:
                sameRank += 1
于 2012-10-03T13:15:46.907 に答える
0

タブとスペースを組み合わせると、Pythonがトリップすることがあります。たとえば、whileループがタブでインデントされていて、ifステートメントで代わりにスペースが使用されている場合です。また、ifステートメントは正しくインデントされている可能性がありますが、スニペット内の他のすべての行をチェックして、すべて同じ方法でインデントされていることを確認すると役立つ場合があります。

あなたの編集者が助けることができるかもしれないいくつかの方法:

  • タブボタンを押すと、タブの代わりに複数のスペースが挿入されます
  • 空白文字を表示するので、4つのスペースかタブ文字かを簡単に確認できます
  • タブ文字を検索して置換し(\tエディターが正規表現による検索をサポートしている場合)、それらを4つのスペースと交換します。その逆も同様です。

エディターがこれらのいずれもサポートしていない場合は、これらの種類の問題の診断に役立つだけであれば、Programmer'sNotepadまたはNotepad2を試してみることをお勧めします。

それが不当に厄介に聞こえる場合は、プログラミングへようこそ!それは私たちの最善のためにイライラする可能性があります。好みのバージョン(スペースまたはタブ)を選択し、それを維持します。前述のように、これをPythonでよりクリーンなコードにする方法はたくさんありますが、間隔の問題にも慣れることをお勧めします。

于 2012-10-03T13:32:38.817 に答える