पायथन में फ़ाइल के अंत में फ़ंक्शन की घोषणा करें


94

क्या किसी फ़ंक्शन को पहले पूरी तरह से परिभाषित किए बिना कॉल करना संभव है? यह प्रयास करते समय मुझे त्रुटि मिलती है: " function_name परिभाषित नहीं है"। मैं एक C ++ बैकग्राउंड से आता हूं इसलिए यह मुद्दा मुझे स्टम्प करता है।

काम करने से पहले समारोह की घोषणा:

def Kerma():
        return "energy / mass"    

print Kerma()

हालाँकि, फ़ंक्शन को पहले परिभाषित किए बिना कॉल करने का प्रयास परेशानी देता है:

print Kerma()

def Kerma():
    return "energy / mass"

C ++ में, इससे पहले कि आप इसके हेडर लगाएं, कॉल के बाद आप एक फंक्शन की घोषणा कर सकते हैं।

क्या मुझसे कोई चूक हो रही है?


5
पायथन में कोई "घोषित" नहीं है। वहाँ परिभाषा (जो पूरी होनी चाहिए) या कुछ भी नहीं है।
S.Lott

2
आप कहते हैं, "यह परेशानी देता है"। क्या आप इसे विस्तार में बताने में सक्षम हैं?
मार्टिन डेल वेकियो


मामले में किसी को भी सोच रहा है:Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
मुझे पता है कि यह सुपर पुराना है, लेकिन किसी ने फ़ंक्शन को एक अलग .pyफ़ाइल में डालने और उसे आयात करने की सिफारिश क्यों नहीं की है? क्या कुछ अनपेक्षित परिणाम हैं?
काइल

जवाबों:


145

पायथन में एक तरह से मुहावरेदार लेखन है:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

यह आपको उस क्रम में आपको कोड लिखने की अनुमति देता है जब तक आप फ़ंक्शन mainको अंत में कॉल करना जारी रखते हैं ।


4
@ मुहम्मद: जबकि यह एक व्यवहार्य दृष्टिकोण है, यह निश्चित रूप से पायथन में मुहावरेदार नहीं है। इसके विपरीत, आप देखेंगे कि अधिकांश mainकार्य आमतौर पर अंत में रखे जाते हैं।
एली बेन्द्स्की

14
@ एली बेंडरस्की: मैं प्रस्तुत करूंगा कि if __name__ == '__main__':स्विच सामान्य मुहावरेदार हिस्सा है।
S.Lott

2
@ एली: मुहावरेदार हिस्सा अंत में यदि खंड है: मॉड्यूल के शीर्ष स्तर पर कोई कोड नहीं है, तो अंत में एक मुख्य कार्य को लागू करें यदि मॉड्यूल मुख्य है
नेड बाचेल्डर

1
@Eli: मुहावरेदार हिस्सा है if ... __main__':। मैंने यह नहीं कहा कि mainबाकी कोड से ऊपर रखा जाना चाहिए। मैंने कहा कि महत्वपूर्ण हिस्सा _\_main__अंत में बुला रहा है , और इससे कोई फर्क नहीं पड़ता कि आप इसकी परिभाषा को कहां रखते हैं।
मुहम्मद अलकरौरी

2
यदि नाम == ' मुख्य ': स्विच के साथ यह अप्रासंगिक हो जाता है कि आप अपने कार्यों का आदेश कैसे देते हैं। यही सही (TM) है।
एमकेस्पर

18

जब एक पायथन मॉड्यूल (.py फ़ाइल) चलाया जाता है, तो उसमें शीर्ष स्तर के स्टेटमेंट वे दिखाई देने वाले क्रम में निष्पादित होते हैं, ऊपर से नीचे (शुरुआत से अंत तक)। इसका मतलब है कि जब तक आप इसे परिभाषित नहीं करते तब तक आप किसी चीज़ का संदर्भ नहीं दे सकते। उदाहरण के लिए निम्नलिखित दिखाई गई त्रुटि उत्पन्न करेगा:

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

कई अन्य भाषाओं के विपरीत, defऔर classबयान अजगर में निष्पादन योग्य हैं - न केवल घोषणात्मक - इसलिए आप aया तो bतब तक संदर्भ नहीं दे सकते जब तक कि ऐसा न हो और वे परिभाषित हों। यही कारण है कि आपके पहले उदाहरण में परेशानी है - आप Kerma()फ़ंक्शन का उल्लेख कर रहे हैं इससे पहले कि उसके defबयान को निष्पादित किया गया है और शरीर को संसाधित किया गया है और परिणामस्वरूप फ़ंक्शन ऑब्जेक्ट फ़ंक्शन के नाम के लिए बाध्य है, इसलिए यह स्क्रिप्ट में उस बिंदु पर परिभाषित नहीं है।

C ++ जैसी भाषाओं में प्रोग्राम आमतौर पर चलने से पहले प्रीप्रोसेस किए जाते हैं और इस संकलन के दौरान पूरे प्रोग्राम और किसी भी #includeफाइल को संदर्भित किया जाता है जिसे एक ही बार में पढ़ा और प्रोसेस किया जाता है। पाइथन के विपरीत, इस भाषा में घोषणात्मक वक्तव्य दिए गए हैं जो कार्यों के नाम और कॉलिंग अनुक्रम (या स्थिर प्रकार के चर) को घोषित करने की अनुमति देते हैं (लेकिन परिभाषित नहीं हैं), उपयोग करने से पहले ताकि जब कंपाइलर उनके नाम का सामना करता है, तो उनकी जांच करने के लिए पर्याप्त जानकारी हो उपयोग, जो मुख्य रूप से प्रकार की जाँच और प्रकार के रूपांतरणों को शामिल करता है, जिनमें से किसी को भी उनकी वास्तविक सामग्री या कोड बॉडी की आवश्यकता नहीं है।


ऐसा नहीं है कि एक गतिशील भाषा ऐसा नहीं कर सकती। पर्ल एक गतिशील भाषा है और आप इसे परिभाषित करने से पहले एक फ़ंक्शन को कॉल कर सकते हैं। ऐसा इसलिए है क्योंकि इसमें एक संकलन चरण और एक निष्पादित चरण है (हालांकि अजीब तरह से, लेकिन उपयोगी रूप से, आप संकलन चरण के दौरान कोड निष्पादित करने की व्यवस्था कर सकते हैं)। यह काम करता है: doit(); sub doit { print("I'm doing it!\n"); }
जॉन Deighan

9

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

सरल फेंक-दूर की स्क्रिप्ट के लिए "निष्पादन योग्य भाग" को अंत में रखने के लिए उपयोग किया जाता है, या बेहतर अभी तक, एक इंटरैक्टिव पायथन शेल का उपयोग करना सीखें।


1

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


1

यदि आप C ++ की तरह बनना चाहते हैं और एक फ़ंक्शन के अंदर सब कुछ का उपयोग करें। आप इस तरह से फ़ाइल के नीचे से पहला फ़ंक्शन कॉल कर सकते हैं:

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

इस तरह अजगर पूरी फाइल को पहले 'पढ़' रहा है और उसके बाद ही निष्पादन शुरू कर रहा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.