web-dev-qa-db-fra.com

int objet n'est pas iterable?

inp = int(input("Enter a number:"))

for i in inp:
    n = n + i;
    print (n)

... génère une erreur: 'int' object is not iterable

Je voulais connaître le total en ajoutant chaque chiffre, par exemple 110. 1 + 1 + 0 = 2. Comment faire cela?

Merci

13
3zzy

Tout d'abord, perdez cet appel en int - vous convertissez une chaîne de caractères en un entier, ce qui n'est pas ce que vous voulez (vous voulez traiter chaque caractère comme son propre numéro). Changement:

inp = int(input("Enter a number:"))

à:

inp = input("Enter a number:")

Maintenant que inp est une chaîne de chiffres, vous pouvez la parcourir, chiffre par chiffre.

Ensuite, attribuez une valeur initiale à n - en l'état actuel du code, vous obtiendrez une NameError puisque vous ne l'initialisez jamais. Vous voulez probablement n = 0 avant la boucle for.

Ensuite, considérons à nouveau la différence entre un caractère et un entier. Vous avez maintenant:

n = n + i;

qui, outre le point-virgule inutile (Python est une syntaxe basée sur l'indentation), tente de faire l'addition du caractèrei au entier n - qui ne fonctionnera pas! Alors, ceci devient

n = n + int(i)

transformer le caractère '7' en entier 7, et ainsi de suite.

18
Alex Martelli

essayer:

for i in str(inp):

Cela va parcourir les caractères dans la représentation sous forme de chaîne. Une fois que vous avez chaque personnage, vous pouvez l'utiliser comme un numéro séparé.

8
Gavin H

peut-être que vous essayez de 

for i in range(inp)

Je viens d'avoir cette erreur parce que je n'utilisais pas range ()

4
johnjullies

Note latérale: si vous voulez obtenir la somme de tous les chiffres, vous pouvez simplement faire

print sum(int(digit) for digit in raw_input('Enter a number:'))
3
Eric O Lebigot

Eh bien, vous voulez traiter la chaîne représentant le nombre, en itérant sur les chiffres, pas le nombre lui-même (qui est une entité abstraite qui pourrait être écrite différemment, comme "CX" en chiffres romains ou "0x6e" hexadécimal (tous deux pour 110) ou peu importe).

Donc:

inp = input('Enter a number:')

n = 0
for digit in inp:
     n = n + int(digit)
     print(n)

Notez que le n = 0 est requis (quelque part avant l'entrée dans la boucle). Vous ne pouvez pas prendre la valeur d'une variable qui n'existe pas (et le côté droit de n = n + int(digit) prend la valeur de n). Et si n existe à ce moment-là, cela pourrait contenir quelque chose de complètement différent de vos besoins actuels, ce qui entraînerait un comportement inattendu. vous devez vous prémunir contre cela.

Cette solution ne tente pas de garantir que l'entrée fournie par l'utilisateur est en réalité un nombre. Je laisserai ce problème à votre réflexion (indice: tout ce dont vous avez besoin se trouve dans le tutoriel sur Python ).

3
Michał Marczyk

Les instructions for .. in supposent que vous utilisiez un type pour lequel un itérateur est défini. Un type simple int n'a pas d'itérateur. 

1
Brian R. Bondy

Comme ghill l'avait déjà mentionné

inp = int(input("Enter a number:"))

n = 0
for i in str(inp):
    n = n + int(i);
    print n

Lorsque vous parcourez quelque chose, le mot-clé est "IN", pensez-y toujours comme une liste de quelque chose. Vous ne pouvez pas passer en boucle par un entier simple. Par conséquent, ce n'est pas itérable. 

1
CppLearner

Prenez votre entrée et assurez-vous que c'est une chaîne pour qu'elle soit itérable.

Effectuez ensuite une compréhension de la liste et modifiez chaque valeur en un nombre.

Maintenant, vous pouvez faire la somme de tous les nombres si vous voulez:

inp = [int(i) for i in str(input("Enter a number:"))]
print sum(inp)

Ou, si vous voulez vraiment voir la sortie pendant son exécution:

def printadd(x,y):
    print x+y
    return x+y

inp = [int(i) for i in str(input("Enter a number:"))]
reduce(printadd,inp)
0
Brian

N'en faites pas une int(), mais faites-en une range() pour résoudre ce problème.

inp = range(input("Enter a number: "))
0
戴東華

Vous pouvez essayer de changer for i in inp: En for i in range(1,inp): L'itération ne fonctionne pas avec un seul int. Au lieu de cela, vous devez lui fournir une plage d'exécution.

0
Yaakov Freedman

Une réponse possible à la question de OP-s ("Je voulais connaître le total en ajoutant chaque chiffre, par exemple 110. 1 + 1 + 0 = 2. Comment faire cela?") Est d'utiliser la fonction intégrée divmod ()

num = int(input('Enter a number: ')
nums_sum = 0

while num:
    num, reminder = divmod(num, 10)
    nums_sum += reminder
0
Aivar Paalberg