2009-05-28 22 views
245

सी या सी में varargs का उपयोग कर ++ करने के लिए इसी तरह:क्या किसी फ़ंक्शन में तर्कों की एक चर संख्या पारित की जा सकती है?

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

मैं podcast करने के लिए माननीय lottness उल्लेख 53: http://itc.conversationsnetwork.org/shows/detail4111.html?loomia_si=t0:a16:g2:r2: c0.246273: b24677090 –

+1

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

+7

सबसे तेज़ उत्तर यह है कि Google कहता है कि सबसे तेज़ उत्तर है। –

उत्तर

319

हां।

यह सरल है और यदि आप कीवर्ड तर्क उपेक्षा काम करता है:

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) 

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

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

+10

http://docs.python.org/tutorial/controlflow.html#more-on-defining- कार्य – Miles

+5

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

+2

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

179

unwinds पोस्ट करने के लिए जोड़ा जा रहा है:

आप एक से अधिक मुख्य मान आर्ग भी भेज सकते हैं।

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 

वे दोनों घोषित किया जाना चाहिए और इसी क्रम में कहा जाता है, कि समारोह हस्ताक्षर * args, kwargs होने के लिए ** जरूरत है, और में कहा जाता है वह आदेश

+2

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

+0

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

+0

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

11

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

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

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) 
1
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 (कुंजी,' कोई नहीं ')' abc 'में कुंजी के लिए) ' – metaperture

7

यदि मैं कर सकता हूं, Skurmedel सी ओडी पाइथन 2 के लिए है; इसे पायथन 3 में अनुकूलित करने के लिए, iteritems से items बदलें और print पर ब्रांड्स जोड़ें। इससे मेरे जैसे शुरुआती लोगों को टक्कर मिल सकती है: AttributeError: 'dict' object has no attribute 'iteritems' और कहीं और खोजें (उदा। Error “ 'dict' object has no attribute 'iteritems' ” when trying to use NetworkX's write_shp()) यह क्यों हो रहा है।

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 
संबंधित मुद्दे

 संबंधित मुद्दे