কোনও ফাংশনে alচ্ছিক পরামিতিগুলি পাশ করার কোনও উপায় আছে কি?


132

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

উত্তর:


114

পাইথন 2 ডকুমেন্টেশন, 7.6। ফাংশন সংজ্ঞা আপনাকে কলার একটি alচ্ছিক প্যারামিটার সরবরাহ করেছে কিনা তা সনাক্ত করার কয়েকটি উপায় দেয় gives

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

উদাহরণস্বরূপ, এখানে একটি ফাংশন opt_funযা দুটি অবস্থানগত পরামিতি নেয় x1এবং x2, এবং অন্য একটি কীওয়ার্ড প্যারামিটার অনুসন্ধান করে namedচ্ছিক "

>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
...     if ('optional' in keyword_parameters):
...         print 'optional parameter found, it is ', keyword_parameters['optional']
...     else:
...         print 'no optional parameter, sorry'
... 
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is  yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry

দ্বিতীয়ত, আপনি কোনও মানটির একটি ডিফল্ট প্যারামিটার মান সরবরাহ করতে পারেন Noneযা কলার কখনও ব্যবহার করবে না। যদি প্যারামিটারের এই ডিফল্ট মান থাকে তবে আপনি জানেন যে কলার প্যারামিটারটি নির্দিষ্ট করে নি। যদি প্যারামিটারটির একটি ডিফল্ট মান থাকে তবে আপনি জানেন যে এটি কলার থেকে এসেছে।


7
positional_parametersএকটি tuple, এবং keyword_parametersএকটি অভিধান।
সিইস টিমারম্যান

কিভাবে পাইথন পার্থক্য নেই formal parameters preceded by * (এই কি বলা হয়?) একটি থেকে keyword parameter? আমি এটি বুঝতে পেরেছি, কীওয়ার্ড প্যারামিটারগুলি =ফাংশন কলটিতে অপারেটরটি ব্যবহার করে নির্দিষ্ট করা হয়েছে (সুতরাং opt_fun(1,2, optional="yes")কোনও ফাংশনের প্রত্যাশা করে এমন একটি কীওয়ার্ড আর্গুমেন্ট "হ্যাঁ" সরবরাহ করে তবে প্রয়োজনীয়ভাবে প্যারামিটারের প্রয়োজন হয় না option)।
মিন ট্রান

অন্যদিকে, আমি formal parameters preceded by * কেবল "কলার সরবরাহিত আর্গুমেন্ট হিসাবে বুঝতে পারি যা কোনও কীওয়ার্ড আর্গুমেন্টের আগে যে অবস্থানগত আর্গুমেন্টের সাথে মিলে না"। উদাহরণস্বরূপ, মধ্যে opt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018"), "blah"এবং 3.14হয় forma arguments preceded by *কারণ এটি দুই অবস্থানগত আর্গুমেন্ট এবং যুক্তি ব্যবহার করে মধ্যবর্তী আছে =সাইন ইন করুন। ফলে tuple positional_parameterduple হবে: ("blah", 3.14)। এটা কি সঠিক?
মিন ট্রান

@ মিনিট্রান, মন্তব্যে করা প্রশ্নগুলি স্ট্যাক ওভারফ্লোতে উত্তর পাওয়ার সবচেয়ে ভাল উপায় নয়। বড় নীল "প্রশ্ন জিজ্ঞাসা করুন" বোতামটি ক্লিক করা এবং আপনার অনুরোধটিকে "প্রশ্ন" হিসাবে লিখুন যা অন্যরা "উত্তর" দিতে পারে তার চেয়ে অনেক বেশি ভাল। তবে আপনাকে সাহায্য করার জন্য, ক) নোট আমি parameter" parameters" জন্য " preceded by *" " লিখেছি না" *identifierপ্যারামিটার তালিকায় ভাষা কেবল একটির জন্য অনুমতি দেয় । খ) ডকস.পিথন.আর. / ২ / রেফারেন্স/… , গ) ডকস.পিথন.আর. / ২ / রেফারেন্স / এক্সপ্রেশন । দুঃখিত, এই মন্তব্যে অনুমোদিত চরিত্রের বাইরে চলে।
জিম DeLaHunt

81
def my_func(mandatory_arg, optional_arg=100):
    print(mandatory_arg, optional_arg)

http://docs.python.org/2/tutorial/controlflow.html#default-argument-values

আমি এটি ব্যবহার করার চেয়ে বেশি পঠনযোগ্য বলে মনে করি **kwargs

কোনও আর্গুমেন্ট আদৌ পাস করা হয়েছে কিনা তা নির্ধারণ করতে, আমি কাস্টম ইউটিলিটি অবজেক্টটি ডিফল্ট মান হিসাবে ব্যবহার করি:

MISSING = object()

def func(arg=MISSING):
    if arg is MISSING:
        ...

ধন্যবাদ, এই প্যারামিটারের ডিফল্ট মান কোডে অন্য পরিবর্তনশীল হিসাবে নির্দিষ্ট করার উপায় আছে কি?
ব্যবহারকারী 1795998

হ্যাঁ. default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
ওয়ারওয়ারিচ

এটি কীভাবে paraচ্ছিক প্যারামিটারগুলি ব্যবহার করবেন তা দেখানোর জন্য উপস্থিত হয়, তবে কোনওটি পাস হলে কীভাবে পরীক্ষা করা যায় তা নয়, যা ওপি জিজ্ঞাসা করছে।
মাওগ বলছেন মনিকা

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

19
def op(a=4,b=6):
    add = a+b
    print add

i)op() [o/p: will be (4+6)=10]
ii)op(99) [o/p: will be (99+6)=105]
iii)op(1,1) [o/p: will be (1+1)=2]
Note:
 If none or one parameter is passed the default passed parameter will be considered for the function. 

1
কেবলমাত্র দ্বিতীয় প্যারামিটার (খ) এবং প্রথমটি (ক) নয় পাশ করার কোনও উপায় আছে?
ডিজিডিউফ

4
@ ডিজিডিউফ হ্যাঁ, আছেop(b=2)
জার্গ মের্লিন স্পাকা

7

আপনি যদি কোনও প্যারামিটার নির্ধারিত মানকে কিছু ডিফল্ট মান দিতে চান ()। মত (x = 10)। তবে গুরুত্বপূর্ণটি হ'ল প্রথমে বাধ্যতামূলক আর্গুমেন্টের পরে ডিফল্ট মান হওয়া উচিত।

যেমন।

(y, x = 10)

কিন্তু

(x = 10, y) ভুল


ধন্যবাদ, এই প্যারামিটারটির ডিফল্ট মান কোডে অন্য পরিবর্তনশীল হিসাবে নির্দিষ্ট করার কোনও উপায় আছে কি?
ব্যবহারকারী 1795998

হ্যাঁ আপনি *arg **kargফাংশন আর্গুমেন্ট হিসাবে পরিচিত এমন কিছু ব্যবহার করতে পারেন । গুগলে অনুসন্ধান করুন।
সুমিত

এটি কীভাবে paraচ্ছিক প্যারামিটারগুলি ব্যবহার করবেন তা দেখানোর জন্য উপস্থিত হয়, তবে কোনওটি পাস হলে কীভাবে পরীক্ষা করা যায় তা নয়, যা ওপি জিজ্ঞাসা করছে।
মাওগ বলছেন মনিকা

2

আপনি এমন কোনও কিছু দিয়ে alচ্ছিক যুক্তির জন্য একটি ডিফল্ট মান নির্দিষ্ট করতে পারেন যা কখনই ফাংশনে যায় না এবং এটি isঅপারেটরের সাথে যাচাই করতে পারেন :

class _NO_DEFAULT:
    def __repr__(self):return "<no default>"
_NO_DEFAULT = _NO_DEFAULT()

def func(optional= _NO_DEFAULT):
    if optional is _NO_DEFAULT:
        print("the optional argument was not passed")
    else:
        print("the optional argument was:",optional)

তারপরে আপনি যতক্ষণ না করবেন func(_NO_DEFAULT)আপনি তত্ক্ষণাত যুক্তিটি পাস হয়েছে কিনা তা সঠিকভাবে সনাক্ত করতে পারবেন এবং গৃহীত উত্তরের বিপরীতে আপনাকে ** স্বরলিপিটির পার্শ্ব প্রতিক্রিয়া সম্পর্কে চিন্তা করতে হবে না:

# these two work the same as using **
func()
func(optional=1)

# the optional argument can be positional or keyword unlike using **
func(1) 

#this correctly raises an error where as it would need to be explicitly checked when using **
func(invalid_arg=7)

শুধু কর _NO_DEFAULT = object()
অরণ-ফে

2 আরও ভাল লাইন অন্তর্নিহিত দিতে লাইন এটি মূল্য। এটির সাহায্যে যদি আপনি চালনা করেন তবে আপনি help(func)একটি স্পষ্ট ধারণা পাবেন যে সুস্পষ্টভাবে পাস না হলে যুক্তিটি কীভাবে ব্যাখ্যা করা হয়।
তাধগ ম্যাকডোনাল্ড-জেনসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.