web-dev-qa-db-fra.com

Comment fonctionne la fonction de plage de Python?

Si j'écris

for i in range(5):
      print i

Ensuite, il donne 0, 1, 2, 3, 4
Est-ce que cela signifie Python assigné 0, 1, 2, 3, 4 à i en même temps?
Cependant, si j'écrivais:

for i in range(5):
      a=i+1

Ensuite j'appelle un, ça donne seulement 5
Mais si j'ajoute '' imprimer un '' cela donne 1, 2, 3, 4, 5
Donc ma question est quelle est la différence ici?
Est-ce que je suis une chaîne ou une liste ou autre chose?

Ou peut-être que quelqu'un peut m'aider à trier:

for l in range(5):
    #vs,fs,rs are all m*n matrixs,got initial values in,i.e vs[0],fs[0],rs[0] are known
    #want use this foor loop to update them
    vs[l+1]=vs[l]+fs[l]
    fs[l+1]=((rs[l]-re[l])
    rs[l+1]=rs[l]+vs[l]
#then this code gives vs,fs,rs

Si je lance ce type de code, je n'obtiendrai la réponse que lorsque l = 5
Comment puis-je les faire démarrer en boucle?

c'est-à-dire que l = 0 a obtenu des valeurs pour vs [1], fs [1], rs [1],
puis l = 1 a obtenu des valeurs pour vs [2], rs [2], fs [2] ...... et ainsi de suite.
Mais python donne différents tableaux de fs, vs, rs, correspondent à différentes valeurs de l

Comment puis-je les faire d'une seule pièce?

23
user211037

Une boucle "for" dans la plupart, sinon la totalité, des langages de programmation est un mécanisme permettant d'exécuter plusieurs fois un morceau de code.

Ce code:

for i in range(5):
    print i

on peut penser à travailler comme ceci:

i = 0
print i
i = 1
print i
i = 2
print i
i = 3
print i
i = 4
print i

Donc, vous voyez, ce qui se passe n'est pas que i obtient la valeur 0, 1, 2, 3, 4 en même temps, mais plutôt séquentiellement.

Je suppose que lorsque vous dites "appeler un, cela ne donne que 5", vous voulez dire comme ceci:

for i in range(5):
    a=i+1
print a

cela affichera la valeur last qui a été donnée. À chaque itération de la boucle, l'instruction a=i+1 remplacera la dernière valeur que a avait avec la nouvelle valeur.

Le code s'exécute essentiellement de manière séquentielle, de haut en bas, et une boucle for est un moyen de faire revenir le code et quelque chose de nouveau, avec une valeur différente pour l'une des variables.

J'espère que cela répond à votre question.

Quand j'enseigne à quelqu'un la programmation (à peu près n'importe quel langage) j'introduis des boucles for avec une terminologie similaire à cet exemple de code:

for eachItem in someList:
    doSomething(eachItem)

... qui, assez commodément, est syntaxiquement valide Python.

La fonction Python range() simple renvoie ou génère une liste d'entiers à partir d'une borne inférieure (zéro, par défaut) jusqu'à (mais sans inclure) une borne supérieure, éventuellement dans incréments (étapes) d'un autre nombre (un, par défaut).

Donc range(5) retourne (ou éventuellement génère ) une séquence: 0, 1, 2, 3, 4 (jusqu'à mais sans inclure la limite supérieure).

Un appel à range(2,10) retournerait: 2, 3, 4, 5, 6, 7, 8, 9

Un appel à range(2,12,3) retournerait: 2, 5, 8, 11

Notez que j'ai dit, à quelques reprises, que la fonction range() de Python renvoie ou génère une séquence. Il s'agit d'une distinction relativement avancée qui ne sera généralement pas un problème pour un novice. Dans les anciennes versions de Python range() construit une liste (mémoire allouée pour elle et remplie de valeurs) et renvoyait une référence à cette liste. Cela pourrait être inefficace pour les grandes plages qui peut consommer un peu de mémoire et dans certaines situations où vous voudrez peut-être répéter sur une grande plage de nombres potentiellement mais qui étaient susceptibles de "break" sortir de la boucle plus tôt ( après avoir trouvé un élément particulier qui vous intéressait, par exemple).

Python prend en charge des moyens plus efficaces d'implémenter la même sémantique (de faire la même chose) via une construction de programmation appelée générateur. Au lieu d'allouer et de remplir la liste entière et de la renvoyer sous forme de structure de données statique, Python peut instancier un objet avec les informations requises (limites supérieure et inférieure et valeur de pas/incrément)) ... et renvoyer une référence à cela. L'objet garde ensuite la trace du numéro qu'il a renvoyé le plus récemment et calcule les nouvelles valeurs jusqu'à ce qu'il atteigne la limite supérieure (et à quel point il signale la fin de la séquence à l'appelant en utilisant une exception appelée "StopIteration" Cette technique (calcul dynamique des valeurs plutôt que d'un seul coup, à l'avance) est appelée "évaluation paresseuse".

D'autres constructions du langage (telles que celles sous-jacentes à la boucle for) peuvent alors fonctionner avec cet objet comme s'il s'agissait d'une liste.

Dans la plupart des cas, vous n'avez pas besoin de savoir si votre version de Python utilise l'ancienne implémentation de range() ou la plus récente basée sur des générateurs. Vous pouvez simplement l'utiliser et soyez heureux. Si vous travaillez avec des plages de millions d'éléments ou que vous créez des milliers de plages différentes de milliers chacune, vous remarquerez peut-être une baisse des performances pour l'utilisation de range() sur une ancienne version de Python. dans ces cas, vous pouvez repenser votre conception et utiliser des boucles while, ou créer des objets qui implémentent la sémantique "d'évaluation paresseuse" d'un générateur, ou utiliser la version xrange() de la fonction range() si votre version de Python l'inclut, ou la fonction range() d'une version de Python qui utilise implicitement les générateurs).

Des concepts tels que les générateurs et les formes plus générales d'évaluation paresseuse imprègnent la programmation Python lorsque vous allez au-delà des bases. Ce sont généralement des choses que vous n'avez pas à connaître pour les tâches de programmation simples mais qui deviennent important lorsque vous essayez de travailler avec des ensembles de données plus volumineux ou dans des limites plus strictes (temps/performances ou limites de mémoire, par exemple).

19
Jim Dennis
for i in range(5):

est le même que

for i in [0,1,2,3,4]:
7
Josh Pearce

range(x) renvoie une liste de nombres de 0 à x - 1.

>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>> range(4)
[0, 1, 2, 3]

for i in range(x): exécute le corps (qui est print i dans votre premier exemple) une fois pour chaque élément de la liste renvoyée par range(). i est utilisé à l'intérieur du corps pour faire référence à l'élément "courant" de la liste. Dans ce cas, i fait référence à un entier, mais il peut être de n'importe quel type, selon l'objet sur lequel vous bouclez.

6
Bastien Léonard

La fonction range vous donnera une liste de nombres, tandis que la boucle for parcourra la liste et exécutera le code donné pour chacun de ses éléments.

for i in range(5):
      print i

Cela exécute simplement print i cinq fois, pour i compris entre 0 et 4.

for i in range(5):
      a=i+1

Cela exécutera a=i+1 cinq fois. Puisque vous écrasez la valeur de a à chaque itération, à la fin, vous n'obtiendrez que la valeur de la dernière itération, soit 4 + 1.

Liens utiles:
http://www.network-theory.co.uk/docs/pytut/rangeFunction.html
http://www.ibiblio.org/swaroopch/byteofpython/read/for-loop.html

0
Konamiman

Il est en boucle, le problème est probablement dans la partie de l'impression ...

Si vous ne trouvez pas la logique où le système s'imprime, ajoutez simplement ce qui suit à l'endroit où vous voulez que le contenu sorte:

for i in range(len(vs)):
    print vs[i]
    print fs[i]
    print rs[i]
0
Santi