কীভাবে "কীওয়ার্ড আর্গুমেন্টগুলি" নিয়মিত যুক্তি থেকে আলাদা? name=value
অবস্থানগত সিনট্যাক্স ব্যবহারের পরিবর্তে সমস্ত যুক্তি কি পাস করা যায় না ?
কীভাবে "কীওয়ার্ড আর্গুমেন্টগুলি" নিয়মিত যুক্তি থেকে আলাদা? name=value
অবস্থানগত সিনট্যাক্স ব্যবহারের পরিবর্তে সমস্ত যুক্তি কি পাস করা যায় না ?
উত্তর:
দুটি সম্পর্কিত ধারণা রয়েছে, দুটিকেই " কীওয়ার্ড আর্গুমেন্ট " বলা হয় ।
কলিংয়ের দিকে, যা অন্য মন্তব্যকারীরা উল্লেখ করেছেন, আপনার নাম অনুসারে কিছু ফাংশন যুক্তি নির্দিষ্ট করার ক্ষমতা রয়েছে। নাম ( অবস্থানগত আর্গুমেন্ট ) ছাড়াই আপনাকে সমস্ত আর্গুমেন্টের পরে এগুলি উল্লেখ করতে হবে এবং কোনও প্যারামিটারের জন্য অবশ্যই ডিফল্ট মান থাকতে হবে যা উল্লেখ করা হয়নি।
অন্য ধারণাটি ফাংশন সংজ্ঞায়নের দিকে রয়েছে: আপনি কোনও ফাংশনটি সংজ্ঞায়িত করতে পারেন যা নাম অনুসারে পরামিতি নেয় - এবং আপনাকে সেই নামগুলি কী তা নির্দিষ্ট করতে হবে না। এগুলি খাঁটি কীওয়ার্ড আর্গুমেন্ট এবং অবস্থানগতভাবে পাস করা যায় না। বাক্য গঠনটি হ'ল
def my_function(arg1, arg2, **kwargs)
আপনি এই ফাংশনটিতে যে কোনও কীওয়ার্ড আর্গুমেন্টটি পাস করবেন নামের একটি অভিধানে স্থাপন করা হবে kwargs
। রান-টাইমে আপনি এই অভিধানের কীগুলি পরীক্ষা করতে পারেন:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
kwargs
বা আমি এটির নাম পরিবর্তন করতে পারি। মত options
( def my_fuction(arg1, arg2, **options)
)?
kwargs
এটির অধিবেশন যখন বেশি উপযুক্ত নাম না হয়
একটি শেষ ভাষার বৈশিষ্ট্য রয়েছে যেখানে পার্থক্যটি গুরুত্বপূর্ণ। নিম্নলিখিত ফাংশন বিবেচনা করুন:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
*positional
যুক্তি প্রেরণ অবস্থানগত এর সব আর্গুমেন্ট সংরক্ষণ করবে foo()
, কোন সীমা সঙ্গে আপনি কত প্রদান করতে পারেন হবে।
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
**keywords
যুক্তি কোনো শব্দ আর্গুমেন্ট সংরক্ষণ করবে:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
এবং অবশ্যই, আপনি উভয় একই সময়ে ব্যবহার করতে পারেন:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
এই বৈশিষ্ট্যগুলি খুব কমই ব্যবহৃত হয়, তবে মাঝে মধ্যে সেগুলি খুব দরকারী এবং কোন যুক্তি অবস্থানগত বা কীওয়ার্ডগুলি তা জানা গুরুত্বপূর্ণ।
*positional
এবং **keywords
যদি আমরা ফাংশন সংজ্ঞা পরিবর্তন করি def foo(arg1, *positional, **keywords):
। এখানে arg1
অবস্থানগত এবং প্রয়োজনীয়। দয়া করে নোট করুন যে উত্তরের স্থিতির অর্থ alচ্ছিক এবং অবস্থানগত আর্গুমেন্টের পরিবর্তনশীল সংখ্যার।
foo(bar=True)
মানগুলি bar = keywords.pop('bar')
একই হিসাবে ব্যবহার করতে পারেন bar = keywords.pop('bar', None)
। ডিফল্ট মান, ব্যবহারের জন্যbar = keywords.pop('bar', False)
অর্ডার ব্যতীত মূল আর্গুমেন্টের মতো কীওয়ার্ড আর্গুমেন্ট ব্যবহার করা একই জিনিস। উদাহরণস্বরূপ নীচের দুটি ফাংশন কল একই:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
তাদের আগে তাদের কোনও কীওয়ার্ড নেই। অর্ডারটি গুরুত্বপূর্ণ!
func(1,2,3, "foo")
তাদের সামনে কীওয়ার্ড রয়েছে। তারা যে কোনও ক্রমে হতে পারে!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
আপনার এও জানা উচিত যে আপনি কীওয়ার্ডগুলি সন্নিবেশ করানোর জন্য যদি ডিফল্ট যুক্তি এবং অবহেলা ব্যবহার করেন তবে অর্ডারটি তখন গুরুত্ব পাবে!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
func("bar", 5)
? এবং তারপরে hello
এটির ডিফল্ট মানটি বলে 3
।
ফাংশন প্যারামিটারগুলিতে আর্গুমেন্টের মান নির্ধারণের দুটি উপায় রয়েছে, উভয়ই ব্যবহৃত হয়।
অবস্থান দ্বারা। পজিশনাল আর্গুমেন্টগুলির কীওয়ার্ড নেই এবং প্রথমে বরাদ্দ করা হয়েছে।
কীওয়ার্ড দ্বারা। কীওয়ার্ড আর্গুমেন্টগুলির কীওয়ার্ড থাকে এবং অবস্থানগত আর্গুমেন্টের পরে দ্বিতীয় বরাদ্দ করা হয়।
মনে রাখবেন যে আপনার কাছে অবস্থানগত আর্গুমেন্টগুলি ব্যবহার করার বিকল্প রয়েছে।
আপনি যদি স্থিতি যুক্তি ব্যবহার না করেন, তবে - হ্যাঁ - আপনি যা লিখেছিলেন তা সমস্ত কিওয়ার্ড আর্গুমেন্ট হিসাবে প্রমাণিত।
আপনি যখন কোনও ফাংশন কল করেন আপনি অবস্থান বা কীওয়ার্ড বা মিশ্রণটি ব্যবহার করার সিদ্ধান্ত নেন। আপনি চাইলে সমস্ত কীওয়ার্ড করতে বেছে নিতে পারেন। আমাদের মধ্যে কেউ কেউ এই পছন্দটি করে না এবং অবস্থানগত যুক্তি ব্যবহার করে না।
আমি অবাক হয়ে গিয়েছি যে কেউ কেউ উল্লেখ করেছে বলে মনে হয় না যে কেউ কীড আর্গুমেন্ট প্যারামিটারগুলির একটি অভিধান পাস করতে পারে, যা ফর্মাল প্যারামিটারগুলি পূরণ করে, যেমন।
>>> def func(a='a', b='b', c='c', **kwargs):
... print 'a:%s, b:%s, c:%s' % (a, b, c)
...
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>>
, **kwargs
। এটি প্রদর্শিত হবে যে একটি নির্দিষ্ট # প্যারামিটার সহ একটি সাধারণ ফানক ডিএফ, অভিধান সরবরাহ করা যেতে পারে। এটি হ'ল সংজ্ঞা অনুসারে এর কোনও অভিনব কোনও প্রয়োজন নেই। তারপরে আপনি একটি দ্বিতীয় উদাহরণ যুক্ত করতে পারেন, সংজ্ঞা অনুসারে ** কোয়ার্গ্স সহ, এবং দেখান যে অভিধানে কীভাবে অতিরিক্ত আইটেমগুলি পাওয়া যায়।
print 'a:%s, b:%s, c:%s' % (a, b, c)
সিনট্যাক্স ত্রুটি দেয়, তবে print('a:%s, b:%s, c:%s' % (a, b, c))
কাজ করে। পাইথন সংস্করণ সহ কিছু? যাইহোক, এই অন্তর্দৃষ্টিটির জন্য ধন্যবাদ, এখন অবধি আমি আরও print('a:{}, b:{}, c:{}'.format(a, b, c))
পাইথন 3 ব্যবহার করে আপনার প্রয়োজনীয় এবং অ-প্রয়োজনীয় উভয় কীওয়ার্ড যুক্তি থাকতে পারে :
Alচ্ছিক : (প্যারাম 'বি' এর জন্য ডিফল্ট মান সংজ্ঞায়িত)
def func1(a, *, b=42):
...
func1(value_for_a) # b is optional and will default to 42
প্রয়োজনীয় (প্যারাম 'বি' এর জন্য কোনও ডিফল্ট মান নির্ধারণ করা হয়নি):
def func2(a, *, b):
...
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`
এটি এমন ক্ষেত্রে সহায়তা করতে পারে যেখানে আপনার একে অপরের পাশে অনেকগুলি অনুরূপ যুক্তি রয়েছে বিশেষত যদি তারা একই ধরণের হয় তবে সে ক্ষেত্রে আমি নামযুক্ত আর্গুমেন্টগুলি ব্যবহার করতে পছন্দ করি বা তর্কগুলি যদি এক সাথে থাকে তবে আমি একটি কাস্টম ক্লাস তৈরি করি।
আমি অবাক হয়েছি কেউ এই সত্যটি উল্লেখ করেনি যে আপনি অবস্থানগত এবং কীওয়ার্ড যুক্তিগুলি মিশ্রিত করতে পারেন যেমন এই জাতীয় ব্যবহার করে *args
এবং **kwargs
( এই সাইট থেকে ):
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
এটি আপনাকে স্বেচ্ছাচারী কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করতে দেয় যা আপনার সামনে কীভাবে সংজ্ঞা দিতে চান না এমন কী থাকতে পারে।
আমি এমন একটি উদাহরণ সন্ধান করছিলাম যাতে টীকা টীকাটি ব্যবহার করে ডিফল্ট কাওয়ার্গস ছিল:
def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
return ' '.join([a, b, c, str(kwargs)])
উদাহরণ:
>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}
ফাংশনটি কল করার সময় মূল শব্দের মধ্যে বরাদ্দ না করা যুক্তিগুলির ডিফল্ট মান নির্ধারণের জন্য কেবলমাত্র পূর্ণতা / যুক্ত করার উপায় যুক্ত করুন :
def func(**keywargs):
if 'my_word' not in keywargs:
word = 'default_msg'
else:
word = keywargs['my_word']
return word
এটিকে কল করুন:
print(func())
print(func(my_word='love'))
তুমি পাবে:
default_msg
love
অজগর সম্পর্কে *args
এবং আরও পড়ুন **kwargs
: https://www.digitalocean.com/commune/tutorials/how-to-use-args-and-kwargs-in-python-3