2012-12-05 2 views
0

에서 도면을하지, 그리고 공간 분할 입력 (즉 앞으로 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) 
+0

그냥 궁금 -하지만 당신은 당신의 이전 질문에서 제안을 구현하지 않은 이유 - 당신의 "뒤로 뒤로"로 비트 나는 그들이 parse_line의 DEF에 괄호에없는 전에,이 –

+0

여전히 잘못 오류를 일으키는 원인은 무엇입니까? – Orgmo

+0

Err - 여전히 올바르지 않습니다 - 받아 들인 대답의 맨 아래에 'items_in_line [0] in ("back", "backward") :'작성해야하는 방법입니다.) –

답변

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"): 

또는 : items_in_line 이후

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

이의 결과이다 : 다른 문제가있다, 그런

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

이 원하는 split 호출, 각 요소는 문자열이어야하므로 0123이 될 수 없습니다.. (또한, 당신은 당신이 구체적으로 다른 실제 값에서 True을 구별하려는 경우를 제외하고, 파이썬에서 == 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에 요소가 하나만있는 경우 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) 
+0

환상적이며 해결되었습니다! 고마워. – Orgmo

0

이 목록의 요소는 int 없을 것; 당신이 그 (것)들을 int의 되길 원한다면 당신은 발생하는 모든 예외를 잡기 int() 생성자에게 전달해야합니다. 여기

>>> '3' 
'3' 
>>> int('3') 
3 
+0

isinstance 절이 없어도 아무런 문제가 없습니다. – Orgmo

+0

그러면 "응축 된"버전이 지금은 "응축 된"것이 아닙니다 ... –

관련 문제