10
votes

Fonction simple qui renvoie un nombre incrémenté de 1 sur chaque appel, sans global?

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: xxx

Lorsque vous appelez la fonction trois fois: xxx

Il renvoie les valeurs attendues: XXX

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.

Toute suggestion?

Merci pour votre aide.


0 commentaires

6 Réponses :


7
votes

Vous pouvez utiliser des attributs de fonction: xxx

ou fermetures: xxx


1 commentaires

NonLocal 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 Après f F Vous découvrirez pourquoi).



10
votes

Utilisation d'une fermeture: xxx

à l'aide d'une classe (la solution la plus évidente dans un OOPL): xxx

Utilisation d'un générateur ( Pas directement appelable, vous devrez utiliser la méthode .NEXT () ): xxx


2 commentaires

Votre code générateur devrait probablement utiliser Suivant (inc); Suivant (inc) au lieu de inc.Next () 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



4
votes

Je fournirai une solution alternative à la réponse de Sergey: exploit Par défaut mutable Arguments!

def f(_=[0]):
    _[0] += 1
    return _[0]


0 commentaires

2
votes

Pouvez-vous utiliser un objet? xxx

alors vous pouvez l'appeler comme une fonction après l'instanciation: xxx


0 commentaires

2
votes

Vous pouvez également utiliser Generator. XXX PRE>

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


0 commentaires

0
votes

Vous pouvez également améliorer le générateur, le rendre plus flexible: xxx


0 commentaires