2013-06-21 14 views
6

Mam mały fragment kodu, aby zrozumieć, jak zwracać wartości, które mogą być używane w innych sekcjach kodu. W dalszej części chcę tylko zwrócić zmienną z lub wartość drzemki. Ale to nie działa. Czy ktoś może mi pomóc zrozumieć, dlaczego to nie zadziała?Nie można zwrócić wartości z funkcji

import time 

def sleepy(reps, snooze): 
    t = [] 
    for x in range(reps): 
     x = time.time() 
     time.sleep(snooze) 
     y = time.time() 

     z = y - x 
     t.append(z) 
     print 'difference = ', z*1000 

    print 'total:', (sum(t)/reps) * 1000 
    return z 

sleepy(10, 0.001) 

print z # does not like this. 

Jeśli wydrukuję drzemkę, to także burczy. Dlaczego?

+2

@IcyFlame: Czy ** nie ** Kod zmiana w pytaniach!Cały problem polega na tym, że 'z' jest zwracany, ale nie zapisywany w zmiennej, nie dodawaj tej zmiennej. –

+0

@MartijnPieters, ale czuję, że skoro 'z' znajduje się w zasięgu pętli' for', to nie będzie widoczne aby go zwrócić – manas

+1

@silent_warrior: Nie, Python tworzy tylko nowy zakres dla modułów i funkcji (z listą, dyktowanie i ustawianie rozumienia, a także wyrażenia generatora i lambdy, będące wyspecjalizowanymi formami funkcji). Zmienne przypisane do pętli są widoczne w pozostałej części tego zakresu. –

Odpowiedz

8

to lokalna zmienna w Twojej funkcji sleepy(); nie jest widoczny poza tą funkcją.

Twoja funkcja zwraca wartość z; przypisać go:

slept = sleepy(10, 0.001) 
print slept 

kiedyś inną nazwę, żeby pokazać, że slept jest inna zmienna.

+0

_Twoja funkcja zwraca wartość z_ Czy masz na myśli to, że mimo, że z zostanie przekazane, to nie będzie miało zamierzonej wartości (y-x)? – manas

+1

@silent_warrior: Co sprawia, że ​​tak myślisz? –

1

Kiedy coś powrotu z funkcji, do której dzwonisz, składnia jest następująca:

p = sleepy(10,0.001) 
print p 
1

z i snooze są zmienne lokalne do funkcji.

Musisz przypisać wynik funkcji do zmiennej, aby była dostępna po wywołaniu funkcji.

2

Nie należy próbować drukować z lub snooze, ponieważ mają zakres ograniczony do definicji funkcji. Gdy wykonasz: sleepy(10,0.001), wówczas wartość 10 zostanie przypisana do reps, a wartość 0,001 zostanie przypisana do snooze.

A następnie rzeczy, które chcesz, są wykonywane za pomocą tych zmiennych. W międzyczasie tworzona jest nowa zmienna o nazwie z z zakresem wewnątrz definicji funkcji. A następnie ta wartość jest zwracana. I zaraz po wykonaniu ostatniej instrukcji wszystkie zmienne utworzone w definicji zostaną usunięte.

Więc trzeba zrobić:

a = sleepy(10,0.001) 

print a 

To będzie drukować wartość a która jest wartością, że wrócił z wewnątrz funkcji.

Ponadto można drukować z Jeśli zadeklarować je jako globalne, czyli:

import time 

def sleepy(reps, snooze): 
    t = [] 
    for x in range(reps): 
     x = time.time() 
     time.sleep(snooze) 
     y = time.time() 

     global z ##notice this line has been changed. 

     z = y - x 
     t.append(z) 
     print 'difference = ', z*1000 

    print 'total:', (sum(t)/reps) * 1000 

Teraz wartość zostać zwrócony jest w z i można go wydrukować jako tak:

sleepy(10,0.001) 

print z 
1

z jest lokalną zmienną. Jeśli nie zostanie zwrócona zmienna return z, to zmienna z zwróci wartość, która jest obecna w z, więc musisz ją zapisać w innej zmiennej i drukować że zmienna
lub można po prostu użyć

print sleepy(10, 0.001) 
Powiązane problemy