2012-04-13 19 views
10

jeśli mam to:Wywoływanie zmienna zdefiniowana wewnątrz jednej funkcji z innej funkcji

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

już wcześniej zdefiniowane lists, więc oneFunction(lists) działa idealnie.

Mój problem jest wywołanie word w linii 6. Próbowałem zdefiniować word poza pierwszej funkcji z tym samym word=random.choice(lists[category]) definicji, ale sprawia, że ​​word zawsze taki sam, nawet jeśli zadzwonię oneFunction(lists).

Chcę móc, za każdym razem, gdy wywołuję pierwszą funkcję, a następnie drugą, mam inną word.

Czy mogę to zrobić bez definiowania tego word poza oneFunction(lists)?

+2

Dlaczego nie przekazać "słowa" jako argumentu do "anotherFunction"? Rozważ "def anotherFunction (word):" i wywołanie go odpowiednio. –

Odpowiedz

21

Tak, powinieneś pomyśleć o zdefiniowaniu zarówno swojej funkcji w klasie, jak i uczynieniu słowa członkiem. To jest czystsze

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

Po utworzeniu klasy należy utworzyć instancję obiektu i uzyskać dostęp do funkcji składowych.

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

Innym rozwiązaniem byłoby, aby oneFunction zwróci słowo tak, że można użyć oneFunction zamiast słowa w anotherFunction

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


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

I wreszcie, można również dokonać anotherFunction zaakceptować słowo jako parametru, który można przejść z wynikiem wywołania oneFunction

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

dziękuję! W pierwszym podejściu, proszę wyjaśnić mi dokładnie, co robi "własna" część? Czy to argument dla funkcji? – JNat

+0

@JNat: 'self' podaje odwołanie do bieżącego obiektu, podobnie jak to, co" this "(wskaźnik) lub" this "(zmienna) wyświetla w znanych językach OOP. – Abhijit

+0

Python mówi mi, że 'self' nie jest zdefiniowany ... dlaczego tak jest? czy muszę wcześniej zaimportować jakiś moduł lub coś takiego? – JNat

1
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) 
+0

Możesz przekazać zmienną słowa z pierwszej funkcji "oneFunction" do drugiej funkcji. Jednak myślę, że musisz najpierw ustawić inną funkcję, mniej otrzymasz błąd, "anotherFunction nie jest zdefiniowany". Zauważyłem też, że nie robisz nic ze zmienną 'letter', do której odwołujesz się w pętli for –

1

Najprostszą opcją jest użycie zmiennej globalnej. Następnie utwórz funkcję, która pobiera bieżące słowo.

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 

Zaletą tego jest to, że Twoje funkcje mogą znajdować się w różnych modułach i muszą mieć dostęp do zmiennej.

4

Wszystko w python jest traktowane jako obiekt, więc funkcje są również obiektami. Więc możesz również użyć tej metody.

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

def fun2(): 
    print(fun1.var) 

fun1() 
fun2() 

print(fun1.var) 
Powiązane problemy