Вызывающая переменная, определенная внутри одной функции из другой функции

если у меня есть это:

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=" ")

Я уже определил lists, so oneFunction(lists) отлично работает.

моя проблема-это вызов word в строке 6. Я попытался определить word вне первой функции с тем же word=random.choice(lists[category]) определение, но это делает word всегда одно и то же, даже если я звоню oneFunction(lists).

Я хочу иметь возможность, каждый раз, когда я вызываю первую функцию, а затем вторую, иметь другой word.

могу я сделать это без определения того word за пределами oneFunction(lists)?

4 ответов


Да, вы должны подумать об определении как вашей функции в классе, так и сделать word членом. Это чище

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=" ")

как только вы создадите класс, вы должны создать его экземпляр для объекта и получить доступ к функциям-членам.

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

другим подходом было бы сделать oneFunction верните слово, чтобы вы могли использовать oneFunction вместо слова anotherFunction

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


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

и, наконец, вы также можете сделать anotherFunction, примите слово как параметр который вы можете пройти из результата вызова oneFunction

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

все в python рассматривается как объект, поэтому функции также являются объектами. Таким образом, вы также можете использовать этот метод.

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

def fun2():
    print(fun1.var)

fun1()
fun2()

print(fun1.var)

самый простой вариант-использовать глобальную переменную. Затем создайте функцию, которая получает текущее слово.

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

преимущество этого заключается в том, что, возможно, ваши функции находятся в разных модулях и нуждаются в доступе к переменной.


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)