2013-06-21 97 views
6

我有一小段代碼,以瞭解如何返回可用於代碼其他部分的值。在下面我只想返回變量z或者數值貪睡。但它不起作用。請有人能幫助我理解爲什麼這不起作用?無法從函數返回值

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. 

如果我打印打盹它也抱怨。這是爲什麼?

+2

@IcyFlame:不要在提問** **不改變代碼!整個問題是'z'被返回,但沒有存儲在一個變量中,不要繞過添加該變量。 –

+0

@MartijnPieters,但我覺得既然'z'在'for'循環的範圍內,它將不可見返回 – manas

+1

@silent_warrior:不,Python只爲模塊和函數創建一個新的作用域(使用list,字典和設置理解,以及生成器表達式和lambda,作爲函數的特殊形式)。在該範圍的其餘部分中可以看到循環中分配的變量。 –

回答

8

z是您的sleepy()函數中的局部變量;它在該功能之外是不可見的。

您的函數的返回值爲z;它分配:

slept = sleepy(10, 0.001) 
print slept 

我用不同的名字在這裏說明slept是不同的變量。

+0

_您的函數確實會返回z_的值嗎?您的意思是,雖然z正在通過,但它不會具有預期值(y-x)? – manas

+1

@silent_warrior:是什麼讓你覺得呢? –

1

當你從你調用一個函數返回的東西,語法如下:

p = sleepy(10,0.001) 
print p 
1

zsnooze是局部變量的函數。

您需要將函數的結果分配給變量,以便在函數調用後使其可用。

2

您不應該嘗試打印zsnooze,因爲它們的作用域僅限於函數的定義。當你這樣做時:sleepy(10,0.001)那麼值10被分配給reps並且值0.001被分配給snooze

然後你想要的東西就是用這些變量完成的。同時,在函數的定義中創建一個名爲z的新變量。然後返回這個值。只要最後一條語句執行完畢,那麼在定義內部創建的所有變量都將被刪除。

所以你必須做到:

a = sleepy(10,0.001) 

print a 

這將打印的a其價值是你從裏面的函數的返回值。

此外,如果你把它聲明爲全球可打印Z,那就是:

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 

現在值要返回爲z,你可以打印它像這樣:

sleepy(10,0.001) 

print z 
1

z是一個局部變量。當你return z它實際上沒有返回變量z而不是它的 返回值存在於z所以你需要將它存儲在另一個變量和打印可變
或者你可以只使用

print sleepy(10, 0.001)