2013-06-21 33 views
6

コードの他の部分で使用できる値を返す方法を理解するための小さなコードがあります。以下では、変数zまたは値snoozeを返すだけです。しかし、それは動作しません。なぜこれがうまくいかないのか理解してくれる人がいらっしゃいますか?関数から値を返すことができません

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、 dictとset comprehensions、ジェネレータ式と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

zまたはsnoozeは、機能の定義に限定された有効範囲を持つため、印刷しないでください。次の場合:sleepy(10,0.001)の場合、値10はrepsに割り当てられ、値0.001はsnoozeに割り当てられます。

そして、あなたが望むものはこれらの変数で行われます。その間に、zという新しい変数が、関数の定義内にスコープとともに作成されます。そして、この値が返されます。最後のステートメントが実行されるとすぐに、定義内で作成されたすべての変数が削除されます。

だから、あなたが行う必要があります。これは、関数の内部から返される値ですaの値を出力します

a = sleepy(10,0.001) 

print 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) 
関連する問題