একটি ফাংশনে একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট দেওয়া যেতে পারে?


345

সি বা সি ++ তে ভারাগস ব্যবহারের অনুরূপ উপায়ে:

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

5
আমি সম্মানজনক লোটেন্সি পডকাস্ট 53: itc.conversationsnetwork.org/shows/… রেফারেন্স করি
ডেভিড সাইকস

2
আমি মিঃ লটের সাথে এই এক সাথে যেতে চাই। পাইথন ডক্সে আপনি এটির উপর একটি দ্রুত উত্তর পেতে পারেন, ডক্সে অন্য কী আছে তার জন্য আপনি একটি অনুভূতি পাবেন। যদি আপনি পাইথনে কাজ করার পরিকল্পনা করেন তবে এই ডক্সগুলি জানার পক্ষে আপনার সুবিধা হবে।
ব্রায়ান নীল

@ ডেভিডসাইকস লিঙ্কটি নষ্ট হয়েছে
ডেভ লিউ

উত্তর:


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
এছাড়াও গুরুত্বপূর্ণ ... কেউ একটি সময় পেতে পারে যখন তাদের কোনও ফাংশনে অজানা সংখ্যক যুক্তি পাস করতে হয়। এর মতো ক্ষেত্রে "আরগস" নামক একটি তালিকা তৈরি করে এবং এটিগুলিকে অনেকগুলি "অর্গস (* আরগস)" এর মতো পাস করে আপনার "মজাদারআরগস" কল করুন
wilbbe01

4
এটি নিকটে, তবে দুর্ভাগ্যক্রমে এটি যথেষ্ট সাধারণ নয়: এতে manyArgs(x = 3)ব্যর্থ হয় TypeError। স্কুমেলের উত্তর এটির সমাধান দেখায়। মূল বিষয়টি হ'ল কোনও ফাংশনের সাধারণ স্বাক্ষর f(*list_args, **keyword_args)(নয় f(*list_args))।
এরিক হে লেবিগোট

2
ধরণ argsহয় tupleকীওয়ার্ড আরগসkwargs মানে । ধরণ হয় । kwargsdictionary
রোবএলেক্স

1
কেবল for arg in args:পাস করা
আরোগুলির

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

সেগুলি অবশ্যই উভয়ভাবে ঘোষিত এবং সেই ক্রমে ডাকা হবে, এটি হ'ল ফাংশনের স্বাক্ষরটি * আরগস, ** কাওয়ার্গস হওয়া উচিত এবং সেই ক্রমে ডাকা উচিত।


2
আপনি কীভাবে কাজ করতে মাইফুনক (abc = 123, ডিফ = 456) পেয়েছেন তা নিশ্চিত নন, তবে খনিতে (২. in), সিন্ট্যাক্সেরর না পেয়ে এই ফাংশনে 'ডিফ' পাস করা যাবে না। আমি ধরে নিলাম এটি কারণ অজগরটির ডেফের অর্থ রয়েছে। পরিবর্তে myfunc (abc = 123, fgh = 567) চেষ্টা করুন। (অন্যথায়, দুর্দান্ত উত্তর এবং এর জন্য ধন্যবাদ!)
ড্যানিড

@ ড্যানিড: হাহাহা কোন ধারণা নেই ... 2.6 বা 3.2 তেও কাজ করে না। আমি এর নাম পরিবর্তন করব।
স্কুরমেডেল

আপনি যখন 'সেই আদেশে ডেকেছেন' বলছেন, তখন আপনার অর্থ কি সেই অর্ডারে পাস হয়েছে? অথবা অন্য কিছু?
নিখিল প্রভু

1
@ নিখিলপ্রভূ: হ্যাঁ। আপনি যখন এটি কল করবেন তখন কীওয়ার্ড আর্গুমেন্টগুলি অবশ্যই শেষ হওয়া উচিত। কলটিতে আপনার অ-কীওয়ার্ড যুক্তি থাকলে তা সর্বদা শেষ হয়।
স্কুরমেডেল

2
পাইথন 3 এর জন্য: কেবল print aসাথে print(a)এবং এর kwargs.iteritems():সাথে বিনিময় করুন kwargs.items()
মাস্টারকন্ট্রোল প্রোগ্রাম

22

যদি আমি পারি তবে স্কুরমেডেলের কোডটি অজগর 2 এর জন্য; এটি অজগর 3 এর সাথে খাপ খাইয়ে নিতে, পরিবর্তন iteritemsকরুন itemsএবং এতে প্রথম বন্ধন যুক্ত করুন print। এটি আমার মতো নতুনদের মধ্যে .ুকে পড়তে বাধা দিতে পারে: AttributeError: 'dict' object has no attribute 'iteritems'এবং অন্য কোথাও অনুসন্ধান করুন (যেমন ত্রুটি "'ডিক্ট' অবজেক্টটির কোনও 'ইটারিটামস' নেই)" কেন নেটওয়ার্কেক্সএক্স এর রাইট_শ্যাপ () ) কেন ঘটছে তা ব্যবহার করার চেষ্টা করার সময়

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

ইতিমধ্যে উল্লিখিত চমৎকার উত্তরের পাশাপাশি এটি সম্পর্কে আরও একটি উপায় নির্ভর করে যে আপনি অবস্থানের দ্বারা namedচ্ছিক নামযুক্ত যুক্তিগুলি পাস করতে পারবেন upon উদাহরণ স্বরূপ,

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.