2012-03-11 14 views
7

मैं पाइथन हार्ड हार्ड सीखने में व्यायाम 41 तक हूं, और मुझे इस तथ्य के आस-पास अपने मस्तिष्क को लपेटने में वास्तव में कठिन समय है कि पूरी चीज सिर्फ एक फ़ंक्शन पर चलती है क्योंकि इसे किसी मान के रूप में असाइन किया गया है चर। मुझे यह बताते हुए कि यह कैसे काम करता है एक छोटे से स्क्रिप्ट ऊपर लिखा था, और यह करता है:क्यों foo = function() पायथन में फ़ंक्शन चलाता है?

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants() 
thing = shorts() 
के साथ परिणाम जा रहा है

:

Put on some pants! 
And don't forget your underwear! 

तो स्पष्ट रूप से ऐसा होता है, लेकिन मैं नहीं समझ सकता क्यों भाषा इस तरह से काम करती है - भाषा के पीछे तर्क क्या है जो इसे ऑपरेटिंग का एक मूल्यवान तरीका बनाता है। मुझे लगता है कि को समझने के लिए आगे बढ़ना मेरे लिए सहायक होगा क्यों यह "बस जिस तरह से काम करता है" की बजाय यह है।

स्पष्टता के लिए: मैं पूछ रहा हूं (मुझे लगता है) फ़ंक्शन क्यों चल रहा है, जब मैं जो कुछ कर रहा हूं वह इसे किसी चीज़ के लिए मान के रूप में असाइन कर रहा है। प्रिंट स्टेटमेंट बस वहां हैं इसलिए मैं देख सकता हूं कि फ़ंक्शन वास्तव में चल रहा है।

यह तथ्य यह है कि मैं कभी भी नहीं कर रहा हूँ वास्तव में

पैंट चल रहा है() शॉर्ट्स()

है कि मुझे भ्रमित कर रहा है।

एक अत्याचार सादृश्य बनाने के लिए, यदि मुझे-पाक-कुकीज़ घर पर "कुकीज़()" थे, और मैं शनिवार को कुकीज़ बनाने के लिए थे, मैं अंत में विश्वास हो सकता है कि

शनिवार = कुकीज़()

लेकिन सिर्फ सोच नहीं वास्तव में पाक कुकीज़ रूप में एक ही "हे, शनिवार कुकी दिन है" है ... तो क्यों सिर्फ

कह शनिवार = कुकीज़()

वास्तव में सह बेक करता कुछ बाद के उपयोग के लिए परिवर्तनीय "कुकीज़()" के साथ बस शनिवार को स्थापित करने के बजाय ठीक है?

+5

तुम शायद भ्रमित '' return' साथ print'। – JJJ

+2

मुझे लगता है कि जुहाना सही हो सकता है। क्या आप 'ज़ैप' को "कुछ पैंट पर रखो" का मूल्य रखने की उम्मीद कर रहे हैं? यदि ऐसा है तो 'प्रिंट' को' वापसी 'में बदलें और उसके बाद इसे निर्दिष्ट करने के बाद' प्रिंट ज़ैप 'बदलें। – chooban

+1

हां, स्पष्ट रूप से आपकी उम्मीदों को भाषा के साथ गलत तरीके से ग़लत किया गया है। आप क्या उम्मीद कर रहे थे –

उत्तर

16

जब आप ब्रांड्स () का उपयोग करते हैं तो फ़ंक्शन को कॉल किया जाता है। यदि आप फ़ंक्शन को पुन: उपयोग करने के लिए फ़ंक्शन को असाइन करना चाहते हैं तो आपको वहां कोष्ठक को हटा देना चाहिए।

उदाहरण:

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants 
thing = shorts 

और फिर जब आप उन कार्यों कॉल करना चाहते हैं:

zap = pants() 

यह:

zap() 
thing() 
+0

तो पाइथन की आंखों में चीजों को() "रूपांतरित" चीजों में शामिल किया गया है, और पायथन उन कार्यों को तुरंत वापस करने का प्रयास करता है ताकि वे अपना वापसी मूल्य प्राप्त कर सकें? – JeanSibelius

+1

नहीं, जब आप उन्हें घोषित करते हैं तो उन्हें "रूपांतरित" करने में क्या होता है। पायथन में सबकुछ एक वस्तु है। एक समारोह एक "कॉल करने योग्य" वस्तु है। किसी ऑब्जेक्ट के रूप में आप इसे किसी वैरिएबल को किसी अन्य ऑब्जेक्ट को एक संपत्ति के रूप में असाइन कर सकते हैं, इसे पैरामीटर के रूप में पास कर सकते हैं, आदि। फिर जब आप इसे ** कॉल करते हैं, तो यह इसकी प्रक्रिया निष्पादित करता है। अधिक विस्तृत जानकारी के लिए, मैं सुझाव देता हूं कि आप पाइथन के [डेटा मॉडल] (http://docs.python.org/reference/datamodel.html) के बारे में पढ़ लें। –

+1

मेरी पिछली टिप्पणी में जोड़ना: '()' की उपस्थिति पाइथन को ** कॉल ** ऑब्जेक्ट को बताती है। यदि यह एक फ़ंक्शन निष्पादित किया जाएगा, यदि ऐसा नहीं है, तो यह अपवाद उठाएगा कि यह ऑब्जेक्ट कॉल करने योग्य नहीं है। चाहे फ़ंक्शन कुछ देता है या नहीं, आप पर निर्भर करता है और आपको क्या करना है। यदि आप किसी फ़ंक्शन का परिणाम किसी चर के लिए असाइन करना चाहते हैं, तो आपको अन्य उत्तरों में इंगित किए गए 'रिटर्न' का उपयोग करना होगा। अगर आप कुछ प्रिंट करना चाहते हैं, तो आप 'प्रिंट' का उपयोग कर सकते हैं और कुछ भी वापस करने की आवश्यकता नहीं है। –

2

zap = pants() फ़ंक्शन के रिटर्न वैल्यू को वैरिएबल पर बाध्य करेगा, इसलिए निश्चित रूप से फ़ंक्शन चलाया जाता है यदि आप इसे एक चर से बांधते हैं।

def foo(): 
    return 1 

var = foo() 
print var 

1 प्रिंट करेगा।

मुझे उम्मीद है कि इससे मदद मिलती है।

संपादित करें: यदि आप चर के मान को "कुछ पैंट पर डाल" की उम्मीद करते हैं, तो आप वास्तव में print और return को भ्रमित कर रहे हैं, क्योंकि लोगों ने टिप्पणियों में बताया था।

5

हालांकि ऐसा लगता है कि आपके काम कुछ भी वापस नहीं करते हैं, वे वास्तव में करते हैं। the Python.org documentation उद्धरण:

रिटर्न स्टेटमेंट किसी फ़ंक्शन से मूल्य के साथ लौटाता है। एक अभिव्यक्ति तर्क के बिना वापसी कोई नहीं देता है। एक समारोह के अंत से गिरने से कोई भी नहीं लौटाता है।

तो अपने कार्यों वास्तव में इस तरह दिखेगा:

def pants(): 
    print "Put on some pants!" 
    return None 

def shorts(): 
    print "And don't forget your underwear!" 
    return None 

आपका कार्य zap लिए जो कुछ भी pants रिटर्न (अर्थात pants() का मूल्य), और thing लिए जो कुछ भी shorts रिटर्न आवंटित। आपके मामले में, None दोनों हैं, लेकिन निश्चित रूप से यह कार्य (*) को समझने के लिए कार्यों को चलाया जाना चाहिए। Afterall, यह हो सकता है कि pants रिटर्न छलांग वर्षों के दौरान 42, और कहा कि shorts रिटर्न 'Foobar' जब भी कुछ यादृच्छिक संख्या जनरेटर "रोल" एक 6.


(*) विषयांतर: कार्यों "रन किया जाना चाहिए" यह चाहिए सार्वभौमिक रूप से सच नहीं माना जाता है। pure setting में, और पाइथन के विनिर्देशों को छोड़कर (जिसमें से मुझे बहुत कम पता है), एक कंपाइलर को एहसास हो सकता है कि दोनों फ़ंक्शन समान रूप से None हैं, और प्रोग्राम चलाने पर कोई कॉल नहीं होने का कारण बनता है। लेकिन एक ऐसा कार्य जो कुछ प्रिंट करता है (या निरीक्षण करता है कि वर्तमान वर्ष एक लीप वर्ष है, या मर जाता है) शुद्ध नहीं होगा।

1

जब दुभाषिया फ़ंक्शन नाम देखता है() यह जानता है कि यह उस कार्य को निष्पादित करना है।

आप क्या कर रहे हैं यह कह रहा है "इन चरों के लिए इन कार्यों का परिणाम असाइन करें"।

लेकिन चूंकि आप उन कार्यों से किसी भी मूल्य को वापस नहीं कर रहे हैं, तो आप चर में कुछ भी नहीं देख रहे हैं।

हालांकि, क्योंकि आपके पास एक प्रिंट स्टेटमेंट है, आप दुभाषिया को उन कार्यों को निष्पादित कर रहे हैं क्योंकि यह उस फ़ंक्शन के परिणामों को चर निर्दिष्ट करने का प्रयास करता है।

0

आपका कार्यों के नाम के बाद कोष्ठक की वजह से कहा जाता है फ़ंक्शन पैंट को कॉल करता है और परिणाम को ज़ैप में डाल देता है। यदि आपने इसके बजाय ऐसा किया था:

zap = pants 

तब ज़ैप अब पैंट फ़ंक्शन को संदर्भित करेगा।

और अगर आप सिर्फ

pants() 

तो पैंट समारोह भी कहा जाता जायेगा लिखा था, लेकिन परिणाम (जो कोई भी है) कभी नहीं एक चर में डाल दिया गया होता।

6

तो जाहिर है ऐसा होता है, लेकिन मुझे समझ में नहीं आता कि भाषा इस तरह क्यों काम करती है - भाषा के पीछे तर्क क्या है जो इसे ऑपरेटिंग का एक मूल्यवान तरीका बनाता है। मुझे लगता है कि यह मेरे लिए उपयोगी होगा कि यह समझने के लिए आगे बढ़ेगा कि यह क्यों है, "जिस तरह से यह काम करता है।"

भाषा को फ़ंक्शन को कॉल करने के कार्य और कार्य के बीच अंतर करने के लिए कुछ तरीके की आवश्यकता है। यही है कि कोष्ठक प्रदान करते हैं।

f = foo 

अब f फ़ंक्शन से ही जुड़ा हुआ है। फ़ंक्शन foo को f() द्वारा निष्पादित किया जा सकता है।

f = foo() 

इस समारोह foo कॉल और f को वापसी मान बांधता है।

ध्यान दें कि क्या आप किसी नाम पर वापसी मूल्य को बाध्य करते हैं या नहीं, यह अप्रासंगिक है। बस

foo() 

फ़ंक्शन निष्पादित करेगा लेकिन वापसी मूल्य को केवल अनदेखा कर दिया जाएगा।

+0

तो, यदि मैं सही ढंग से समझ रहा हूं, तो पाइथन फ़ंक्शन के रूप में() के बाद किसी भी फ़ंक्शन के रूप में निष्पादित करने का प्रयास करेगा, भले ही फ़ंक्शन() फ़ंक्शन के स्थान पर फ़ंक्शन के रिटर्न वैल्यू का उपयोग कर - ऐसा कुछ जो वर्तमान संदर्भ में चर का प्रतिनिधित्व करता है? – JeanSibelius

0

अपने प्रश्न से मैं क्या लगता है कि आप चाहते हैं zap मूल्य "Put on some pants!" और thing मूल्य "And don't forget your underwear!" होगा होगा। यदि यह आपकी समस्या है तो चलिए इसकी चर्चा करें। अन्यथा आपको आगे पढ़ने की आवश्यकता नहीं है क्योंकि मैंने अभी उन सभी के बारे में चर्चा की है।

चलिए इसे कुछ मजेदार बनाते हैं। जब आप किसी फ़ंक्शन को परिभाषित करते हैं, तो आप एक मशीन बनाने की तरह होते हैं जो आप इसे करना चाहते हैं। अब चलो एक मशीन के बारे में सोचें कि जब आप इसमें कुछ खाना देते हैं, तो यह उन्हें चॉप करता है और ... कुछ नहीं करता! मेरा मतलब है कि मैंने उस मशीन को खाद्य पदार्थों काटने और कुछ भी नहीं बनाया! आपको अपना कटा हुआ खाना वापस नहीं मिलेगा, लेकिन वास्तव में यह आपके भोजन को कटा हुआ है जैसा आपने इसे बनाया था।

अब, जैसे आप अपने कटे हुए भोजन को वापस चाहते हैं, आप एक और मशीन बनाते हैं जो आपका खाना लेती है, उन्हें चॉप करती है और उन्हें आपके पास वापस कर देती है। फलदायक मशीन, है ना? ;-)

वे सभी प्रोग्रामिंग या गणित में कार्यों के लिए सच हैं (हालांकि मुझे गणित में कोई शून्य कार्य नहीं पता है!: पी)। जब आप फ़ंक्शन बना रहे हों, तो आपको यह बताना होगा कि यह कुछ काम करता है या यह कुछ काम करता है और परिणाम देता है। फ़ंक्शन बताने का तरीका return कथन है। आपके कार्यों में, आपने अभी कुछ करने के लिए कहा है। और वह print "......" है तो कार्य करता है। आप अंत में() को कॉल करते हैं और उनका काम करता है, वे इसे प्रिंट करते हैं। लेकिन जैसा कि मैंने कहा था कि यदि आप इसे परिणाम देने के लिए नहीं कहते हैं, तो यह नहीं होगा। और क्योंकि यह किसी भी परिणाम को वापस नहीं कर रहा है, चर के साथ कुछ भी नहीं दिया जाएगा (उसे None के साथ भ्रमित न करें)। जब आपने उन पंक्तियों को लिखा (यदि दुभाषिया में) या स्क्रिप्ट चलाते हैं, तो आप उन पंक्तियों को मुद्रित देखेंगे लेकिन आपके zap और thing के पास कोई मूल्य नहीं है।

तो इसे कैसे ठीक करें? उन्हें चर के लिए लाइनों को वापस करने के लिए कहें। कार्यों को बताने के लिए, print कथन return कथन के साथ बदलें।और तुम क्या पता प्रयोग करने के लिए, तुम क्या जानते के बारे में अपने ज्ञान का सच है :-)

आशा है कि यह मदद करता है के बारे में पता करने के लिए कोई बात नहीं :-)

संबंधित मुद्दे