2013-06-21 16 views
6

से एक मूल्य लौटने में असमर्थ मैं कोड का एक छोटा सा टुकड़ा को समझने के लिए मानों कोड के अन्य वर्गों में इस्तेमाल किया जा सकता वापस लौटाना होगा। निम्नलिखित में मैं केवल वैरिएबल जेड, या मान स्नूज़ वापस करना चाहता हूं। लेकिन यह काम नहीं करता है। कृपया कोई मुझे समझने में मदद कर सकता है कि यह क्यों काम नहीं करेगा?एक समारोह

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. 

यदि मैं स्नूज़ प्रिंट करता हूं तो यह भी grumbles। ऐसा क्यों है?

+2

@IcyFlame: क्या सवाल में ** नहीं ** परिवर्तन कोड!पूरी समस्या यह है कि 'z' वापस आ गया है लेकिन एक चर में संग्रहीत नहीं है, उस चर को जोड़ने के आसपास मत जाओ। –

+0

@MartijnPieters लेकिन मुझे लगता है कि चूंकि 'z'' लूप 'के दायरे के अंदर है, इसलिए यह – manas

+1

@silent_warrior को वापस करने के लिए दृश्यमान नहीं होगा: नहीं, पायथन केवल मॉड्यूल और कार्यों के लिए एक नया दायरा बनाता है (सूची के साथ, निर्देश और सेट समझ, साथ ही जनरेटर अभिव्यक्तियों और भेड़ के बच्चे, कार्यों के विशेष रूपों के रूप में)। एक लूप में आवंटित चर के बाकी हिस्सों में दिखाई दे रहे हैं। –

उत्तर

8

z अपने sleepy() समारोह में एक स्थानीय चर रहा है; यह उस समारोह के बाहर दिखाई नहीं दे रहा है।

आपका समारोह z का मूल्य वापस करता है, असाइन करें:

slept = sleepy(10, 0.001) 
print slept 

मैं यहाँ एक अलग नाम का इस्तेमाल किया उदहारण देते हैं कि slept एक अलग चर रहा है।

+0

_ आपका फ़ंक्शन z_ के मान को वापस कर देता है, क्या आपका मतलब है कि हालांकि ज़ेड पास हो रहा है, लेकिन इसका इच्छित मान (y-x) नहीं होगा? – manas

+1

@silent_warrior: आपको क्या लगता है? –

1

जब आप एक समारोह आप बुला रहे हैं से कुछ लौटने के लिए, वाक्य रचना इस प्रकार है:

p = sleepy(10,0.001) 
print p 
1

z और snooze कार्य करने के लिए स्थानीय चर रहे हैं।

आप इसे समारोह कॉल के बाद उपलब्ध है एक चर करने के लिए समारोह का परिणाम सौंपने होंगे।

2

आप z या snooze मुद्रित करने के लिए, क्योंकि वे एक गुंजाइश है कि समारोह की परिभाषा तक सीमित है है की कोशिश नहीं करनी चाहिए। जब आप ऐसा करेंगे: 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) 
संबंधित मुद्दे