"तर्क तर्क" नियमित तर्कों से अलग कैसे हैं? स्थितित्मक वाक्यविन्यास का उपयोग करने के बजाय सभी तर्क 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'}
+1 और स्वीकृत: आप अकेले हैं जो दोनों प्रकार के पोजिशनल + कीवर्ड तर्कों के बारे में बात करते हैं, हर किसी ने सोचा कि मैं पहले या दूसरे के बारे में बात कर रहा था (लेकिन वे अभी भी अच्छी पोस्ट थे)। धन्यवाद! – mk12
शब्द अस्पष्ट है: आम तौर पर आप कॉल किए गए पक्ष के पैरामीटर के दौरान कॉलिंग पक्ष पर तर्कों की बात करते हैं। एक उपयोगी तकनीक के लिए – glglgl
फ़ंक्शन पैरामीटर को तर्क मान असाइन करने के दो तरीके हैं, दोनों का उपयोग किया जाता है।
स्थिति के आधार पर। स्थितित्मक तर्क में कीवर्ड नहीं होते हैं और पहले असाइन किए जाते हैं।
कीवर्ड द्वारा। कीवर्ड तर्कों में कीवर्ड होते हैं और स्थितित्मक तर्क के बाद दूसरा असाइन किया जाता है।
ध्यान दें कि आप स्थितीय तर्कों का उपयोग करने का विकल्प है।
तो आप स्थितीय तर्कों का उपयोग नहीं करते हैं, तो - हाँ - सब कुछ आप लिखा पता चला है एक कीवर्ड तर्क किया जाना है।
जब आप एक फ़ंक्शन को कॉल करें जिसे आप स्थिति या कीवर्ड या मिश्रण का उपयोग करने का निर्णय लेते हैं। यदि आप चाहें तो आप सभी कीवर्ड करना चुन सकते हैं। हम में से कुछ इस विकल्प को नहीं बनाते हैं और स्थितित्मक तर्क का उपयोग नहीं करते हैं।
कीवर्ड तर्कों का उपयोग करना सामान्य तर्कों के समान है, आदेश को छोड़कर कोई फर्क नहीं पड़ता। वे उनके सामने कोई कीवर्ड नहीं है
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 test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
यह आपको अनुमति देता है:
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
आईएमएचओ, तीसरा उदाहरण (डिफ़ॉल्ट तर्क) स्पष्ट नहीं है। मुझे लगता है कि आप इस बारे में बात कर रहे हैं कि क्या होता है जब एक या अधिक पैरामीटर डिफ़ॉल्ट मान घोषित करते हैं, और कॉल स्थितित्मक नोटेशन का उपयोग करता है, लेकिन घोषित पैरामीटर की संख्या से कम आपूर्ति करता है। हालांकि, आपके उदाहरण में 3 घोषित किए गए हैं, और 3 कॉल में हैं, इसलिए डिफ़ॉल्ट मानों का कोई प्रभाव नहीं पड़ता है! क्या आप तीसरे तर्क को छोड़ना चाहते थे। जैसे 'func (" बार ", 5)'? और फिर कहें कि 'हैलो' को '3' का डिफ़ॉल्ट मान मिलता है। – ToolmakerSteve
मैं हैरान कोई भी तथ्य यह है कि आप *args
और **kwargs
(from this site) का उपयोग इस तरह डरपोक काम करने के लिए स्थितीय और कीवर्ड तर्क मिश्रण कर सकते हैं उल्लेख किया है हूँ मनमानी कीवर्ड तर्कों का उपयोग करें जिनके पास ऐसी कुंजी हो सकती है जिन्हें आप पहले परिभाषित नहीं करना चाहते हैं।
एक आखिरी भाषा सुविधा है जहां भेद महत्वपूर्ण है। निम्नलिखित समारोह पर विचार करें:
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'}
इन सुविधाओं को शायद ही कभी इस्तेमाल किया जाता है, लेकिन कभी-कभी वे बहुत उपयोगी होते हैं, और यह जानना महत्वपूर्ण है कि कौन से तर्क स्थितित्मक या कीवर्ड हैं।
उत्कृष्ट जवाब! अगर हम 'def foo (arg1, * positional, ** कीवर्ड) जैसे फ़ंक्शन परिभाषा को बदलते हैं तो बस एक नोट जो आवश्यक स्थितित्मक तर्क '* positional'and' ** कीवर्ड' से पहले पारित किया जा सकता है: '। यहां 'arg1' स्थितित्मक और आवश्यक है। कृपया ध्यान दें कि उत्तर में स्थितित्मक स्थिति वैकल्पिक तर्कों की वैकल्पिक और परिवर्तनीय संख्या है। – shaffooo
मुझे लगता है कि कोई भी बताया है कि करने के लिए एक, बंद तर्क मानकों का एक शब्दकोश पारित कर सकते हैं कि औपचारिक संतुष्ट लगता है हैरान हूँ पैरामीटर, जैसे।
>>> 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
>>>
+1। आपका बिंदु स्पष्ट होगा, बिना ', ** kwargs'। यह दर्शाता है कि एक निश्चित func def भी, एक निश्चित # पैरामीटर के साथ, एक शब्दकोश प्रदान किया जा सकता है। यही है, इसे परिभाषा में कुछ भी फैंसी की आवश्यकता नहीं है। फिर आप परिभाषा में ** kwargs के साथ एक दूसरा उदाहरण जोड़ सकते हैं, और दिखा सकते हैं कि शब्दकोश में अतिरिक्त आइटम कैसे उपलब्ध हैं। – ToolmakerSteve
मैंने यह देखा है कि यह विभिन्न पुस्तकालयों के स्रोत कोड में होता है और इतना उलझन में था। इसे क्लीयर करने के लिए शुक्रिया! –
उपरोक्त चौथा औपचारिक पैरामीटर - ** kwargs आवश्यक है यदि आप कभी भी एक शब्दकोश के साथ func कहते हैं जिसमें 'ए', 'बी' और 'सी' के अलावा अन्य कुंजी शामिल हैं। – Eduardo
अजगर 3 का उपयोग करके आप दोनों आवश्यक और गैर आवश्यक कीवर्ड arguments हो सकता है:
वैकल्पिक: (डिफ़ॉल्ट 'बी' के लिए निर्धारित मान)
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'`
यह उन मामलों में मदद कर सकता है जहां आपके पास एक दूसरे के बगल में कई समान तर्क हैं, खासकर जब एक ही प्रकार के होते हैं, उस मामले में मैं नामित तर्कों का उपयोग करना पसंद करता हूं या यदि तर्क एक साथ हैं तो मैं एक कस्टम क्लास बना सकता हूं।
* आवश्यक * संस्करण काफी उपयोगी है। यह तर्क प्रदान किए बिना नाम से तर्क देने का आग्रह करता है, जो अक्सर कोई समझ नहीं आता है। – TNT
डिफ़ॉल्ट मान अच्छे दिखते हैं और जब आप प्रारंभ करते हैं तो समय बचाने में आपकी सहायता कर सकते हैं, लेकिन लंबे समय तक डिफ़ॉल्ट मान एक पिटा हो सकते हैं। –
आप पीईपी 3102 भी पढ़ना चाहेंगे - वे पाइथन 3 में इन चीजों में से कुछ को साफ कर रहे हैं। देखें: http://www.python.org/dev/peps/pep-3102/ –
और क्या एक डिफ़ॉल्ट मान के साथ ऐसा करने के लिए कुछ भी नहीं है (सिवाय इसके कि आपको इसके लिए मूल्य पास करने की आवश्यकता है या नहीं), है ना? – mk12
[पायथन स्थितित्मक/कीवर्ड तर्क] के बारे में और पढ़ें (http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html) – ducin