C या C ++ में varargs का उपयोग करने के लिए इसी तरह से:
fn(a, b)
fn(a, b, c, d, ...)
C या C ++ में varargs का उपयोग करने के लिए इसी तरह से:
fn(a, b)
fn(a, b, c, d, ...)
जवाबों:
हाँ। आप *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)
जैसा कि आप देख सकते हैं, पायथन सभी तर्कों के साथ एकल टपल के रूप में तर्कों को खोल देगा ।
कीवर्ड तर्क के लिए आपको एक अलग वास्तविक तर्क के रूप में स्वीकार करना होगा, जैसा कि स्कर्मडेल के उत्तर में दिखाया गया है ।
manyArgs(x = 3)साथ विफल रहता है TypeError। Skumedel का उत्तर इसका समाधान दिखाता है। मुख्य बिंदु यह है कि किसी फ़ंक्शन का सामान्य हस्ताक्षर f(*list_args, **keyword_args)(नहीं f(*list_args)) है।
argsहै tuple। कीवर्ड काkwargs अर्थ है । का प्रकार है । kwargsdictionary
for arg in args:पारित आरों के माध्यम से पुनरावृत्ति के लिए
अनइंड्स पोस्ट में जोड़ना:
आप कई कुंजी-मूल्य आर्ग भी भेज सकते हैं।
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, और उस क्रम में बुलाया।
print aसाथ print(a), और kwargs.iteritems():साथ विनिमय करें kwargs.items()।
अगर मैं कर सकता हूँ, 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
अन्य उत्कृष्ट पदों में जोड़ना।
कभी-कभी आप तर्कों की संख्या निर्दिष्ट नहीं करना चाहते हैं और उनके लिए कुंजियों का उपयोग करना चाहते हैं (कंपाइलर शिकायत करेगा यदि किसी डिक्शनरी में पास किए गए एक तर्क का उपयोग विधि में नहीं किया गया है)।
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)
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
यह एक शब्दकोश के माध्यम से चर तर्कों को पारित करने के रूप में अच्छा है
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
इसके बारे में जाने का एक और तरीका, पहले से बताए गए अच्छे उत्तरों के अलावा, इस तथ्य पर निर्भर करता है कि आप स्थिति के अनुसार वैकल्पिक नामित तर्क पारित कर सकते हैं। उदाहरण के लिए,
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