क्या किसी फ़ंक्शन के लिए चर संख्याओं को पारित किया जा सकता है?


345

C या C ++ में varargs का उपयोग करने के लिए इसी तरह से:

fn(a, b)
fn(a, b, c, d, ...)

5
मैं पॉडकास्ट 53 के लिए सम्मानजनक नीचता का संदर्भ देता हूं: itc.conversationsnetwork.org/shows/…
डेविड साइक्स

2
मैं इस एक पर श्री लोट के साथ जाना होगा। आप पायथन डॉक्स में इस एक पर एक आधिकारिक उत्तर प्राप्त कर सकते हैं, साथ ही आप यह भी महसूस करेंगे कि डॉक्स में और क्या है। यदि आप पायथन में काम करने की योजना बनाते हैं तो उन डॉक्स को जानना आपके लाभ के लिए है।
ब्रायन नील

@DavidSykes लिंक टूटा है
डेव लियू

जवाबों:


447

हाँ। आप *argsएक गैर-कीवर्ड तर्क के रूप में उपयोग कर सकते हैं । फिर आप किसी भी तर्क को पारित करने में सक्षम होंगे।

def manyArgs(*arg):
  print "I was called with", len(arg), "arguments:", arg

>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2, 3)
I was called with 3 arguments: (1, 2, 3)

जैसा कि आप देख सकते हैं, पायथन सभी तर्कों के साथ एकल टपल के रूप में तर्कों को खोल देगा ।

कीवर्ड तर्क के लिए आपको एक अलग वास्तविक तर्क के रूप में स्वीकार करना होगा, जैसा कि स्कर्मडेल के उत्तर में दिखाया गया है ।


8
इसके अलावा महत्वपूर्ण ... किसी को एक समय मिल सकता है जब उन्हें किसी फ़ंक्शन के लिए अज्ञात संख्या में तर्क पारित करना होगा। इस तरह के एक मामले में "args" नामक एक सूची बनाकर अपने "manyArgs" को कॉल करें और इस तरह के कई "orAggs (* args)" को पास कर दें
wilbbe01

4
यह करीब है, लेकिन यह दुर्भाग्य से सामान्य रूप से पर्याप्त नहीं है: के manyArgs(x = 3)साथ विफल रहता है TypeError। Skumedel का उत्तर इसका समाधान दिखाता है। मुख्य बिंदु यह है कि किसी फ़ंक्शन का सामान्य हस्ताक्षर f(*list_args, **keyword_args)(नहीं f(*list_args)) है।
एरिक ओ लेबिगोट

2
का प्रकार argsहै tupleकीवर्ड काkwargs अर्थ है । का प्रकार है । kwargsdictionary
रोबोलेक्स

1
बस for arg in args:पारित आरों के माध्यम से पुनरावृत्ति के लिए
MasterControlProgram

228

अनइंड्स पोस्ट में जोड़ना:

आप कई कुंजी-मूल्य आर्ग भी भेज सकते हैं।

def myfunc(**kwargs):
    # kwargs is a dictionary.
    for k,v in kwargs.iteritems():
         print "%s = %s" % (k, v)

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

और आप दोनों को मिला सकते हैं:

def myfunc2(*args, **kwargs):
   for a in args:
       print a
   for k,v in kwargs.iteritems():
       print "%s = %s" % (k, v)

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

उन्हें दोनों घोषित किया जाना चाहिए और उस क्रम में बुलाया जाना चाहिए, यही है कि फ़ंक्शन हस्ताक्षर की आवश्यकता है * आर्ग, ** kwargs, और उस क्रम में बुलाया।


2
निश्चित नहीं है कि आपको काम करने के लिए myfunc (abc = 123, def = 456) कैसे मिला, लेकिन मेरा (2.7) में, 'def' को इस फंक्शन में बिना SyntaxError के पास नहीं किया जा सकता है। मुझे लगता है यह है क्योंकि डीप अजगर में अर्थ है। इसके बजाय myfunc (abc = 123, fgh = 567) आज़माएँ। (अन्यथा, महान जवाब और इसके लिए धन्यवाद!)
Dannid

@ डनीड: नो आइडिया या तो हाहा ... 2.6 या 3.2 पर भी काम नहीं करता है। मैं इसका नाम बदल दूंगा।
Skurmedel

जब आप कहते हैं कि 'उस क्रम में कहा जाता है', तो क्या आपका मतलब उस क्रम में है? या कुछ और?
निखिल प्रभु

1
@ निखिलप्रभु: हाँ। जब आप इसे कहते हैं, तो कीवर्ड तर्क अंतिम आते हैं। यदि आप कॉल में भी गैर-कीवर्ड तर्क रखते हैं तो वे हमेशा अंतिम आते हैं।
Skurmedel

2
पायथन 3 के लिए: बस के print aसाथ print(a), और kwargs.iteritems():साथ विनिमय करें kwargs.items()
मास्टरकंट्रोलप्रोग्राम

22

अगर मैं कर सकता हूँ, Skurmedel का कोड अजगर 2 के लिए है; इसे पायथन 3 में बदलने के iteritemsलिए , itemsकोष्ठक में बदलें और जोड़ें print। यह मेरे जैसे शुरुआती को रोकने के लिए: AttributeError: 'dict' object has no attribute 'iteritems'और कहीं और खोज कर सकता है (उदाहरण के लिए त्रुटि "" तानाशाह 'वस्तु में कोई विशेषता नहीं है' पुनरावृत्तियों ') जब NetworkX के राइट_शैप () का उपयोग करने की कोशिश कर रहा है तो ऐसा क्यों हो रहा है।

def myfunc(**kwargs):
for k,v in kwargs.items():
   print("%s = %s" % (k, v))

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

तथा:

def myfunc2(*args, **kwargs):
   for a in args:
       print(a)
   for k,v in kwargs.items():
       print("%s = %s" % (k, v))

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

12

अन्य उत्कृष्ट पदों में जोड़ना।

कभी-कभी आप तर्कों की संख्या निर्दिष्ट नहीं करना चाहते हैं और उनके लिए कुंजियों का उपयोग करना चाहते हैं (कंपाइलर शिकायत करेगा यदि किसी डिक्शनरी में पास किए गए एक तर्क का उपयोग विधि में नहीं किया गया है)।

def manyArgs1(args):
  print args.a, args.b #note args.c is not used here

def manyArgs2(args):
  print args.c #note args.b and .c are not used here

class Args: pass

args = Args()
args.a = 1
args.b = 2
args.c = 3

manyArgs1(args) #outputs 1 2
manyArgs2(args) #outputs 3

फिर आप जैसे काम कर सकते हैं

myfuns = [manyArgs1, manyArgs2]
for fun in myfuns:
  fun(args)

2
def f(dic):
    if 'a' in dic:
        print dic['a'],
        pass
    else: print 'None',

    if 'b' in dic:
        print dic['b'],
        pass
    else: print 'None',

    if 'c' in dic:
        print dic['c'],
        pass
    else: print 'None',
    print
    pass
f({})
f({'a':20,
   'c':30})
f({'a':20,
   'c':30,
   'b':'red'})
____________

उपरोक्त कोड आउटपुट होगा

None None None
20 None 30
20 red 30

यह एक शब्दकोश के माध्यम से चर तर्कों को पारित करने के रूप में अच्छा है


3
यह भयानक कोड है। दूर बेहतर होगा:f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
मेटापर्ट्योर

0

इसके बारे में जाने का एक और तरीका, पहले से बताए गए अच्छे उत्तरों के अलावा, इस तथ्य पर निर्भर करता है कि आप स्थिति के अनुसार वैकल्पिक नामित तर्क पारित कर सकते हैं। उदाहरण के लिए,

def f(x,y=None):
    print(x)
    if y is not None:
        print(y)

पैदावार

In [11]: f(1,2)
1
2

In [12]: f(1)
1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.