পাইথনে ফাইলের শেষে ফাংশন ঘোষণা করুন


94

প্রথমে পুরোপুরি সংজ্ঞা না দিয়ে কোনও ফাংশন কল করা কি সম্ভব? এটি চেষ্টা করার সময় আমি ত্রুটিটি পেয়েছি: " ফাংশন_নাম সংজ্ঞায়িত করা হয়নি"। আমি একটি সি ++ পটভূমি থেকে আসছি তাই এই সমস্যাটি আমাকে স্ট্যাম্প করে।

কাজ করার আগে ফাংশনটি ঘোষণা:

def Kerma():
        return "energy / mass"    

print Kerma()

তবে প্রথমে এটির সংজ্ঞা না দিয়ে ফাংশনটি কল করার চেষ্টা করা সমস্যা দেয়:

print Kerma()

def Kerma():
    return "energy / mass"

সি ++ এ আপনি একবার কলটির শিরোনাম স্থাপনের পরে কোনও ফাংশন ঘোষণা করতে পারেন can

আমি কি এখানে কিছু মিস করছি?


4
পাইথনে "ঘোষণা" নেই। সংজ্ঞা আছে (যা অবশ্যই সম্পূর্ণ হতে হবে) বা কিছুই নেই।
এস্লট

4
আপনি বলেন, "এটি সমস্যা দেয়"। আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন?
মার্টিন ডেল ভেকিও


যদি কেউ ভাবছেন:Kerma is an acronym for "kinetic energy released per unit mass"
আনোন

4
আমি জানি এটি অত্যন্ত পুরানো, তবে কেন কেউ আলাদা .pyফাইলগুলিতে ফাংশন রাখার এবং সেটি আমদানির পরামর্শ দেয়নি ? কিছু অনিচ্ছাকৃত পরিণতি আছে কি?
কাইল

উত্তর:


145

পাইথনের এক ধরণের প্রতিমূর্তি যা লিখছে তা হ'ল:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

এটি যতক্ষণ আপনি mainশেষ পর্যন্ত ফাংশনটি কল করে চলেছেন ততক্ষণ আপনার পছন্দ মতো ক্রমে আপনার কোডটি লেখার অনুমতি দেয় ।


4
@ মুহম্মদ: যদিও এটি একটি কার্যকর উপায়, এটি অবশ্যই পাইথনে মূর্তিমান নয়। একেবারে বিপরীত, আপনি লক্ষ্য করবেন বেশিরভাগ mainকার্যকারিতা সাধারণত শেষে থাকে।
এলি বেন্ডারস্কি

15
@ এলি বেন্ডারস্কি: আমি জমা দিয়েছি যে if __name__ == '__main__':স্যুইচটি হ'ল সাধারণ প্রতিচ্ছবি ।
এস .লট

4
@Eli: মডিউল উপরের স্তরে কোন কোড, তারপর প্রধান ফাংশন যদি মডিউল ডাকা শেষে: কথ্য অংশ শেষে যদি দফা হয় প্রধান
নেড ব্যাচেল্ডার

4
@ এলি: মূখ্য অংশটি হ'ল if ... __main__':। আমি বলিনি যে mainবাকি কোডের উপরে থাকা উচিত above আমি বলেছিলাম যে গুরুত্বপূর্ণ অংশটি _\_main__শেষে ডাকা হচ্ছে , এবং আপনি তার সংজ্ঞাটি কোথায় রেখেছেন তাতে কিছু আসে যায় না।
মুহাম্মদ আলকারৌরি

4
যদি সঙ্গে নাম == ' প্রধান ': সুইচ এটা অপ্রাসঙ্গিক হয়ে কিভাবে আপনি আপনার ফাংশন অর্ডার। এটি সঠিক জিনিস (টিএম) করতে হবে।
এমকেস্পার

18

যখন পাইথন মডিউল (.py ফাইল) চালানো হয়, তখন শীর্ষ স্তরের স্টেটমেন্টগুলি উপরে উপস্থিত থেকে নীচে (শেষ হওয়া পর্যন্ত) প্রদর্শিত হবে তার ক্রমে কার্যকর করা হয়। এর অর্থ আপনি কিছু সংজ্ঞা না দেওয়া পর্যন্ত আপনি কিছু উল্লেখ করতে পারবেন না। উদাহরণস্বরূপ নিম্নলিখিতটি প্রদর্শিত ত্রুটি উত্পন্ন করবে:

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

অন্যান্য অনেক ভাষা, সঙ্গে ভিন্ন defএবং classবিবৃতির এক্সিকিউটেবল হয় পাইথন-না শুধু ঘোষণামূলক-যাতে আপনি উল্লেখ থাকতে পারে না পারেন aবা bনা হওয়া পর্যন্ত যে এরকম তারা সংজ্ঞায়িত করছি। এ কারণেই আপনার প্রথম উদাহরণটিতে সমস্যা রয়েছে - আপনি বিবৃতিটি কার্যকর Kerma()করার আগে defএবং বডিটি প্রক্রিয়া করার আগে এবং ফাংশনটির নামের সাথে আবদ্ধ ফলশ্রুতি ফাংশন অবজেক্টের আগে আপনি ফাংশনটি উল্লেখ করছেন, সুতরাং এটি স্ক্রিপ্টের সেই বিন্দুতে সংজ্ঞায়িত হয়নি।

সি ++ এর মতো ভাষাগুলিতে প্রোগ্রামগুলি সাধারণত চালানোর আগে প্রাক #includeপ্রসেস করা হয় এবং এই সংকলনের পর্যায়ে পুরো প্রোগ্রাম এবং যে কোনও ফাইল এতে উল্লিখিত হয় তা একবারে একবারে পড়া এবং প্রক্রিয়াজাত করা হয়। পাইথনের বিপরীতে, এই ভাষার বর্ণনামূলক বিবৃতি রয়েছে যা ব্যবহারের পূর্বে ফাংশনগুলির নাম এবং কলিং ক্রম (বা স্থির ধরণের ভেরিয়েবলগুলি) ঘোষিত করার (তবে সংজ্ঞায়িত নয়) মঞ্জুরি দেয় যাতে কম্পাইলার যখন তাদের নামের মুখোমুখি হয় তখন এটি পরীক্ষা করার জন্য পর্যাপ্ত তথ্য থাকতে পারে ব্যবহার, যা প্রাথমিকভাবে টাইপ চেকিং এবং টাইপ রূপান্তরগুলিকে অন্তর্ভুক্ত করে যার মধ্যে তাদের প্রকৃত বিষয়বস্তু বা কোডের সংস্থাগুলি এখনও সংজ্ঞায়িত করা প্রয়োজন।


এটি এমন নয় যে একটি গতিশীল ভাষা এটি করতে পারে না। পার্ল একটি গতিশীল ভাষা এবং আপনি কোনও ফাংশনটিকে সংজ্ঞায়নের আগে কল করতে পারেন। এর কারণ এটি একটি সংকলন পর্ব এবং একটি এক্সিকিউট পর্ব (যদিও অদ্ভুতভাবে, তবে দরকারীভাবে, আপনি সংকলন পর্বের সময় কোড কার্যকর করতে পারেন)। এটি কাজ করে: doit(); sub doit { print("I'm doing it!\n"); }
জন দিঘান

9

পাইথনে এটি সম্ভব নয়, তবে খুব খোলামেলাভাবে শীঘ্রই আপনি খুঁজে পাবেন যে এটির কোনও প্রয়োজন নেই। কোড লেখার পাইথোনিক উপায়টি হল আপনার প্রোগ্রামকে ক্লাস এবং ফাংশন সংজ্ঞায়িতকারী মডিউলগুলিতে বিভক্ত করা এবং একটি একক "প্রধান মডিউল" যা অন্য সমস্তগুলি আমদানি করে এবং চালায়।

সাধারণ থ্রো-অ্যাও স্ক্রিপ্টগুলি শেষে "এক্সিকিউটেবল অংশ" স্থাপন করতে অভ্যস্ত হয়ে উঠুন বা আরও ভাল, ইন্টারেক্টিভ পাইথন শেলটি ব্যবহার করতে শিখুন।


1

পাইথন হ'ল ডায়নামিক ল্যাঙ্গুয়েজ এবং দোভাষা সর্বদা ভেরিয়েবলের (ফাংশন, ...) তাদের অবস্থানের মুহুর্তের হিসাবে গ্রহণ করে। এমনকি কিছু কিছু-ব্লকগুলিতে ফাংশনগুলি পুনরায় সংজ্ঞায়িত করতে এবং প্রতিটি সময়কে আলাদাভাবে কল করতে পারেন। এজন্য তাদের ডাকার আগে আপনাকে সেগুলি সংজ্ঞায়িত করতে হবে।


1

আপনি যদি সি ++ এর মতো হতে ইচ্ছুক হন এবং কোনও ফাংশনের ভিতরে সমস্ত কিছু ব্যবহার করেন। আপনি ফাইলের নীচ থেকে প্রথম ফাংশনটি কল করতে পারেন:

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()

অজগরটি পুরো ফাইলটি প্রথমে 'পড়া' এবং তারপরে সম্পাদন শুরু করা হয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.