2013-04-13 5 views
4

J'écris du code pour un projet pour déterminer la validité des cartes de crédit et j'ai frappé un mur, il semble que toutes les choses que j'ai essayées jusqu'ici ne sont pas travail.Python: Invalid Literal pour Int() Base 10

Ce me donne une erreur pour la fonction sumofodds où j = int (carte [i])

L'erreur est « non valide littérales pour Int() avec la base 10

Est-ce qu'il ya quelqu'un qui peut me donner quelques advce?

def sumofdoubles(): 
    card=input() 
    x=len(card) 
    summ=0 

    for i in range(x-2,-1,-2): 
     j=int(card[i]) 
     u=j+j 

     if u>9: 
      h=u/2 
      summ=summ+h 

    return(summ) 

def sumofevens(): 
    card=input() 
    x=len(card) 
    summ=0 

    for i in range(x-2,-1,-2): 
     j=int(card[i]) 
     u=j+j 
     if u<9: 
      summ=summ+u 

    return(summ) 


def sumofodds(): 
    summ=0 
    card=input() 
    x=len(card) 

    for i in range(x-1,-1,-2): 
     j=int(card[i]) 
     summ=summ+j 

    return(summ) 

def main(): 
    card=input() 
    length=len(card) 
    summ=0 

    while(card!="#####"): 
     if (card[0]=='4' or card[0]=='5' or card[0]=='6' or (card[0]=='3' and  card[1]=='1')): 
      dbls=sumofdoubles() 
      evens=sumofevens() 
      odds=sumofodds() 
      if((dbls+evens+odds)%10==0): 
       print("Valid") 

main() 

C'est tout le retraçage pour ceux qui se demandent

python test.py<s.input 
    File "test.py", line 52 in <module> 
     main() 
    File "test.py", line 48, in main 
     odds=sumofodds() 
    File "test.py", line 33, in sumofodds 
     j=int(card[i]) 
ValueError: invalid literal for int() with base 10: '#' 
+4

Quelle est la pleine retraçage? Qu'est-ce que vous tapez dans la console? – Blender

+2

Eh bien, sur l'un des appels '' j = int (carte [i]) '' l'entrée (c'est-à-dire, le caractère ith de la carte) n'est pas un nombre entier valide. Ma conjecture est que c'est un tiret ou un espace, dont l'un ou l'autre donnerait cette erreur. Sans plus de détails, il est difficile de dire exactement. – Blair

+0

ressemble à vous avez tapé un '# 'qui n'est pas un nombre ... –

Répondre

6

Eh bien, peu importe ce que vous avez fait, vous avez tapé quelque chose qui n'est pas un numéro de base 10. Cela inclut tout ce qui n'est pas un nombre de caractères ou d'espaces. Donc, ne tapez pas cela. :-)

Exemples:

>>> int('04.9') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '04.9' 

>>> int('4-') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '4-' 

>>> int("Jack") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'Jack' 

Mise à jour: Oui vous avez saisi un '#'. Ce n'est pas un nombre valide.

+0

Donc je suppose que ma boucle while ne fonctionne pas? – Frontier

+0

@James Cela ne fonctionne pas comme vous le pensez. Python est un langage impératif. Il ne vérifiera la valeur de la carte que lorsque le test est atteint. Il ne vérifiera pas la valeur de la carte à un autre moment. –

+0

bon débogage. – DJJ

1

Vous appelez input chaque fois que vous allez dans sumofodds, sumofevens ou sumofdoubles, donc chacun d'entre eux de travailler sur un numéro de carte de crédit distinct. Vous voulez probablement appeler seulement input dans main et devrait passer card comme argument à chacune de ces autres fonctions.

Vos fonctions pourraient alors ressembler à ceci:

def sum_of_odds(card): 
    x = len(card) 
    # ... 

# ... 

def main(): 
    while True: 
     card = input() 
     if card == '#####': 
      break 
     odds = sum_of_odds(card) 
     # ... 
+0

Est-il possible de mettre l'entrée en dehors de toutes les fonctions, parce que j'ai essayé et j'ai eu des erreurs comme: erreur locale non liée: la carte est référencée avant l'affectation – Frontier

+0

@James: Bien sûr, vous pouvez avec un global, mais ceux sont quelque peu mauvaises pratiques; J'ai édité ma réponse pour montrer du code qui utiliserait des arguments. – icktoofay

Questions connexes