0

以下の関数とスペースで分割された入力 (つまり forward 20) を使用すると、タートルは色と書き込み関数を実行しますが、前方、後方、右または左を使用すると何もせず、空白のタートル ウィンドウが表示されます。

これは、前方および後方コマンドの関数とコードの要約版です。

import sys
import turtle

def parse_line(line):
    global items_in_line
    items_in_line = line.split(" ",1)
    if items_in_line[0] == "forward":
        if isinstance(items_in_line[1], int):
                return items_in_line
    elif items_in_line[0] == ("back" or "backward"):
        if isinstance(items_in_line[1], int):
            return items_in_line
    return items_in_line



def comm(items_in_line):
    m = items_in_line[1]
    if items_in_line[0] == "forward":
        if isinstance(m,int) == True:
            turtle.forward(m)
    if items_in_line[0] == ("backward" or"back"):
        if isinstance(m,int) == True:
            turtle.back(m)

line=input("Enter a turtle command or enter 'file' to load commands from a file")

x = parse_line(line)

y=comm(items_in_line)
4

2 に答える 2

0

リスト内の要素がint;になることはありません。それらを s にしたい場合はint、それらをコンストラクターに渡してint()、発生した例外をキャッチする必要があります。

>>> '3'
'3'
>>> int('3')
3
于 2012-12-05T18:31:49.863 に答える
0

ここで 2 つの問題:

elif items_in_line[0] == ("back" or "backward"):

これは"backward"決して機能しないことを意味します。インタラクティブ ウィンドウに次のように入力してみてください。

>>> ("back" or "backward")
'back'

したがって、何かが に等しいかどうかを確認することは("back" or "backward")、 に等しいかどうかを確認することと同じ"back"です。

あなたはこれを求めている:

elif items_in_line[0] in ("back", "backward"):

または、あなたが主張するなら、これ:

elif items_in_line[0] == "back" or items_in_line[0] == "backward":

次に、別の問題があります。

if isinstance(m,int) == True:
    turtle.forward(m)

items_in_lineは呼び出しの結果であるため、split各要素は文字列でなければならず、int. (また、特に他の真の値== Trueと区別したい場合を除いて、Python で行うべきではありません。)True

あなたが望むかもしれないのは次のようなものです:

try:
    amount_to_move = int(m)
except ValueError as e:
    print(<some message about the error>)
else:
    turtle.forward(amount_to_move)

関数の両方の分岐で同じチェックを行うコードの構造では、おそらく上に移動する方がよいので、次のようになります。

def comm(items_in_line):
    try:
        m = int(items_in_line[1])
    except ValueError:
        print(<some message>)
        return
    if items_in_line[0] == "forward":
        turtle.forward(m)
    if items_in_line[0] in ("backward", "back"):
        turtle.back(m)

tryまたは、より高いレベルで処理できるため、ここでは/も必要ないかもしれません。except結局のところ、items_in_line要素が 1 つしかない場合IndexError、キャッチしていないan が発生するため"forward foo"、同じ方法で処理しないでください。あなたは扱い"forward"、発信者に滴り落ちるようにしますか?

def comm(items_in_line):
    m = int(items_in_line[1])
    if items_in_line[0] == "forward":
        turtle.forward(m)
    if items_in_line[0] in("backward", "back"):
        turtle.back(m)
于 2012-12-05T18:41:30.447 に答える