web-dev-qa-db-fra.com

Variable d'appel définie dans une fonction à partir d'une autre fonction

si j'ai ceci:

def oneFunction(lists):
    category=random.choice(list(lists.keys()))
    Word=random.choice(lists[category])

def anotherFunction():
    for letter in Word:              #problem is here
        print("_",end=" ")

J'ai déjà défini lists, donc oneFunction(lists) fonctionne parfaitement.

Mon problème appelle Word à la ligne 6. J'ai essayé de définir Word en dehors de la première fonction avec la même définition Word=random.choice(lists[category]), mais cela fait Word toujours le même, même si j'appelle oneFunction(lists).

Je veux pouvoir, chaque fois que j'appelle la première fonction puis la seconde, avoir un Word différent.

Puis-je faire cela sans définir que Word en dehors de la oneFunction(lists)?

18
JNat

Oui, vous devriez penser à définir à la fois votre fonction dans une classe et à faire de Word un membre. C'est plus propre

class Spam:
    def oneFunction(self,lists):
        category=random.choice(list(lists.keys()))
        self.Word=random.choice(lists[category])

    def anotherFunction(self):
        for letter in self.Word:              
        print("_",end=" ")

Une fois que vous avez créé une classe, vous devez l'instancier en un objet et accéder aux fonctions membres.

s = Spam()
s.oneFunction(lists)
s.anotherFunction()

Une autre approche serait de faire en sorte que oneFunction retourne le Word afin que vous puissiez utiliser oneFunction au lieu de Word dans anotherFunction

>>> def oneFunction(lists):
        category=random.choice(list(lists.keys()))
        return random.choice(lists[category])


>>> def anotherFunction():
        for letter in oneFunction(lists):              
        print("_",end=" ")

Et enfin, vous pouvez également faire anotherFunction, accepter Word comme paramètre que vous pouvez passer du résultat de l'appel de oneFunction

>>> def anotherFunction(words):
        for letter in words:              
        print("_",end=" ")
>>> anotherFunction(oneFunction(lists))
34
Abhijit

Tout dans python est considéré comme un objet, les fonctions sont donc également des objets. Vous pouvez donc également utiliser cette méthode.

def fun1():
    fun1.var = 100
    print(fun1.var)

def fun2():
    print(fun1.var)

fun1()
fun2()

print(fun1.var)
14
Python Learner

L'option la plus simple consiste à utiliser une variable globale. Créez ensuite une fonction qui obtient le mot actuel.

current_Word = ''
def oneFunction(lists):
    global current_Word
    Word=random.choice(lists[category])
    current_Word = Word

def anotherFunction():
    for letter in get_Word():              
          print("_",end=" ")

 def get_Word():
      return current_Word

L'avantage de cela est que vos fonctions sont peut-être dans différents modules et doivent accéder à la variable.

1
0n10n_
def anotherFunction(Word):
    for letter in Word:              
        print("_", end=" ")

def oneFunction(lists):
    category = random.choice(list(lists.keys()))
    Word = random.choice(lists[category])
    return anotherFunction(Word)
1
Allan Mwesigwa