0

使用下面的函数,输入在空间上分割(即向前 20),turtle 将执行颜色和写入函数,但使用 forward、back、right 或 left 什么都不做,只会打开一个空白的海龟窗口

这是我的函数和代码的精简版本,用于前进和后退命令:

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; 如果您希望它们成为ints 那么您需要将它们传递给int()构造函数,以捕获发生的任何异常。

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

这里有两个问题:

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_linesplit调用的结果,所以每个元素都必须是一个字符串,所以它不可能是一个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你没有捕捉到的元素,所以为什么不"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 回答