0
votes

Quelle est la raison pour laquelle j'obtiens un "NameError: name 'int_to_roman' is not defined"? Comment résoudre ça?

J'ai essayé d'ajouter une classe à cette calculatrice de base en chiffres romains, mais lorsque j'essaye d'exécuter la fonction à partir de la classe, j'obtiens une NameError. Je ne suis pas sûr de ce qui se passe.

J'ai essayé de changer l'ordre du code, mais rien d'autre car je ne sais pas quelle est la raison de l'erreur.

De plus, je ne 'Je ne sais pas pourquoi mais je ne peux pas insérer la partie classe (ci-dessous) dans le bloc de code.

class Roman_Number():
    roman_numeral_table = [
    ("M", 1000), ("CM", 900), ("D", 500),
    ("CD", 400), ("C", 100),  ("XC", 90),
    ("L", 50),   ("XL", 40),  ("X", 10),
    ("IX", 9),   ("V", 5),    ("IV", 4),
    ("I", 1)
    ]


    r = input('If you want to go from Roman to Number, enter "1." If you want to go from Number to Roman, enter "2"')

    if r == 1:
        roman_to_int()
    else:
        int_to_roman()

    def int_to_roman():
        number = int(input('Provide Number: '))
        if number < 1 or number > 3999:
            print('Number must be inbetween 1 and 3999')
        else:
            print('Valid Number')

        roman_numerals = []
        for numeral, value in roman_numeral_table:
            while value <= number:
                number -= value
                roman_numerals.append(numeral)

        print(''.join(roman_numerals))

        def roman_to_int():
            pass

Je m'attends à ce qu'il commence à exécuter int_to roman (), mais je' Je reçois juste une erreur.

J'ai changé l'ordre et maintenant j'obtiens un "roman_numeral_table is not defined." Pourquoi et comment résoudre ce problème?


2 commentaires

Définissez la fonction avant de l'appeler.


Python n'a pas pu trouver la fonction int_to_roman () . Vous pouvez simplement déplacer la définition de la fonction avant de l'appeler, et cela devrait résoudre votre problème.


3 Réponses :


1
votes

Vous obtenez cette erreur, car python l'exécute bloque dans l'ordre de la syntaxe, vous devez définir une fonction avant de pouvoir l'appeler / la citer. Essayez ceci:

def roman_to_int():
      pass

def int_to_roman():
      number = int(input('Provide Number: '))
      if number < 1 or number > 3999:
          print('Number must be inbetween 1 and 3999')
      else:
          print('Valid Number')


class Roman_Number():
    roman_numeral_table = [
    ("M", 1000), ("CM", 900), ("D", 500),
    ("CD", 400), ("C", 100),  ("XC", 90),
    ("L", 50),   ("XL", 40),  ("X", 10),
    ("IX", 9),   ("V", 5),    ("IV", 4),
    ("I", 1)
    ]

    r = input('If you want to go from Roman to Number, enter "1." If you want to go from Number to Roman, enter "2"')

    if r == 1:
        roman_to_int()
    else:
        int_to_roman()

        roman_numerals = []
        for numeral, value in roman_numeral_table:
            while value <= number:
                number -= value
                roman_numerals.append(numeral)

        print(''.join(roman_numerals))


2 commentaires

Y a-t-il une raison pour laquelle vous avez fait le def roman_numerals = [] pour numeral, valeur dans roman_numeral_table: while value <= number: number - = value roman_numerals.append (numeral) print (''. Join (roman_numerals)) en dehors de int_to_roman ( ) fonction?


Principalement parce que je préfère avoir les 3 fonctions définies comme des arguments séparés. Ainsi, lorsqu'une fonction en appelle une autre, elle n'est pas définie dans une autre fonction. Sinon, vous devez être très prudent avec cela. Voici quelques informations supplémentaires stackoverflow.com / questions / 27930038 /…



0
votes

Python est un langage interprété. Pour cette raison, la fonction doit être définie avant d'être appelée la première fois. Déplacez simplement le bloc def int_to_roman (): directement sous la définition roman_numeral_table et le code devrait fonctionner correctement.

Comme ceci:

class Roman_Number():
    roman_numeral_table = [
    ("M", 1000), ("CM", 900), ("D", 500),
    ("CD", 400), ("C", 100),  ("XC", 90),
    ("L", 50),   ("XL", 40),  ("X", 10),
    ("IX", 9),   ("V", 5),    ("IV", 4),
    ("I", 1)
    ]

    def int_to_roman():
        number = int(input('Provide Number: '))
        if number < 1 or number > 3999:
            print('Number must be inbetween 1 and 3999')
        else:
            print('Valid Number')

        roman_numerals = []
        for numeral, value in roman_numeral_table:
            while value <= number:
                number -= value
                roman_numerals.append(numeral)

        print(''.join(roman_numerals))

        def roman_to_int():
            pass


    r = input('If you want to go from Roman to Number, enter "1." If you want to go from Number to Roman, enter "2"')

    if r == 1:
        roman_to_int()
    else:
        int_to_roman()

p >


2 commentaires

Merci! Je n'ai pas pensé que l'ordre importait.


J'ai beaucoup lutté avec ça moi-même quand j'ai appris le python. Cela n'a pas d'importance dans les langages conformes tels que Java. Mais en python, c'est le cas.



0
votes

Changez votre code en quelque chose comme ça, cela devrait fonctionner. Python vous oblige à définir une fonction avant de l'appeler.

    class Roman_Number():
        roman_numeral_table = [
        ("M", 1000), ("CM", 900), ("D", 500),
        ("CD", 400), ("C", 100),  ("XC", 90),
        ("L", 50),   ("XL", 40),  ("X", 10),
        ("IX", 9),   ("V", 5),    ("IV", 4),
        ("I", 1)
        ]


        r = input('If you want to go from Roman to Number, enter "1." If you want to go from Number to Roman, enter "2"')
        def int_to_roman():
            number = int(input('Provide Number: '))
            if number < 1 or number > 3999:
                print('Number must be inbetween 1 and 3999')
            else:
                print('Valid Number')

            roman_numerals = []
            for numeral, value in roman_numeral_table:
                while value <= number:
                    number -= value
                    roman_numerals.append(numeral)

            print(''.join(roman_numerals))

            def roman_to_int():
                pass

        if r == 1:
            roman_to_int()
        else:
            int_to_roman()


1 commentaires

Merci! Je ne pensais pas que l'ordre comptait.