2013-08-14 3 views
0

Je suis tout nouveau dans les langages de programmation et tout nouveau dans Python.Quelle est la signification de% en Python

J'ai toujours des difficultés à comprendre la signification de%, même si j'ai lu 3 petits tutoriels qui l'expliquent.

Quelqu'un peut-il décomposer ce que% fait exactement dans ce code?

for n in range(2, 10): 
    for x in range(2, n): 
     if n % x == 0: 
      print n, "=", x, "*", n/x 
+0

C'est l'opérateur modulo. Il renvoie le reste de la division. – squiguy

+0

L'avez-vous exécuté et observé le résultat? Aussi, jouez avec ceci dans l'interprète. – icedwater

+1

Pourquoi les downvotes? Cela semble être une question parfaitement raisonnable et claire d'un programmeur débutant. – vroomfondel

Répondre

0

% est l'opérateur de module: il retournera le reste de ce qui est fondamentalement une opération de division entière. 5 % 2 = 1, 5 % 5 = 0, etc. En maths entiers réguliers, tous les résultats sont arrondis vers le bas, donc 5/2 renverrait 2, même si deux correspond à cinq fois 2,5 fois. Bien sûr, 0 est un cas particulier et a un comportement indéfini dans la plupart des langues.

+0

Si quelqu'un qui a voté contre cette réponse aimerait faire un commentaire sur pourquoi, je l'apprécierais grandement. Suis-je incorrect? –

+1

Si je devais deviner la raison du downvote, la dernière phrase est ambiguë. Mais essayez de ne pas transpirer les downvotes non commentées autour de ces parties (oui, ça peut être ennuyeux, mais ça va). – msw

1

L'opérateur% dans ce cas est le Modulo operator

Comme cela est expliqué dans la spécification:

Le% (modulo) opérateur fournit le reste de la division du premier argument par le second. Les arguments numériques sont d'abord convertis en un type commun. Un argument zero right soulève l'exception ZeroDivisionError. Les arguments peuvent être des nombres à virgule flottante, par exemple 3,14% 0,7 est égal à 0,34 (puisque 3,14 vaut 4 * 0,7 + 0,34). L'opérateur modulo donne toujours un résultat avec le même signe que son deuxième opérande (ou zéro); la valeur absolue du résultat est strictement inférieur à la valeur absolue du second opérande

Dans ce cas, vous trouvez le reste de la division n/x

Votre exemple de code itère de n=2 à n=9. Pour chaque n, la boucle interne vérifie tous les diviseurs de n qui sont supérieurs à 1. Pour chaque diviseur, il imprime une ligne présentant une factorisation de n.

4

Pour les nombres, renvoie le reste de la division (comme indiqué par squiguy).

10/3 est égal à 3 avec un reste de 1.

Ainsi 10 % 3 == 1.


L'utilisation la plus courante consiste à vérifier la divisibilité. Par exemple, dans cette boucle, il vérifie si n est divisible par x. Par exemple, il peut être utile de faire quelque chose tous les n e temps.

for i in range(1, 10): 
    if i % 3 == 0: 
     print "I love cats and dogs" 
    else: 
     print "I love cats" 

Sorties,

I love cats 
I love cats 
I love cats and dogs 
I love cats 
I love cats 
I love cats and dogs 
I love cats 
I love cats 
I love cats and dogs 
-1

En arithmétique, si vous utilisez l'ensemble des nombres réels (ou les nombres rationnels), et vous diviser, disons, 1/2, vous pouvez obtenir 0.5 comme la réponse . Maintenant, si vous vous contraintez à utiliser uniquement les entiers, 1/2 retournera 0, car, dans les entiers, 1 n'est pas divisible par 2.Une façon de faire la division entière serait alors d'effectuer une division longue, de stocker la partie entière du résultat comme le résultat de la division entière, et de ne pas perdre de données, de stocker aussi le reste, ce qui est l'opérateur % résultats.

En Python, lorsque vous faites la division standard /, vous effectuez réellement la division en virgule flottante (donc les fractions peuvent être représentées), et donc 1/2 = 0.5. Maintenant, si vous avez utilisé la division entière //, alors 1//2 = 0. Pour obtenir cette valeur, python effectue simplement une division standard et prend la parole du résultat. Si vous deviez écrire manuellement l'algorithme de division sur papier, vous remarquerez que cette division a un reste de 1. L'opérateur de module % renvoie simplement ce reste.

Ainsi, 1/2 = 0.5, 1//2 = 0, et 1%2 = 1.

En d'autres termes, % renvoie le même reste que vous obtiendriez en cas de division longue.

 _0_ <-- result of (1//2) 
    2| 1 
    -0 
    --- 
     1 <- remainder, result of (1 % 2) 
+0

"' 1/2' retournerait '0', car' 2' ne peut diviser que '1' zéro fois" - Je ne suis pas sûr de comprendre ce que cela veut dire. – gersande

+1

Voir l'édition que j'ai faite, en l'expliquant dans le contexte d'un problème de longue division. Cette déclaration signifie que 1 n'est pas divisible par 2, si vous ne pouvez utiliser que des nombres entiers pour exprimer votre résultat. Et oui, // est une chose réelle, [docs Python] (http://docs.python.org/3.3/reference/expressions.html#binary-arithmetic-operations) – gos1

1

Pour les nombres, c'est l'opérateur de module. Pour les chaînes, c'est l'opérateur "string interpolation" (ou "string formating").

L'idiome spécifique if n % x == 0: dans le code correspond à un test de divisibilité. En d'autres termes, il en résultera True si n est divisible par x (c'est-à-dire que le reste de la division n/x est 0). Ou, si vous voulez, n est un multiple de x (il y a un entier y tel que x * y == n).

Pour expliquer mieux, nous allons analyser l'itération intérieure quand n (dans l'externe) est 6. Il serait équivalent à:

for x in range(2, 6): 
    if 6 % x == 0: 
     print n, "=", x, "*", n/x 

Avec une trace d'exécution:

x 6 % x 6 % x == 0 6/x  Output 
-- ----- ---------- ---------- ------ 
2  0  True   3  6 = 2 * 3 
3  0  True   2  6 = 3 * 2 
4  2  False Irrelevant <none> 
5  1  False Irrelevant <none> 

Vous pouvez continuer et essayer avec d'autres valeurs de n. Ou tous les 9 d'entre eux. Vous verrez que, comme 6, 8 est un cas intéressant aussi. Même un peu plus.

Questions connexes