2011-01-09 8 views
6

Po tym tutorial Mam następujący błąd, gdy y = 1; Używam Netbeans 6.5 dla Python. DziękiBłąd "niedopasowane wejście" oczekiwanie DEDENT

 y=1 
    ^

SyntaxError: Linia 8: 3 wejścia niedopasowane '' spodziewa DEDENT (temperatureconverter.py, linia 8)

następujące jest kod Pythona, format to dla mnie, dzięki.

__author__="n" 
__date__ ="$Jan 9, 2011 3:03:39 AM$" 

def temp(): 
    print "Welcome to the NetBeans Temperature Converter." 
    y=1 
    n=0 
    z=input("Press 1 to convert Fahrenheit to Celsius, 2 to convert Celsius to Fahrenheit, or 3 to quit:") 
    if z!=1 and z!=2 and z!=3: 
     e=input("Invalid input, try again?(y or n)") 
     if e==1: 
      t='' 
      temp() 
     if e==0: 
      t="Thank you for using the NetBeans Temperature Converter." 
    print "Celsius Fahrenheit" # This is the table header. 
    for celsius in range(0,101,10): # Range of temperatures from 0-101 in increments of 10 
    fahrenheit = (9.0/5.0) * celsius +32 # The conversion 
    print celsius, "  ", fahrenheit # a table row 
temp() 
+0

Można sformatować samodzielnie, używając przycisku {}. – Amnon

+0

Czy zawijam w nim kod? – pandoragami

+0

Nie, wybierz kod i kliknij przycisk z etykietą "{}". Będzie wciskać cały wybrany blok. Możesz zobaczyć wynik w oknie podglądu poniżej pola edycji. – Amnon

Odpowiedz

12

W sprawozdaniu print użyłeś 2 miejsca do wcięcia linii, natomiast w następnej umieścić 3 spacje.

Biała spacja jest znacząca w Pythonie. W szczególności, jeśli masz pewien poziom wcięcia w jednej linii, nie możesz po prostu użyć innego do następnego wiersza.

+0

Nie sądzę, że to tłumaczy błąd. Otrzymasz w tym przypadku "IndentationError: nieoczekiwane wcięcie", a nie "SyntaxError". –

+3

@Tim: Wierzę, że OP używał innej implementacji Pythona. Może Jython? – Amnon

0

Nieprzytomny problem zniknął z pełnym kodem. przepraszam

def temp(): 
    print "Welcome to the NetBeans Temperature Converter." 
    y=1 
    n=0 
    z=input("Press 1 to convert Fahrenheit to Celsius, 2 to convert Celsius to Fahrenheit, or 3 to quit:") 
    if z!=1 and z!=2 and z!=3: 
     e=input("Invalid input, try again?(y or n)") 
     if e==1: 
      t='' 
      temp() 
     if e==0: 
      t="Thank you for using the NetBeans Temperature Converter." 
    if z==1: # The user wishes to convert a temperature from Fahrenheit to Celsius 
     x=input("Input temperature in Fahrenheit:") 
     t=(x-32)/1.8 
     print "The temperature in Celsius is:" 
    if z==2: # The user wishes to convert a temperature from Celsius to Fahrenheit 
     x=input("Input temperature in Celsius:") 
     t=(x*1.8)+32 
     print "The temperature in Fahrenheit is:" 
    if z==3: # The user wishes to quit the application 
     t="Thank you for using the NetBeans Temperature Converter." 
    print t 
    if z==1 or z==2: 
     a=input("Do you want to perform another conversion?(y or n)") 
     if a==0: 
      t="Thank you for using the NetBeans Temperature Converter." 
     if a==1: 
      t= '' 
      temp() 
    print t 

temp() 
+0

Dlaczego używałbyś rekurencji, gdy prosta pętla jest lepsza ??? W python rekursji jest (prawie) zawsze zły wybór ... jest powolny, a także nie można mieć nieskończonej rekursji! Zamiast tego użyj prostej pętli while. Proszę również przeczytać [PEP8] (http://www.python.org/dev/peps/pep-0008/) i postępować zgodnie z jego konwencjami. W twoim przypadku wszystkie nazwy zmiennych są okropne, użyj proszę nazwy z samo-objaśniającymi. W większości części tego kodu powinieneś używać klauzul "if ... elif..else" i "sim" jeśli "s". Ostatnia rzecz: "input" jest źródłem wszelkiego zła, oczekuj tego od globali, więc znajdź alternatywny sposób na zrobienie tego. – Bakuriu

1

Dla dobra interesu tutaj jest rozszerzona wersja przykładu. Włączyłem pewną ilość magii, która może doprowadzić cię do głębszego zrozumienia Pythona!

I jak zawsze cieszę się z dalszego uczenia się - czy ktokolwiek inny ma sugestie, jak to powinno być rozszerzone i poprawione w poprawny sposób Python?

class MenuItem(object): 
    def __init__(self, fn, descr=None, shortcuts=None): 
     """ 
     @param fn:  callable, callback for the menu item. Menu quits if fn returns False 
     @param descr:  str,   one-line description of the function 
     @param shortcuts: list of str, alternative identifiers for the menu item 
     """ 
     if hasattr(fn, '__call__'): 
      self.fn = fn 
     else: 
      raise TypeError('fn must be callable') 

     if descr is not None: 
      self.descr = descr 
     elif hasattr(fn, '__doc__'): 
      self.descr = fn.__doc__ 
     else: 
      self.descr = '<no description>' 

     if shortcuts is None: 
      shortcuts = [] 
     self.shortcuts = set(str(s).lower() for s in shortcuts) 

    def __str__(self): 
     return self.descr 

    def hasShortcut(self,s): 
     "Option has a matching shortcut string?" 
     return str(s).lower() in self.shortcuts 

    def __call__(self, *args, **kwargs): 
     return self.fn(*args, **kwargs) 

class Menu(object): 
    def __init__(self): 
     self._opts = [] 

    def add(self, od, *args, **kwargs): 
     """ 
     Add menu item 

     can be called as either 
     .add(MenuItem) 
     .add(args, to, pass, to, MenuItem.__init__) 
     """ 

     if isinstance(od, MenuItem): 
      self._opts.append(od) 
     else: 
      self._opts.append(MenuItem(od, *args, **kwargs)) 

    def __str__(self, fmt="{0:>4}: {1}", jn='\n'): 
     res = [] 
     for n,d in enumerate(self._opts): 
      res.append(fmt.format(n+1, d)) 
     return jn.join(res) 

    def match(self, s): 
     try: 
      num = int(s) 
      if 1 <= num <= len(self._opts): 
       return self._opts[num-1] 
     except ValueError: 
      pass 

     for opt in self._opts: 
      if opt.hasShortcut(s): 
       return opt 

     return None 

    def __call__(self, s=None): 
     if s is None: 
      s = getStr(self) 
     return self.match(s) 

def fahr_cels(f): 
    """ 
    @param f: float, temperature in degrees Fahrenheit 
    Return temperature in degrees Celsius 
    """ 
    return (f-32.0)/1.8 

def cels_fahr(c): 
    """ 
    @param c: float, temperature in degrees Celsius 
    Return temperature in degrees Fahrenheit 
    """ 
    return (c*1.8)+32.0 

def getFloat(msg=''): 
    return float(raw_input(msg)) 

def getStr(msg=''): 
    print(msg) 
    return raw_input().strip() 

def doFahrCels(): 
    "Convert Fahrenheit to Celsius" 
    f = getFloat('Please enter degrees Fahrenheit: ') 
    print('That is {0:0.1f} degrees Celsius'.format(fahr_cels(f))) 
    return True 

def doCelsFahr(): 
    "Convert Celsius to Fahrenheit" 
    c = getFloat('Please enter degrees Celsius: ') 
    print('That is {0:0.1f} degrees Fahrenheit'.format(cels_fahr(c))) 
    return True 

def doQuit(): 
    "Quit" 
    return False 

def makeMenu(): 
    menu = Menu() 
    menu.add(doFahrCels, None, ['f']) 
    menu.add(doCelsFahr, None, ['c']) 
    menu.add(doQuit,  None, ['q','e','x','quit','exit','bye','done']) 
    return menu 

def main(): 
    print("Welcome to the NetBeans Temperature Converter.") 
    menu = makeMenu() 

    while True: 
     opt = menu() 

     if opt is None: # invalid option selected 
      print('I am not as think as you confused I am!') 
     else: 
      if opt() == False: 
       break 

    print("Thank you for using the NetBeans Temperature Converter.") 

if __name__=="__main__": 
    main() 
0

Zastosowanie Preferencje-> Pydev-> Edytor i odznacz wymienić zaczepy ze spacjami. Tabulatory mogą mieć 4 spacje pomimo powszechnej opinii, że powinny zostać zmienione na 8 spacji. Usuwa wszystkie błędy zatrzymania.

0

Tak właśnie zrobiłem to dla mnie. Grałem w Notatniku ++ z plikiem .py, który powstał w Eclipse, Eclipse używał spacji i korzystałem z kart. Wyglądało to tak samo, jak 4 spacje = 1 zakładka, więc użyłem spacji zamiast kart i wszystko było dobrze.

Powiązane problemy