যদি ফাংশন A কেবলমাত্র ফাংশন বি দ্বারা প্রয়োজনীয় হয় তবে খ এর ভিতরে কি সংজ্ঞা দেওয়া উচিত? [বন্ধ]


147

সহজ উদাহরণ। দুটি পদ্ধতি, একটি অন্যের কাছ থেকে ডেকে আনা:

def method_a(arg):
    some_data = method_b(arg)

def method_b(arg):
    return some_data

পাইথনে আমরা defঅন্যটির ভিতরে ঘোষণা করতে পারি def। সুতরাং, যদি method_bপ্রয়োজন হয় এবং কেবলমাত্র থেকে কল করা হয় method_a, তবে আমার method_bভিতরে ঘোষণা করা উচিত method_a? এটার মত :

def method_a(arg):

    def method_b(arg):
        return some_data

    some_data = method_b(arg)

নাকি আমার এড়ানো উচিত?


7
যদি আপনি সত্যিই মজার কিছু না করে থাকেন তবে আপনার অন্যের ভিতরে কোনও ক্রিয়া সংজ্ঞায়িত করার দরকার নেই need তবে, আপনি যা করার চেষ্টা করছেন তা দয়া করে বিশদটি জানান, যাতে আমরা আরও কার্যকর উত্তর সরবরাহ করতে পারি
ইন্সপেক্টর

6
আপনি কি বুঝতে পারছেন না যে দ্বিতীয় উদাহরণটি ভিন্ন, কারণ আপনি কল করেন না method_b? (@ ইনস্পেক্টর: আপনার কঠোরভাবে কথা বলার দরকার নেই, তবে আপনি যখন কিছুটা ক্রিয়াকলাপের প্রোগ্রামিং, বিশেষত বন্ধ হয়ে যাওয়ার সময় তখন প্রচুর উপকারী)।

3
@ ডেলান: আমি মনে করি আপনার বোঝানো হয়েছে " আপনার কড়া কথা বলার দরকার নেই, তবে ..."
মার্টিনিউ

4
অভ্যন্তরীণ ফাংশনগুলির জন্য ব্যবহারের কেসগুলি লিঙ্কে আশ্চর্যজনকভাবে সংক্ষিপ্ত করা হয়েছে: https://realpython.com/blog/python/inner-funitions- কি-are-they-good-for/ জন্য । আপনার ব্যবহার যদি কোনও ক্ষেত্রেই ফিট না করে তবে এটিকে আরও ভাল করে এড়িয়ে চলুন।

1
দুর্দান্ত প্রশ্ন তবে মনে হচ্ছে এর মতো কোনও সঠিক উত্তর নেই ...
মায়ু 36

উত্তর:


136
>>> def sum(x, y):
...     def do_it():
...             return x + y
...     return do_it
... 
>>> a = sum(1, 3)
>>> a
<function do_it at 0xb772b304>
>>> a()
4

এটা কি যেটা তুমি খুজছো? একে ক্লোজার বলা হয় ।


14
এটি অনেক ভাল ব্যাখ্যা। আমি আমার উত্তরটি মুছে ফেলেছি
পাইফঞ্চ

কেন শুধু ডিফ যোগ (x, y) করবেন না: x + y রিটার্ন করবেন?
আমের

4
@ মঙ্গো: ধারণাটি প্রকাশের জন্য এটি কেবল খেলনার উদাহরণ - প্রকৃত ব্যবহারে যা do_it()সম্ভবত একক returnবিবৃতিতে কিছু গাণিতিক দ্বারা পরিচালিত হতে পারে তার চেয়ে কিছুটা জটিল হতে পারে ।
মার্টিনিউ

2
@ মঙ্গো আপনার প্রশ্নের উত্তর কিছুটা দরকারী উদাহরণ দিয়ে দিয়েছেন। stackoverflow.com/a/24090940/2125392
CivFan

10
এটি প্রশ্নের উত্তর দেয় না।
হুনসু

49

আপনি এটি করে সত্যই বেশি কিছু অর্জন করতে পারেন না, বাস্তবে এটি ধীর method_aহয়ে যায় কারণ এটি প্রতিবার যখন বলা হয় তখন এটি অন্য কার্যটি সংজ্ঞায়িত করে এবং পুনরায় সংকলন করে। এটি দেওয়া, এটি সম্ভবত একটি বেসরকারী পদ্ধতি - এটি বোঝাতে কেবল আন্ডারস্কোর দিয়ে ফাংশনটির নামটি উপস্থাপন করা ভাল _method_b

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

হালনাগাদ:

এখানে বাসা বাঁধার ধীরে ধীরে (পাইথন ৩. 3..১ ব্যবহার করে) এখানে প্রমাণ রয়েছে যদিও স্বীকৃতভাবে এই তুচ্ছ মামলায় খুব বেশি কিছু করা হয়নি:

setup = """
class Test(object):
    def separate(self, arg):
        some_data = self._method_b(arg)

    def _method_b(self, arg):
        return arg+1

    def nested(self, arg):

        def method_b2(self, arg):
            return arg+1

        some_data = method_b2(self, arg)

obj = Test()
"""
from timeit import Timer
print(min(Timer(stmt='obj.separate(42)', setup=setup).repeat()))  # -> 0.24479823284461724
print(min(Timer(stmt='obj.nested(42)', setup=setup).repeat()))    # -> 0.26553459700452575

দ্রষ্টব্য আমি selfআপনার নমুনা ফাংশনগুলিকে আরও বাস্তব পদ্ধতির মতো করে তুলতে কিছু যুক্তি যুক্ত করেছি (যদিও method_b2এখনও প্রযুক্তিগতভাবে Testশ্রেণীর কোনও পদ্ধতি নয় )। এছাড়াও নেস্টেড ফাংশনটি প্রকৃতপক্ষে সেই সংস্করণে বলা হয়, আপনার মত নয়।


21
এটি বাহ্যিক ফাংশনটি যতবার ডাকে ততবার অভ্যন্তরীণ ফাংশনটি সম্পূর্ণরূপে সংকলন করে না, যদিও এটির জন্য কোনও ফাংশন অবজেক্ট তৈরি করতে হবে, যা একটু সময় নেয়। অন্যদিকে, ফাংশনটির নামটি স্থানীয় পরিবর্তে বিশ্বব্যাপী এক হয়ে যায়, সুতরাং ফাংশনটি কল করা তত দ্রুত। আমার বিচারে সময় অনুসারে এটি মূলত বেশিরভাগ সময় ধোয়া; আপনি যদি অনেকবার কল করেন তবে এটি অভ্যন্তরীণ ফাংশনটির সাথে আরও দ্রুত হতে পারে।
বদ্ধ করুন

7
হ্যাঁ, আপনার অভ্যন্তরীণ ফাংশনে একাধিক কল প্রয়োজন। আপনি যদি এটিকে একটি লুপে ডাকেন, বা কয়েকগুণ বেশি, ফাংশনটির স্থানীয় নাম রাখার সুবিধাটি ফাংশন তৈরির ব্যয়কে ছাড়িয়ে যেতে শুরু করবে। আমার ট্রায়ালগুলিতে, আপনি যখন অভ্যন্তরীণ ফাংশনটি প্রায় 3-4 বার কল করেন তখন এটি ঘটে। অবশ্যই, ফাংশনটির স্থানীয় নাম নির্ধারণ করে আপনি একই সুবিধা পেতে পারেন (প্রায় কোনও ব্যয় ছাড়াই), method_b = self._method_bএবং তারপরে method_bপুনরাবৃত্তি বৈশিষ্ট্য অনুসন্ধানগুলি এড়াতে কল করুন । (এমনটি ঘটে যে আমি ইদানীং
প্রচুর স্টাফের সময়সামগ্রী করছি

3
@ জ্যানডল: হ্যাঁ, এটা সত্য। আমি আমার টাইমিং পরীক্ষাটি পরিবর্তন করেছি যাতে এটি গৌণ ফাংশনে 30 টি কল হয়েছিল এবং ফলাফলগুলি ঘুরে দেখা গেছে। আপনার এই উত্তরটি দেখার সুযোগ পাওয়ার পরে আমি আমার উত্তরটি মুছে ফেলব। জ্ঞানার্জনের জন্য ধন্যবাদ
মার্টিনিউ

2
কেবল আমার -1 ব্যাখ্যা করতে চেয়েছিলাম কারণ এটি তথাকথিত একটি উত্তর তবেই: আমি এটিকে একটি -1 দিয়েছি কারণ এটি একটি তুচ্ছ পারফরম্যান্স পার্থক্যের উপর ফোকাস রাখে (বেশিরভাগ পরিস্থিতিতে কোড অবজেক্ট তৈরি কেবল কার্য সম্পাদনের সময়টির একটি অংশ গ্রহণ করবে) )। এই ক্ষেত্রেগুলি বিবেচনা করার জন্য গুরুত্বপূর্ণ যেটি কোনও ইনলাইন ফাংশনটি কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের উন্নতি করতে পারে কিনা তা আমি মনে করি এটি প্রায়শই ঘটে কারণ আপনাকে প্রাসঙ্গিক কোডটি খুঁজতে ফাইলগুলি সন্ধান / স্ক্রোল করতে হবে না।
Blixt

2
@ ব্ল্যাক্স্ট: আমার মনে হয় আপনার যুক্তি ত্রুটিযুক্ত (এবং ভোট-ভোটকে অন্যায়) কারণ এটি খুব কমই সম্ভাবনা যে একই শ্রেণীর অন্য পদ্ধতিটি খুব সহজেই একই শ্রেণীর অন্য একজনের থেকে খুব দূরের "যদিও এটি নেস্টেড না (এবং অত্যন্ত সম্ভাবনা কম) একটি ভিন্ন ফাইল হতে হবে)। এছাড়াও আমার উত্তরের প্রথম বাক্যটি হ'ল "আপনি এটি করে আসলেই খুব বেশি লাভ করেন না" যা এটি একটি তুচ্ছ পার্থক্য নির্দেশ করে।
মার্টিনো

27

কোনও ফাংশনের অভ্যন্তরের কোনও ফাংশন সাধারণত ক্লোজারগুলির জন্য ব্যবহৃত হয় ।

(ক নেই বিবাদের অনেক বেশি ঠিক তোলে একটি অবসান একটি অবসান ।)

বিল্ট-ইন ব্যবহার করে এখানে একটি উদাহরণ sum()। এটি startএকবার সংজ্ঞায়িত করে এবং তখন থেকে এটি ব্যবহার করে:

def sum_partial(start):
    def sum_start(iterable):
        return sum(iterable, start)
    return sum_start

ব্যাবহৃত হচ্ছে:

>>> sum_with_1 = sum_partial(1)
>>> sum_with_3 = sum_partial(3)
>>> 
>>> sum_with_1
<function sum_start at 0x7f3726e70b90>
>>> sum_with_3
<function sum_start at 0x7f3726e70c08>
>>> sum_with_1((1,2,3))
7
>>> sum_with_3((1,2,3))
9

অন্তর্নির্মিত পাইথন বন্ধ

functools.partial বন্ধের উদাহরণ is

পাইথন ডক্স থেকে এটি মোটামুটি সমান:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

(উত্তরের জন্য নীচে @ ব্যবহারকারী 225312 এ কুদোস I আমি এই উদাহরণটি খুঁজে বের করা আরও সহজ বলে মনে করি এবং আশা করি আমের আমের মন্তব্যটির উত্তরটি সহায়তা করবে))


-1 হ্যাঁ, এগুলি সাধারণত ক্লোজার হিসাবে ব্যবহৃত হয়। এখন প্রশ্নটি আবার পড়ুন। তিনি মূলত জিজ্ঞাসা করেছিলেন যে তিনি যে ধারণাটি দেখিয়েছেন তা খ ক্ষেত্রে ব্যবহার করা যেতে পারে কিনা। তাকে বলা যে এটি প্রায়শই কেসের জন্য ব্যবহৃত হয় এটি একটি খারাপ উত্তর নয়, তবে এই প্রশ্নের জন্য ভুল। উদাহরণস্বরূপ এনক্যাপসুলেশনের জন্য উপরোক্ত কাজ করা ভাল কিনা তা তিনি আগ্রহী।
মায়ু 36

@ মাইউ ৩36 ন্যায্য কথা বলতে গেলে, প্রশ্নটি বরং উন্মুক্ত - প্রতিটি সম্ভাব্য মামলার উত্তর দেওয়ার পরিবর্তে, আমি মনে করি কোনওটির দিকে ফোকাস করা ভাল। এছাড়াও প্রশ্ন খুব পরিষ্কার নয়। উদাহরণস্বরূপ, এটি দ্বিতীয় উদাহরণটিতে ক্লোজারকে বোঝায়, যদিও এটি সম্ভবত বোঝানো হয়নি।
সিভিফ্যান

@ মায়ু "36 "তিনি মূলত জিজ্ঞাসা করেছিলেন যে তিনি যে ধারণাটি দেখিয়েছেন তা বি কে ক্ষেত্রে ব্যবহার করা যেতে পারে কিনা ।" না, প্রশ্নটি ব্যবহার করা উচিত কিনা জিজ্ঞাসা করে । ওপি ইতিমধ্যে জানে যে এটি ব্যবহার করা যেতে পারে।
সিভিফ্যান

1
ভাল, "যদি মেথড_ বি প্রয়োজন হয় এবং কেবল মেথড_এ থেকে কল করা হয় তবে আমি কি পদ্ধতি_এ এর ভিতরে মেথড_বি ঘোষণা করব?" বেশ পরিষ্কার এবং বন্ধের সাথে কিছু করার নেই, তাই না? হ্যাঁ, আমি একমত, আমি ব্যবহৃত করতে পারেন পথে উচিত । তবে এটি ক্লোজারগুলির সাথে সম্পর্কিত নয় ... আমি কেবল অবাক হয়েছি যে বন্ধগুলি সম্পর্কে অনেক উত্তর এবং ওপি যখন সম্পূর্ণ আলাদা প্রশ্ন জিজ্ঞাসা করে তখন সেগুলি কীভাবে ব্যবহার করতে হয়।
মায়ু 36

@ মেউইউ 36 আপনি এটি কীভাবে দেখছেন সেই প্রশ্নের বাক্যবিন্যাস করতে এবং এটির সমাধানের জন্য অন্য একটি প্রশ্ন খুলতে পারে।
সিভিফ্যান

17

সাধারণত, না, ফাংশন ভিতরে ফাংশন সংজ্ঞায়িত করবেন না।

যদি না আপনার সত্যিকারের কোনও ভাল কারণ থাকে। যা আপনি করবেন না।

কেন না?

ফাংশনগুলির ভিতরে ফাংশনগুলি সংজ্ঞায়নের জন্য একটি ভাল কারণ কী ?

যখন তুমি কি আসলে চান একটি dingdang হয় অবসান


1
এই উত্তরটি আপনার জন্য @ মায়ু 36।
সিভিফ্যান

2
হ্যাঁ, ধন্যবাদ, আমি এই উত্তরটি খুঁজছিলাম। এটি সর্বোত্তম উপায়ে প্রশ্নের উত্তর দেয়। যদিও এটি এক বা অন্যটিকে কঠোরভাবে না বলে, এটি কারণ উল্লেখ করে ইনলাইন সংজ্ঞাগুলিকে ব্যাপকভাবে নিরুৎসাহিত করে। একটি (পাইথোনিক :)) এর উত্তরটি এমনভাবে হওয়া উচিত!
মায়ু 36

10

অন্যটির অভ্যন্তরে একটি ফাংশনটি ঘোষণা করা ঠিক fine এটি সজ্জকার তৈরিতে বিশেষভাবে কার্যকর।

তবে, থাম্বের নিয়ম হিসাবে, ফাংশনটি জটিল (10 টিরও বেশি লাইন) মডিউল স্তরে এটি ঘোষণা করা ভাল ধারণা হতে পারে।


2
এটি সম্ভব, তবে আমি সম্মত, এটি করার জন্য আপনার একটি ভাল কারণ প্রয়োজন। এটি কেবলমাত্র আপনার ক্লাসের মধ্যে ব্যবহারের উদ্দেশ্যে তৈরি কোনও ফাংশনের জন্য পূর্ববর্তী আন্ডারস্কোর ব্যবহার করা আরও অজগর হবে।
chmullig

3
একটি শ্রেণীর মধ্যে, হ্যাঁ, তবে কেবল একটি ফাংশনের মধ্যে কী হবে ? এনক্যাপসুলেশন হায়ারার্কিকাল।
পল ড্রাগার

@ পলড্রাপার "এনক্যাপসুলেশন হায়ারার্কিকাল" - না! এটা কে বলেছে? এনক্যাপসুলেশন কিছু উত্তরাধিকারের চেয়ে অনেক বিস্তৃত প্রধান।
মায়ু 36

7

আমি এই প্রশ্নটি খুঁজে পেয়েছি কারণ যদি কেউ নেস্টেড ফাংশন ব্যবহার করে তবে পারফরম্যান্সের প্রভাব কেন হয় তা আমি একটি প্রশ্ন করতে চেয়েছিলাম। কোয়াড কোর 2.5 গিগাহার্টজ ইন্টেল i5-2530M প্রসেসরের সাহায্যে উইন্ডোজ নোটবুকটিতে পাইথন ৩.২.৫ ব্যবহার করে নিম্নলিখিত ফাংশনগুলির জন্য আমি পরীক্ষা করেছি

def square0(x):
    return x*x

def square1(x):
    def dummy(y):
        return y*y
    return x*x

def square2(x):
    def dummy1(y):
        return y*y
    def dummy2(y):
        return y*y
    return x*x

def square5(x):
    def dummy1(y):
        return y*y
    def dummy2(y):
        return y*y
    def dummy3(y):
        return y*y
    def dummy4(y):
        return y*y
    def dummy5(y):
        return y*y
    return x*x

আমি নিম্নলিখিত 20 বার পরিমাপ করেছি, স্কয়ার 1, স্কোয়ার 2 এবং স্কোয়ার 5 এর জন্যও:

s=0
for i in range(10**6):
    s+=square0(i)

এবং নিম্নলিখিত ফলাফল পেয়েছি

>>> 
m = mean, s = standard deviation, m0 = mean of first testcase
[m-3s,m+3s] is a 0.997 confidence interval if normal distributed

square? m     s       m/m0  [m-3s ,m+3s ]
square0 0.387 0.01515 1.000 [0.342,0.433]
square1 0.460 0.01422 1.188 [0.417,0.503]
square2 0.552 0.01803 1.425 [0.498,0.606]
square5 0.766 0.01654 1.979 [0.717,0.816]
>>> 

square0কোনও নেস্টেড ফাংশন নেই, square1একটি নেস্টেড ফাংশন রয়েছে, square2দুটি নেস্টেড ফাংশন রয়েছে এবং square5পাঁচটি নেস্টেড ফাংশন রয়েছে। নেস্টেড ফাংশনগুলি কেবল ঘোষিত হয় তবে ডাকা হয় না।

আপনি যদি কল করেন না এমন কোনও ফাংশনে যদি আপনি 5 নেস্টেড ফান্ট সংজ্ঞায়িত করে থাকেন তবে ফাংশনটির সম্পাদনের সময় নেস্টেড ফাংশন ছাড়াই ফাংশনের দ্বিগুণ। আমি মনে করি নেস্টেড ফাংশনগুলি ব্যবহার করার সময় সতর্ক হওয়া উচিত।

এই আউটপুটটি উত্পন্ন করে এমন পুরো পরীক্ষার পাইথন ফাইলটি আদর্শের সন্ধান করতে পারে ।


5
আপনি যে তুলনা করেন তা সত্যই কার্যকর নয়। এটি ফাংশনে ডমি স্টেটমেন্ট যুক্ত করার এবং এটি ধীর বলে দেওয়ার মতো। মার্টিনিউর উদাহরণটি আসলে এনক্যাপসুলেটেড ফাংশনগুলি ব্যবহার করে এবং আমি তার উদাহরণ চালিয়ে কোনও পারফরম্যান্সের পার্থক্য লক্ষ্য করি না।
কন সাইক

-1 দয়া করে প্রশ্নটি আবার পড়ুন। যদিও আপনি বলতে পারেন যে এটি কিছুটা ধীর হতে পারে, তিনি জিজ্ঞাসা করেছিলেন যে এটি করা ভাল ধারণা, মূলত পারফরম্যান্সের কারণে নয়, সাধারণ অনুশীলনের কারণে।
মায়ু 36

@ মায়ু 36 দুঃখিত, প্রশ্ন এবং উত্তর পোস্ট হওয়ার তিন বছর পরে আমি করব না।
चमत्कार 173

ঠিক আছে, দুর্ভাগ্যক্রমে, এখনও কোনও গ্রহণযোগ্য (বা ভাল) উত্তর উপলব্ধ নেই।
মায়ু 36

4

এক্সপোজার এপিআই সম্পর্কে এটি কেবল একটি নীতি।

অজগর ব্যবহার করে, বাহ্যিক স্পেস (মডিউল বা বর্গ) এর এক্সপোজার এপিআই এড়ানো ভাল ধারণা, ফাংশনটি একটি ভাল এনক্যাপসুলেশন জায়গা।

এটি একটি ভাল ধারণা হতে পারে। আপনি যখন নিশ্চিত

  1. অভ্যন্তরীণ ফাংশন কেবলমাত্র বাহ্যিক ফাংশন দ্বারা ব্যবহৃত হয়।
  2. ইনসাইডার ফাংশনটির উদ্দেশ্যটি ব্যাখ্যা করার জন্য একটি ভাল নাম রয়েছে কারণ কোড কথা বলে।
  3. কোডটি আপনার সহকর্মীরা (বা অন্যান্য কোড-রিডার) সরাসরি বুঝতে পারবেন না।

তবুও, এই কৌশলটি অপব্যবহারের কারণে সমস্যা তৈরি হতে পারে এবং ডিজাইনের ত্রুটি রয়েছে।

আমার মেয়াদ শেষ হতে পারে, আপনার প্রশ্ন ভুল বুঝতে পারে।


4

সুতরাং শেষ পর্যন্ত এটি মূলত অজগর বাস্তবায়নটি কতটা স্মার্ট তা সম্পর্কে একটি প্রশ্ন, বিশেষত অভ্যন্তরীণ ফাংশনটি বন্ধ না হয়ে কেবল ফাংশনে কেবলমাত্র একজন সহায়ক প্রয়োজন।

পরিষ্কার বোধগম্য ডিজাইনে যেখানে কেবল তাদের প্রয়োজন রয়েছে এবং অন্য কোথাও প্রকাশ করা হয়নি সেখানে সেগুলি মডিউল, কোনও পদ্ধতি হিসাবে একটি শ্রেণিতে বা অন্য কোনও ফাংশন বা পদ্ধতির অভ্যন্তরে এম্বেড করা ভাল নকশা। যখন ভাল কাজ করা হয় তখন তারা কোডের স্পষ্টতাকে উন্নত করে।

এবং যখন অভ্যন্তরীণ ফাংশনটি এমন একটি বন্ধ থাকে যা সেই ফাংশনটি অন্য কোথাও ব্যবহারের জন্য উপস্থিত ফাংশনটির বাইরে না ফিরে আসার পরেও বেশ কিছুটা স্পষ্টতার সাথে সহায়তা করে।

সুতরাং আমি বলতে চাই যে এগুলি সাধারণত ব্যবহার করুন তবে সম্ভাব্য পারফরম্যান্স হিট সম্পর্কে সচেতন থাকুন যখন আপনি বাস্তবে পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন এবং কেবলমাত্র যদি আপনি প্রকৃত প্রোফাইলিং করেন যা সেগুলি সর্বাধিক অপসারণ করে তা দেখায় তবে সেগুলি সরিয়ে ফেলুন।

আপনার লেখা সমস্ত অজগর কোড জুড়ে কেবল "অভ্যন্তরীণ ফাংশনগুলি বিএডি" ব্যবহারের অকাল অপটিমাইজেশন করবেন না। অনুগ্রহ.


অন্যান্য উত্তর দ্বারা প্রদর্শিত হিসাবে, আপনি সত্যিই পারফরম্যান্স হিট না।
মায়ু 36

1

এটি পুরোপুরি ঠিক আছে এটি সেভাবে করা, তবে আপনি যদি ক্লোজার ব্যবহার করতে না চান বা ফাংশনটি না ফেরানোর প্রয়োজন হয় আমি সম্ভবত মডিউল স্তরে রেখে দেব। আমি দ্বিতীয় কোড উদাহরণে কল্পনা করেছিলাম যার অর্থ:

...
some_data = method_b() # not some_data = method_b

অন্যথায়, কিছু_ডাটা হবে ফাংশন।

মডিউল স্তরে এটি থাকা অন্য ফাংশনগুলিকে মেথড_বি () ব্যবহার করার অনুমতি দেবে এবং যদি আপনি ডকুমেন্টেশনের জন্য স্পিঙ্কস (এবং অটোডোক) এর মতো কিছু ব্যবহার করেন তবে এটি আপনাকে মেথড_বিও ডকুমেন্ট করার অনুমতি দেবে।

আপনি যদি কোনও এমন কিছু করছেন যা কোনও বস্তুর দ্বারা উপস্থাপনযোগ্য হতে পারে তবে আপনি ক্লাসে দুটি পদ্ধতিতে কার্যকারিতা রাখার বিষয়েও বিবেচনা করতে চাইতে পারেন। এটি আপনার পক্ষে যা খুঁজছেন তা যদি খুব যুক্তিযুক্ত থাকে।


1

এর মতো কিছু করুন:

def some_function():
    return some_other_function()
def some_other_function():
    return 42 

আপনি যদি some_function()এটি চালনা করেন তবে এটি চালিত হবে some_other_function()এবং 42 ফেরত আসবে ।

সম্পাদনা: আমি প্রাথমিকভাবে বলেছি যে আপনি অন্যের ভিতরে কোনও ফাংশন সংজ্ঞায়িত করবেন না তবে এটি নির্দিষ্ট করে দেওয়া হয়েছিল যে এটি কখনও কখনও এটি করা কার্যকর।


আপনার উপরের যারা তাদের উত্তরগুলিতে রেখেছেন সেগুলির আমি প্রশংসা করি তবে আপনার প্রত্যক্ষ এবং মূল বিষয় ছিল। খুশী হলাম।
C0NFUS3D

1
কেন? কেন আপনি এটা করবেন না? যে মহান encapsulation না? আমি কোন যুক্তি অনুপস্থিত। -1
মেইউ 36

@ মাইউইউ 36 আমার মন্তব্য লেখার সময় আমি জানি না যে এনক্যাপসুলেশনটি কী ছিল বা আমি জানি না এটি এখন কী it আমি কেবল ভেবেছিলাম এটি করা ভাল নয়। আপনি কি ব্যাখ্যা করতে পারেন যে এটির বাইরে কেবল এটির সংজ্ঞা দেওয়ার পরিবর্তে অন্য কারও ভিতরে কোনও ক্রিয়া সংজ্ঞায়িত করা কেন উপকারী হবে?
mdlp0716

2
হ্যা আমি পারি. আপনি এনক্যাপসুলেশন ধারণাটি সন্ধান করতে পারেন তবে সংক্ষেপে: প্রয়োজনীয় তথ্যগুলি গোপন করুন এবং কেবল যা জানা দরকার তা কেবল ব্যবহারকারীকে প্রকাশ করুন। যার অর্থ, বাইরে_আপনার_ফাংশনটি সংজ্ঞায়িত করা কেবলমাত্র নামফলকে আরও কিছু যুক্ত করে যা প্রকৃতপক্ষে দৃ function়ভাবে প্রথম ফাংশনের সাথে আবদ্ধ। অথবা ভেরিয়েবলের ক্ষেত্রে বিবেচনা করুন: কেন আপনার স্থানীয় ভেরিয়েবল বনাম গ্লোবাল ভেরিয়েবলের প্রয়োজন? কোনও ফাংশনের অভ্যন্তরে সমস্ত ভেরিয়েবল সংজ্ঞায়িত করা যদি সম্ভব হয় তবে কেবলমাত্র এই একটি ফাংশনের অভ্যন্তরে কেবলমাত্র ভেরিয়েবলের জন্য গ্লোবাল ভেরিয়েবল ব্যবহার করা আরও ভাল । সব শেষ পর্যন্ত জটিলতা হ্রাস সম্পর্কে।
Mayou36

0

আপনি বৈশ্বিক ভেরিয়েবলগুলি সংজ্ঞায়িত করতে এড়াতে এটি ব্যবহার করতে পারেন। এটি আপনাকে অন্যান্য ডিজাইনের বিকল্প দেয়। একটি সমস্যার সমাধান উপস্থাপন 3 ডিজাইন।

ক) গ্লোবাল ছাড়াই ফাংশন ব্যবহার করা

def calculate_salary(employee, list_with_all_employees):
    x = _calculate_tax(list_with_all_employees)

    # some other calculations done to x
    pass

    y = # something 

    return y

def _calculate_tax(list_with_all_employees):
    return 1.23456 # return something

খ) গ্লোবাল সহ ফাংশন ব্যবহার করা

_list_with_all_employees = None

def calculate_salary(employee, list_with_all_employees):

    global _list_with_all_employees
    _list_with_all_employees = list_with_all_employees

    x = _calculate_tax()

    # some other calculations done to x
    pass

    y = # something

    return y

def _calculate_tax():
    return 1.23456 # return something based on the _list_with_all_employees var

গ) অন্য ফাংশনের ভিতরে ফাংশন ব্যবহার করা

def calculate_salary(employee, list_with_all_employees):

    def _calculate_tax():
        return 1.23456 # return something based on the list_with_a--Lemployees var

    x = _calculate_tax()

    # some other calculations done to x
    pass
    y = # something 

    return y

সলিউশন সি) অভ্যন্তরীণ ফাংশনে তাদের ঘোষণা করার প্রয়োজন ছাড়াই বহিরাগত ফাংশনের সুযোগে ভেরিয়েবলগুলি ব্যবহার করার অনুমতি দেয়। কিছু পরিস্থিতিতে কার্যকর হতে পারে।


0

ফাংশন অজগর

def Greater(a,b):
    if a>b:
        return a
    return b

def Greater_new(a,b,c,d):
    return Greater(Greater(a,b),Greater(c,d))

print("Greater Number is :-",Greater_new(212,33,11,999))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.