J'essaie d'écrire une fonction Python que sur le premier appel, renvoie un 1. sur le deuxième appel, renvoie A 2. Le troisième, A 3. etc. P> Actuellement, j'ai obtenu cette utilisation Variable globale: p> Lorsque vous appelez la fonction trois fois: p> Il renvoie les valeurs attendues: p> Mais, j'ai lu que c'est une mauvaise pratique d'utiliser des variables globales. Donc, je me demandais si le même résultat pouvait être atteint sans utiliser de globaux. P> Toute suggestion? P> Merci pour votre aide. P> P>
6 Réponses :
Vous pouvez utiliser des attributs de fonction: ou fermetures: p>
NonLocal code> est Python3 seulement IIRC. WRT / à l'astuce "Attribut de fonction", je ne le recommanderais certainement pas, car il est vraiment fragile (ajouter
g = f; f = lambda: Aucune code> Après
f code> F code> Vous découvrirez pourquoi).
Utilisation d'une fermeture: à l'aide d'une classe (la solution la plus évidente dans un OOPL): p> Utilisation d'un générateur ( Pas directement appelable, vous devrez utiliser la méthode .NEXT () code>): p>
Votre code générateur devrait probablement utiliser Suivant (inc); Suivant (inc) code> au lieu de
inc.Next () code> parce que l'ancien fonctionne dans Python2.6 + et également à Python3, tandis que ce dernier ne fonctionne que dans python2.x
@Bakuriu Oui Désolé, je dois toujours passer à PY3K
Je fournirai une solution alternative à la réponse de Sergey: exploit Par défaut mutable Arguments!
def f(_=[0]): _[0] += 1 return _[0]
Pouvez-vous utiliser un objet? alors vous pouvez l'appeler comme une fonction après l'instanciation: p>
Vous pouvez également utiliser Generator. Sortie: P> >>> y = yrange(3)
>>> y
<generator object yrange at 0x401f30>
>>> y.next()
0
>>> y.next()
1
>>> y.next()
2
>>> y.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Vous pouvez également améliorer le générateur, le rendre plus flexible: