2013-06-21 19 views
6

Ho una piccola porzione di codice per capire come restituire i valori che possono essere utilizzati in altre sezioni del codice. Di seguito voglio solo restituire la variabile z, o il valore snooze. Ma non funziona. Per favore qualcuno può aiutarmi a capire perché questo non funzionerà?Impossibile restituire un valore da una funzione

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. 

Se si stampa snooze, si brontola anche. Perché?

+2

@IcyFlame: Do ** non ** codice di variazione di domande!L'intero problema è che 'z' viene restituito ma non memorizzato in una variabile, non andare in giro aggiungendo quella variabile. –

+0

@MartijnPieters ma ritengo che dato che 'z' è all'interno dell'ambito del ciclo' for', non sarà visibile per restituirlo – manas

+1

@silent_warrior: No, Python crea solo un nuovo ambito per moduli e funzioni (con lista, dettare e impostare la comprensione, così come espressioni generatore e lambda, essendo forme specializzate di funzioni). Le variabili assegnate a un ciclo sono visibili nel resto dello stesso ambito. –

risposta

8

z è una variabile locale nella funzione sleepy(); non è visibile al di fuori di tale funzione.

La funzione restituisce il valore di z; assegnare:

slept = sleepy(10, 0.001) 
print slept 

Ho usato un nome diverso per illustrare che slept è una variabile differente.

+0

_La tua funzione restituisce il valore di z_ vuoi dire che sebbene venga passato z, non avrà il valore previsto (y-x)? – manas

+1

@silent_warrior: cosa ti fa pensare? –

1

Quando ritorni qualcosa da una funzione che si sta chiamando, la sintassi è la seguente:

p = sleepy(10,0.001) 
print p 
1

z e snooze sono variabili locali alla funzione.

È necessario assegnare il risultato della funzione a una variabile per renderla disponibile dopo la chiamata di funzione.

2

Non provare a stampare z o snooze perché hanno un ambito limitato alla definizione della funzione. Quando si esegue l'operazione: sleepy(10,0.001), il valore 10 viene assegnato a reps e il valore 0,001 viene assegnato a snooze.

E poi le cose che vuoi sono fatte con queste variabili. Nel frattempo viene creata una nuova variabile denominata z con l'ambito all'interno della definizione della funzione. E poi questo valore viene restituito. E non appena è stata eseguita l'ultima istruzione, tutte le variabili create all'interno della definizione vengono eliminate.

Quindi è necessario fare:

a = sleepy(10,0.001) 

print a 

Ciò stamperà il valore di a che è il valore che avete restituito da dentro la funzione.

Inoltre è possibile stampare z se si dichiara come globale, vale a dire:

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 

Ora il valore da restituire è in z e si può stampare come così:

sleepy(10,0.001) 

print z 
1

z è una variabile locale. Quando si specifica return z, in realtà non restituisce la variabile z invece il suo restituisce il valore che è presente in z quindi è necessario memorizzarlo in un'altra variabile e stampare quella variabile
o si può semplicemente utilizzare

print sleepy(10, 0.001) 
Problemi correlati