প্যারামিটারগুলির জন্য ** (ডাবল স্টার / অ্যাসিটার্ক) এবং * (তারা / তারকাচিহ্ন) কী করে?


2346

নিম্নলিখিত পদ্ধতি সংজ্ঞা কী নেই *এবং **জন্য কি param2?

def foo(param1, *param2):
def bar(param1, **param2):



আরও দেখুন stackoverflow.com/questions/14301967/... একটি খালি তারকাচিহ্ন জন্য
naught101

23
এই প্রশ্নটি একটি খুব জনপ্রিয় সদৃশ লক্ষ্য, কিন্তু দুর্ভাগ্যক্রমে এটি প্রায়শই ভুলভাবে ব্যবহৃত হয়। মনে রাখবেন যে এই প্রশ্নটি ভারারা ( def func(*args)) সহ ফাংশন সংজ্ঞায়িত করার বিষয়ে জিজ্ঞাসা করে । ফাংশন কলগুলির অর্থ কী তা জিজ্ঞাসা করার জন্য ( func(*[1,2])) এখানে দেখুন । যুক্তি তালিকাগুলি আনপ্যাক করবেন এমন প্রশ্নের জন্য এখানে দেখুনআক্ষরিক ( ) এর *অর্থ কী তা জিজ্ঞাসা করার জন্য এখানে দেখুন[*[1, 2]]
অরণ-ফে

আপনি এখানে ফাংশন সংজ্ঞা এবং ফাংশন কল এর ব্যবহার সম্পর্কে জানতে পারেন: pythontips.com/2013/08/04/args-and-kwargs-in-python- বর্ণিত
অক্ষয় অনুরাগ

উত্তর:


2232

*argsএবং **kwargsএকটি সাধারণ বাগ্ধারা ফাংশন অধ্যায় বর্ণনা অনুযায়ী আর্গুমেন্ট স্বেচ্ছাচারী সংখ্যা অনুমতি দেওয়া ফাংশন সংজ্ঞায়িত সম্পর্কে আরো পাইথন ডকুমেন্টেশন হবে।

*argsআপনি সব ফাংশন পরামিতি দেব একটি tuple যেমন :

def foo(*args):
    for a in args:
        print(a)        

foo(1)
# 1

foo(1,2,3)
# 1
# 2
# 3

**kwargsআপনি সব দেব শব্দ আর্গুমেন্ট একটি অভিধান হিসাবে একটি ফর্ম্যাল প্যারামিটার সংশ্লিষ্ট তাদের জন্য ব্যতীত।

def bar(**kwargs):
    for a in kwargs:
        print(a, kwargs[a])  

bar(name='one', age=27)
# age 27
# name one

উভয় প্রজ্ঞাবদ্ধকে নির্দিষ্ট আর্গুমেন্টের সেট এবং কিছু পরিবর্তনশীল আর্গুমেন্টের অনুমতি দিতে সাধারণ যুক্তির সাথে মিশ্রিত করা যেতে পারে:

def foo(kind, *args, **kwargs):
   pass

এটিকে অন্যভাবে ব্যবহার করাও সম্ভব:

def foo(a, b, c):
    print(a, b, c)

obj = {'b':10, 'c':'lee'}

foo(100,**obj)
# 100 10 lee

*lআইডিয়মের আরেকটি ব্যবহার হ'ল কোনও ফাংশন কল করার সময় আর্গুমেন্টের তালিকা আনপ্যাক করা

def foo(bar, lee):
    print(bar, lee)

l = [1,2]

foo(*l)
# 1 2

পাইথন 3- *lতে একটি অ্যাসাইনমেন্টের বাম দিকে ব্যবহার করা সম্ভব ( বর্ধিত আইট্রেবল আনপ্যাকিং ) যদিও এটি এই প্রসঙ্গে টিপলের পরিবর্তে একটি তালিকা দেয়:

first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]

এছাড়াও পাইথন 3 নতুন সিমেটিক যুক্ত করেছে ( পিইপি 3102 দেখুন ):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

এই জাতীয় ফাংশনটি কেবল 3 স্থিতিগত আর্গুমেন্ট গ্রহণ করে এবং তারপরে সমস্ত কিছুই *কেবল কীওয়ার্ড আর্গুমেন্ট হিসাবে পাস করা যায়।


9
[]] এর আউটপুট বিপরীত ক্রমে। নাম এক বয়সের 27
থানো। 21

53
@ থনোস.এ পাইথন ডিক্টস, শব্দার্থভাবে ব্যবহৃত হয়েছে কীওয়ার্ড আর্গুমেন্ট পাস করার জন্য, নির্বিচারে আদেশ করা হয়। যাইহোক, পাইথন ৩.6-তে, কীওয়ার্ড আর্গুমেন্টগুলি সন্নিবেশ ক্রমটি মনে করার নিশ্চয়তা দেওয়া হয়। " **kwargsএখন উপাদানের ক্রমটি ক্রমের সাথে কীওয়ার্ড আর্গুমেন্টগুলি প্রেরণ করা হয়েছিল তার সাথে মিলে যায়" " - docs.python.org/3/whatsnew/3.6.html প্রকৃতপক্ষে, সিপথন ৩.6-এ থাকা সমস্ত ডিস্কগুলি প্রয়োগের বিবরণ হিসাবে সন্নিবেশ ক্রমটি মনে রাখবে, এটি পাইথন ৩. in- এ স্ট্যান্ডার্ড হয়ে যায়।
অ্যারন হল

13
খুব সুনির্দিষ্ট, পরিষ্কার এবং সহজে বোঝা যায়। আমি প্রশংসা করি যে আপনি উল্লেখ করেছেন যে এটি একটি "আনপ্যাকিং অপারেটর", যাতে আমি সি +1-এ রেফারেন্স দিয়ে পাস করতে পার্থক্য করতে পারি
bballdave025

পিইপি 3102 দিয়ে শেষ ফাংশনটি কীভাবে পরীক্ষা করবেন? আমি এটিকে ফানক (1,2,3, নাম = "আমি", বয়স = 10) দিয়ে বলি এবং এটি ব্যতিক্রম ছুঁড়ে ফেলেছে:got an unexpected keyword argument 'name'
কোক

@ কোকহোহে তেঁতুলের নামগুলি যেমন ফাংশনটিতে রয়েছে তেমন আপনাকে পাস করতে হবে: ফানক (1, 2, 3, কোয়ার্গ 1 = 'আমি', কাওয়ার্গ 2 = 10)
জন অ্যারন

622

আপনি যেগুলি ব্যবহার করতে পারবেন *এবং **ফাংশনগুলিতে কল করার সময় এটিও লক্ষণীয় । এটি একটি শর্টকাট যা আপনাকে তালিকাগুলি / টুপল বা অভিধানের সাহায্যে সরাসরি কোনও ফাংশনে একাধিক যুক্তি সরবরাহ করতে দেয়। উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত ফাংশন থাকে:

def foo(x,y,z):
    print("x=" + str(x))
    print("y=" + str(y))
    print("z=" + str(z))

আপনি যেমন কাজ করতে পারেন:

>>> mylist = [1,2,3]
>>> foo(*mylist)
x=1
y=2
z=3

>>> mydict = {'x':1,'y':2,'z':3}
>>> foo(**mydict)
x=1
y=2
z=3

>>> mytuple = (1, 2, 3)
>>> foo(*mytuple)
x=1
y=2
z=3

দ্রষ্টব্য: কীগুলির mydictফাংশনের পরামিতিগুলির মতো ঠিক নামকরণ করতে হবে foo। অন্যথায় এটি একটি নিক্ষেপ করবে TypeError:

>>> mydict = {'x':1,'y':2,'z':3,'badnews':9}
>>> foo(**mydict)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got an unexpected keyword argument 'badnews'

175

একক * এর অর্থ হ'ল অতিরিক্ত অবস্থানগত যুক্তিগুলির সংখ্যা অনেকগুলি হতে পারে। foo()অনুরোধ করা যেতে পারে foo(1,2,3,4,5)। ফু এর শরীরে () পরম 2 একটি ক্রম 2-5 রয়েছে।

ডাবল ** এর অর্থ অতিরিক্ত নামকরণের অনেকগুলি প্যারামিটার থাকতে পারে। bar()অনুরোধ করা যেতে পারে bar(1, a=2, b=3)। বারের মূল অংশে () প্যারাম 2 হল একটি অভিধান যা is 'এ': 2, 'বি': 3 containing রয়েছে

নিম্নলিখিত কোড সহ:

def foo(param1, *param2):
    print(param1)
    print(param2)

def bar(param1, **param2):
    print(param1)
    print(param2)

foo(1,2,3,4,5)
bar(1,a=2,b=3)

আউটপুট হয়

1
(2, 3, 4, 5)
1
{'a': 2, 'b': 3}

4
foobar(param1, *param2, **param3)এই উত্তরটির সম্পূর্ণতার জন্য সম্ভবত একটি অতিরিক্ত উদাহরণ প্রয়োজন।
অনিকেত ঠাকুর

1
@ আনিকেটঠাকুর এখানে অবশিষ্ট অংশ যুক্ত করেছেন ।
রাজ

147

প্যারামিটারগুলির জন্য **(ডাবল স্টার) এবং *(তারা) কী করে

তারা ফাংশনগুলি গ্রহণযোগ্যতা হিসাবে সংজ্ঞায়িত করার জন্য এবং ব্যবহারকারীদের যে কোনও সংখ্যক যুক্তি, অবস্থানগত ( *) এবং কীওয়ার্ড ( **) পাস করার জন্য অনুমতি দেয় ।

কার্যকারিতা সংজ্ঞায়িত করা হচ্ছে

*argsযেকোন সংখ্যক alচ্ছিক অবস্থানগত আর্গুমেন্ট (পরামিতি) এর জন্য অনুমতি দেয়, যা নামের একটি টিপলকে অর্পণ করা হবে args

**kwargsযেকোন সংখ্যক arguচ্ছিক কীওয়ার্ড আর্গুমেন্ট (পরামিতি) এর জন্য অনুমতি দেয় যা নামের একটি ডিকটিতে থাকবে kwargs

আপনি কোনও উপযুক্ত নাম চয়ন করতে পারেন (এবং হওয়া উচিত), তবে যদি উদ্দেশ্যটি অ-নির্দিষ্ট শব্দার্থ হতে পারে argsএবং kwargsমানক নাম হয়।

সম্প্রসারণ, যে কোনও সংখ্যক আর্গুমেন্ট পাস করা

এছাড়াও আপনি ব্যবহার করতে পারেন *argsএবং **kwargsতালিকা (অথবা কোন iterable) এবং dicts (অথবা কোন ম্যাপিং) থেকে পরামিতি মধ্যে পাস করতে যথাক্রমে।

পরামিতিগুলি পুনরুদ্ধার করে ফাংশনটি জানতে হবে না যে সেগুলি প্রসারিত হচ্ছে।

উদাহরণস্বরূপ, পাইথন 2 এর এক্সরেঞ্জ স্পষ্টভাবে প্রত্যাশা করে না *args, তবে যেহেতু এটি 3 টি পূর্ণসংখ্যার যুক্তি হিসাবে গ্রহণ করে:

>>> x = xrange(3) # create our *args - an iterable of 3 integers
>>> xrange(*x)    # expand here
xrange(0, 2, 2)

অন্য উদাহরণ হিসাবে, আমরা এতে ডেক সম্প্রসারণ ব্যবহার করতে পারি str.format:

>>> foo = 'FOO'
>>> bar = 'BAR'
>>> 'this is foo, {foo} and bar, {bar}'.format(**locals())
'this is foo, FOO and bar, BAR'

পাইথন 3 এ নতুন: কেবলমাত্র মূলশব্দ যুক্তি দিয়ে কার্যকারিতা সংজ্ঞায়িত করা

আপনি থাকতে পারে শুধুমাত্র আর্গুমেন্ট শব্দ পর *args- উদাহরণস্বরূপ, এখানে, kwarg2একটি শব্দ আর্গুমেন্ট হিসাবে দেওয়া হবে - positionally না:

def foo(arg, kwarg=None, *args, kwarg2=None, **kwargs): 
    return arg, kwarg, args, kwarg2, kwargs

ব্যবহার:

>>> foo(1,2,3,4,5,kwarg2='kwarg2', bar='bar', baz='baz')
(1, 2, (3, 4, 5), 'kwarg2', {'bar': 'bar', 'baz': 'baz'})

এছাড়াও, *সীমাহীন অবস্থানগত আর্গুমেন্টের অনুমতি না দিয়ে কেবল কীওয়ার্ডটি কেবল আর্গুমেন্ট অনুসরণ করে তা বোঝাতে নিজেই ব্যবহার করা যেতে পারে।

def foo(arg, kwarg=None, *, kwarg2=None, **kwargs): 
    return arg, kwarg, kwarg2, kwargs

এখানে kwarg2আবার অবশ্যই একটি স্পষ্টরূপে নামকরণ করা উচিত, মূলশব্দ যুক্তি:

>>> foo(1,2,kwarg2='kwarg2', foo='foo', bar='bar')
(1, 2, 'kwarg2', {'foo': 'foo', 'bar': 'bar'})

এবং আমরা আর সীমাহীন অবস্থানগত যুক্তি গ্রহণ করতে পারি না কারণ আমাদের কাছে নেই *args*:

>>> foo(1,2,3,4,5, kwarg2='kwarg2', foo='foo', bar='bar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes from 1 to 2 positional arguments 
    but 5 positional arguments (and 1 keyword-only argument) were given

আবার, আরও সহজভাবে, এখানে আমাদের kwargনাম দিয়ে দেওয়া দরকার, অবস্থানগতভাবে নয়:

def bar(*, kwarg=None): 
    return kwarg

এই উদাহরণে, আমরা দেখতে পাচ্ছি যে আমরা kwargঅবস্থানগতভাবে পাস করার চেষ্টা করলে আমরা একটি ত্রুটি পাই:

>>> bar('kwarg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bar() takes 0 positional arguments but 1 was given

আমাদের kwargকীওয়ার্ড আর্গুমেন্ট হিসাবে স্পষ্টভাবে প্যারামিটারটি পাস করতে হবে ।

>>> bar(kwarg='kwarg')
'kwarg'

পাইথন 2 সামঞ্জস্যপূর্ণ ডেমো

*args(সাধারণত "স্টার-আরগস" বলেছিলেন) এবং **kwargs(তারাগুলি "কাওয়ার্গস" বলে বোঝানো যেতে পারে তবে "ডাবল-স্টার কাওয়ার্গস" দিয়ে স্পষ্ট হওয়া উচিত) পাইথনের সাধারণ পরিচয় *এবং **নোটেশনটি ব্যবহার করার জন্য । এই নির্দিষ্ট পরিবর্তনশীল নামগুলির প্রয়োজন নেই (যেমন আপনি ব্যবহার করতে পারেন *foosএবং **bars), তবে কনভেনশন থেকে বিদায় নেওয়ার ফলে আপনার সহকর্মী পাইথন কোডারকে ক্রোধ করতে পারে।

আমরা সাধারণত আমাদের এগুলি ব্যবহার করি যখন আমরা জানি না যে আমাদের ফাংশনটি কী পেতে চলেছে বা আমরা কয়টি যুক্তি দিয়ে যাচ্ছি এবং কিছু সময় এমনকি যখন প্রতিটি ভেরিয়েবলের আলাদা আলাদা নামকরণ করা হয় তখন খুব অগোছালো এবং নিষ্প্রয়োজনীয় হয় (তবে এটি এমন একটি ক্ষেত্রে যেখানে সাধারণত স্পষ্ট হয় অন্তর্নিহিত চেয়ে ভাল)।

উদাহরণ 1

নিম্নলিখিত ফাংশনটি কীভাবে সেগুলি ব্যবহার করা যায় তা বর্ণনা করে এবং আচরণ প্রদর্শন করে। নোট bযুক্তিটি দ্বিতীয় অবস্থানগত আর্গুমেন্ট দ্বারা পূর্বে গ্রাস করা হবে নোট করুন :

def foo(a, b=10, *args, **kwargs):
    '''
    this function takes required argument a, not required keyword argument b
    and any number of unknown positional arguments and keyword arguments after
    '''
    print('a is a required argument, and its value is {0}'.format(a))
    print('b not required, its default value is 10, actual value: {0}'.format(b))
    # we can inspect the unknown arguments we were passed:
    #  - args:
    print('args is of type {0} and length {1}'.format(type(args), len(args)))
    for arg in args:
        print('unknown arg: {0}'.format(arg))
    #  - kwargs:
    print('kwargs is of type {0} and length {1}'.format(type(kwargs),
                                                        len(kwargs)))
    for kw, arg in kwargs.items():
        print('unknown kwarg - kw: {0}, arg: {1}'.format(kw, arg))
    # But we don't have to know anything about them 
    # to pass them to other functions.
    print('Args or kwargs can be passed without knowing what they are.')
    # max can take two or more positional args: max(a, b, c...)
    print('e.g. max(a, b, *args) \n{0}'.format(
      max(a, b, *args))) 
    kweg = 'dict({0})'.format( # named args same as unknown kwargs
      ', '.join('{k}={v}'.format(k=k, v=v) 
                             for k, v in sorted(kwargs.items())))
    print('e.g. dict(**kwargs) (same as {kweg}) returns: \n{0}'.format(
      dict(**kwargs), kweg=kweg))

আমরা ফাংশনের স্বাক্ষরের জন্য অনলাইন সহায়তা পরীক্ষা করতে পারবেন সঙ্গে help(foo), যা আমাদের বলে

foo(a, b=10, *args, **kwargs)

এর সাথে এই ফাংশন কল করুন foo(1, 2, 3, 4, e=5, f=6, g=7)

যা প্রিন্ট করে:

a is a required argument, and its value is 1
b not required, its default value is 10, actual value: 2
args is of type <type 'tuple'> and length 2
unknown arg: 3
unknown arg: 4
kwargs is of type <type 'dict'> and length 3
unknown kwarg - kw: e, arg: 5
unknown kwarg - kw: g, arg: 7
unknown kwarg - kw: f, arg: 6
Args or kwargs can be passed without knowing what they are.
e.g. max(a, b, *args) 
4
e.g. dict(**kwargs) (same as dict(e=5, f=6, g=7)) returns: 
{'e': 5, 'g': 7, 'f': 6}

উদাহরণ 2

আমরা এটিকে আর একটি ফাংশন ব্যবহার করে কল করতে পারি, যেখানে আমরা কেবল সরবরাহ করি a:

def bar(a):
    b, c, d, e, f = 2, 3, 4, 5, 6
    # dumping every local variable into foo as a keyword argument 
    # by expanding the locals dict:
    foo(**locals()) 

bar(100) কপি করে প্রিন্ট:

a is a required argument, and its value is 100
b not required, its default value is 10, actual value: 2
args is of type <type 'tuple'> and length 0
kwargs is of type <type 'dict'> and length 4
unknown kwarg - kw: c, arg: 3
unknown kwarg - kw: e, arg: 5
unknown kwarg - kw: d, arg: 4
unknown kwarg - kw: f, arg: 6
Args or kwargs can be passed without knowing what they are.
e.g. max(a, b, *args) 
100
e.g. dict(**kwargs) (same as dict(c=3, d=4, e=5, f=6)) returns: 
{'c': 3, 'e': 5, 'd': 4, 'f': 6}

উদাহরণ 3: সাজসজ্জারগুলিতে ব্যবহারিক ব্যবহার

ঠিক আছে, তাই সম্ভবত আমরা ইউটিলিটিটি এখনও দেখছি না। সুতরাং কল্পনা করুন যে আপনার আগে এবং / অথবা ডিফারেনটিটিং কোডের পরে অপ্রয়োজনীয় কোড সহ বেশ কয়েকটি ফাংশন রয়েছে। নিম্নলিখিত নামযুক্ত ফাংশনগুলি চিত্রের উদ্দেশ্যে কেবল ছদ্ম-কোড।

def foo(a, b, c, d=0, e=100):
    # imagine this is much more code than a simple function call
    preprocess() 
    differentiating_process_foo(a,b,c,d,e)
    # imagine this is much more code than a simple function call
    postprocess()

def bar(a, b, c=None, d=0, e=100, f=None):
    preprocess()
    differentiating_process_bar(a,b,c,d,e,f)
    postprocess()

def baz(a, b, c, d, e, f):
    ... and so on

আমরা এটি অন্যভাবে পরিচালনা করতে সক্ষম হতে পারি, তবে আমরা অবশ্যই একটি ডিকোরেটারের সাহায্যে অতিরিক্ত অর্থ ছাড়তে পারি, এবং সুতরাং আমাদের নীচের উদাহরণটি দেখায় যে কীভাবে *argsএবং **kwargsখুব কার্যকর হতে পারে:

def decorator(function):
    '''function to wrap other functions with a pre- and postprocess'''
    @functools.wraps(function) # applies module, name, and docstring to wrapper
    def wrapper(*args, **kwargs):
        # again, imagine this is complicated, but we only write it once!
        preprocess()
        function(*args, **kwargs)
        postprocess()
    return wrapper

এবং এখন প্রতিটি মোড়ানো ফাংশন আরও বেশি সংক্ষিপ্তভাবে লেখা যেতে পারে, যেমন আমরা অযৌক্তিকতাটি প্রকাশ করেছি:

@decorator
def foo(a, b, c, d=0, e=100):
    differentiating_process_foo(a,b,c,d,e)

@decorator
def bar(a, b, c=None, d=0, e=100, f=None):
    differentiating_process_bar(a,b,c,d,e,f)

@decorator
def baz(a, b, c=None, d=0, e=100, f=None, g=None):
    differentiating_process_baz(a,b,c,d,e,f, g)

@decorator
def quux(a, b, c=None, d=0, e=100, f=None, g=None, h=None):
    differentiating_process_quux(a,b,c,d,e,f,g,h)

এবং আমাদের কোডটি ফ্যাক্টরিংয়ের মাধ্যমে, যা আমাদের করার অনুমতি দেয় *argsএবং **kwargsআমরা কোডের লাইনগুলি হ্রাস করি, পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করি এবং আমাদের প্রোগ্রামে যুক্তির জন্য একমাত্র আধ্যাত্মিক অবস্থানগুলি রাখি। আমাদের যদি এই কাঠামোর কোনও অংশ পরিবর্তন করার প্রয়োজন হয় তবে প্রতিটি পরিবর্তন করার জন্য আমাদের একটি জায়গা রয়েছে।


48

আসুন প্রথমে অবস্থানগত আর্গুমেন্ট এবং কীওয়ার্ড আর্গুমেন্টগুলি কী তা বুঝতে পারি। নীচে অবস্থানগত আর্গুমেন্ট সহ ফাংশন সংজ্ঞা একটি উদাহরণ

def test(a,b,c):
     print(a)
     print(b)
     print(c)

test(1,2,3)
#output:
1
2
3

সুতরাং এটি অবস্থানগত আর্গুমেন্ট সহ একটি ফাংশন সংজ্ঞা। আপনি কীওয়ার্ড / নামযুক্ত আর্গুমেন্টের সাথে এটি কল করতে পারেন:

def test(a,b,c):
     print(a)
     print(b)
     print(c)

test(a=1,b=2,c=3)
#output:
1
2
3

এখন আসুন কীওয়ার্ড আর্গুমেন্টগুলির সাথে ফাংশন সংজ্ঞাটির একটি উদাহরণ অধ্যয়ন করি :

def test(a=0,b=0,c=0):
     print(a)
     print(b)
     print(c)
     print('-------------------------')

test(a=1,b=2,c=3)
#output :
1
2
3
-------------------------

আপনি এই ফাংশনটি অবস্থানগত আর্গুমেন্টগুলির সাথেও কল করতে পারেন:

def test(a=0,b=0,c=0):
    print(a)
    print(b)
    print(c)
    print('-------------------------')

test(1,2,3)
# output :
1
2
3
---------------------------------

সুতরাং আমরা এখন অবস্থানগত পাশাপাশি কীওয়ার্ড আর্গুমেন্ট সহ ফাংশন সংজ্ঞা জানি।

এখন আসুন আমরা '*' অপারেটর এবং '**' অপারেটরটি অধ্যয়ন করি।

দয়া করে মনে রাখবেন এই অপারেটরগুলি 2 টি ক্ষেত্রে ব্যবহার করা যেতে পারে:

ক) ফাংশন কল

খ) ফাংশন সংজ্ঞা

ফাংশন কলে '*' অপারেটর এবং '**' অপারেটরের ব্যবহার।

আসুন সরাসরি একটি উদাহরণে আসি এবং তারপরে এটি আলোচনা করব।

def sum(a,b):  #receive args from function calls as sum(1,2) or sum(a=1,b=2)
    print(a+b)

my_tuple = (1,2)
my_list = [1,2]
my_dict = {'a':1,'b':2}

# Let us unpack data structure of list or tuple or dict into arguments with help of '*' operator
sum(*my_tuple)   # becomes same as sum(1,2) after unpacking my_tuple with '*'
sum(*my_list)    # becomes same as sum(1,2) after unpacking my_list with  '*'
sum(**my_dict)   # becomes same as sum(a=1,b=2) after unpacking by '**' 

# output is 3 in all three calls to sum function.

তাই মনে আছে

যখন '*' বা '**' অপারেটর কোনও ফাংশন কলে ব্যবহৃত হয় -

'*' অপারেটর ডাটা স্ট্রাকচারকে আনপ্যাক করে যেমন ফাংশন সংজ্ঞা দ্বারা প্রয়োজনীয় আর্গুমেন্টগুলিতে একটি তালিকা বা টিপল।

'**' অপারেটর একটি অভিধানকে ফাংশন সংজ্ঞা দ্বারা প্রয়োজনীয় আর্গুমেন্টে আনপ্যাক করে।

এখন আসুন ফাংশন সংজ্ঞাতে '*' অপারেটর ব্যবহার অধ্যয়ন করি । উদাহরণ:

def sum(*args): #pack the received positional args into data structure of tuple. after applying '*' - def sum((1,2,3,4))
    sum = 0
    for a in args:
        sum+=a
    print(sum)

sum(1,2,3,4)  #positional args sent to function sum
#output:
10

ফাংশন সংজ্ঞায় '*' অপারেটর প্রাপ্ত আর্গুমেন্টগুলিকে একটি টিউপলে প্যাক করে।

এখন আসুন ফাংশন সংজ্ঞায় ব্যবহৃত '**' এর একটি উদাহরণ দেখুন:

def sum(**args): #pack keyword args into datastructure of dict after applying '**' - def sum({a:1,b:2,c:3,d:4})
    sum=0
    for k,v in args.items():
        sum+=v
    print(sum)

sum(a=1,b=2,c=3,d=4) #positional args sent to function sum

ফাংশন সংজ্ঞাতে '**' অপারেটর প্রাপ্ত আর্গুমেন্টকে একটি অভিধানে প্যাক করে।

সুতরাং মনে রাখবেন:

কোনও ফাংশনে '*' টিপলের ডেটা স্ট্রাকচারকে আনপ্যাক করে কল করুন বা ফাংশন সংজ্ঞা অনুসারে প্রাপ্ত অবস্থানগত বা মূলশব্দ আর্গুমেন্টের তালিকা করুন।

একটি ফাংশনে ফাংশন সংজ্ঞা দ্বারা প্রাপ্ত হওয়ার জন্য অবস্থানের বা কীওয়ার্ড আর্গুমেন্টে অভিধানের ডেটা স্ট্রাকচারকে আনপ্যাক করে '**' কল করুন ।

একটি ফাংশন সংজ্ঞায় '*' অবস্থানগত আর্গুমেন্টগুলিকে একটি টিউপলে প্যাক করে

কোনও ফাংশন সংজ্ঞায় '**' মূলশব্দ আর্গুমেন্টকে একটি অভিধানে প্যাক করে


সত্যিই পরিষ্কার, ধাপে ধাপে এবং ব্যাখ্যা অনুসরণ করা সহজ!
Aleksandar

ধন্যবাদ আগমনগুলি রাখুন। [এছাড়াও আমার কাছ থেকে আরও নোটের জন্য, আমি টুইটারে @ মিটারটেকমেকারে আছি]
করণ আহুজা

32

এই টেবিলের ব্যবহার করার জন্য সুবিধাজনক *এবং **ফাংশনে নির্মাণ এবং ফাংশন কল :

            In function construction         In function call
=======================================================================
          |  def f(*args):                 |  def f(a, b):
*args     |      for arg in args:          |      return a + b
          |          print(arg)            |  args = (1, 2)
          |  f(1, 2)                       |  f(*args)
----------|--------------------------------|---------------------------
          |  def f(a, b):                  |  def f(a, b):
**kwargs  |      return a + b              |      return a + b
          |  def g(**kwargs):              |  kwargs = dict(a=1, b=2)
          |      return f(**kwargs)        |  f(**kwargs)
          |  g(a=1, b=2)                   |
-----------------------------------------------------------------------

এটি সত্যিই কেবল লরিন হচস্টিনের উত্তর সংক্ষিপ্তসার হিসাবে কাজ করে তবে আমি এটি সহায়ক বলে মনে করি।

সম্পর্কিত: স্টার / স্প্ল্যাট অপারেটরগুলির জন্য ব্যবহারগুলি পাইথন 3 এ প্রসারিত করা হয়েছে


22

*এবং **ফাংশন যুক্তি তালিকার বিশেষ ব্যবহার রয়েছে have * আর্গুমেন্টটি একটি তালিকা এবং **সূচিত করে যে আর্গুমেন্টটি একটি অভিধান। এটি ফাংশনগুলিকে নির্বিচারে সংখ্যক আর্গুমেন্ট নিতে সহায়তা করে


17

আপনারা যারা উদাহরণ দিয়ে শিখেন!

  1. এর উদ্দেশ্যটি * হ'ল কোনও ফাংশন সংজ্ঞায়িত করার ক্ষমতা প্রদান যা একটি তালিকা হিসাবে সরবরাহ করা সালিশী সংখ্যক আর্গুমেন্ট নিতে পারে f(*myList)
  2. এর উদ্দেশ্য **হ'ল আপনাকে একটি অভিধান সরবরাহ করে কোনও ফাংশনের যুক্তিগুলি খাওয়ানোর ক্ষমতা দেওয়া (উদাঃ f(**{'x' : 1, 'y' : 2}))।

আমাদের এই দেখাই একটি ফাংশন যে দুটি স্বাভাবিক ভেরিয়েবল লাগে সংজ্ঞা দ্বারা x, yএবং হিসাবে আরো আর্গুমেন্ট গ্রহণ করতে পারে myArgs, এবং আরও বেশি আর্গুমেন্ট গ্রহণ করতে পারে myKW। পরবর্তীতে, কিভাবে আমরা ভোজন দেখাবে yব্যবহার myArgDict

def f(x, y, *myArgs, **myKW):
    print("# x      = {}".format(x))
    print("# y      = {}".format(y))
    print("# myArgs = {}".format(myArgs))
    print("# myKW   = {}".format(myKW))
    print("# ----------------------------------------------------------------------")

# Define a list for demonstration purposes
myList    = ["Left", "Right", "Up", "Down"]
# Define a dictionary for demonstration purposes
myDict    = {"Wubba": "lubba", "Dub": "dub"}
# Define a dictionary to feed y
myArgDict = {'y': "Why?", 'y0': "Why not?", "q": "Here is a cue!"}

# The 1st elem of myList feeds y
f("myEx", *myList, **myDict)
# x      = myEx
# y      = Left
# myArgs = ('Right', 'Up', 'Down')
# myKW   = {'Wubba': 'lubba', 'Dub': 'dub'}
# ----------------------------------------------------------------------

# y is matched and fed first
# The rest of myArgDict becomes additional arguments feeding myKW
f("myEx", **myArgDict)
# x      = myEx
# y      = Why?
# myArgs = ()
# myKW   = {'y0': 'Why not?', 'q': 'Here is a cue!'}
# ----------------------------------------------------------------------

# The rest of myArgDict becomes additional arguments feeding myArgs
f("myEx", *myArgDict)
# x      = myEx
# y      = y
# myArgs = ('y0', 'q')
# myKW   = {}
# ----------------------------------------------------------------------

# Feed extra arguments manually and append even more from my list
f("myEx", 4, 42, 420, *myList, *myDict, **myDict)
# x      = myEx
# y      = 4
# myArgs = (42, 420, 'Left', 'Right', 'Up', 'Down', 'Wubba', 'Dub')
# myKW   = {'Wubba': 'lubba', 'Dub': 'dub'}
# ----------------------------------------------------------------------

# Without the stars, the entire provided list and dict become x, and y:
f(myList, myDict)
# x      = ['Left', 'Right', 'Up', 'Down']
# y      = {'Wubba': 'lubba', 'Dub': 'dub'}
# myArgs = ()
# myKW   = {}
# ----------------------------------------------------------------------

আদেশ সহকারে

  1. ** অভিধানের জন্য একচেটিয়াভাবে সংরক্ষিত।
  2. অ-alচ্ছিক যুক্তি অ্যাসাইনমেন্টটি প্রথমে ঘটে।
  3. আপনি দুবার অ-alচ্ছিক যুক্তি ব্যবহার করতে পারবেন না।
  4. প্রযোজ্য হলে **অবশ্যই *সর্বদা আসবে come

14

পাইথন ডকুমেন্টেশন থেকে:

যদি আনুষ্ঠানিক প্যারামিটার স্লটগুলির চেয়ে আরও বেশি স্থিতিগত যুক্তি থাকে তবে টাইপ-এয়ারের ব্যতিক্রম উত্থাপিত হয়, যদি না সিনট্যাক্স "* সনাক্তকারী" ব্যবহার করে একটি ফর্মাল প্যারামিটার উপস্থিত থাকে; এই ক্ষেত্রে, সেই আনুষ্ঠানিক পরামিতি অতিরিক্ত অবস্থানগত আর্গুমেন্ট (বা কোনও অতিরিক্ত অবস্থানগত আর্গুমেন্ট না থাকলে একটি খালি টিপল) সম্বলিত একটি টুপল গ্রহণ করে।

যদি কোনও কীওয়ার্ড আর্গুমেন্ট একটি আনুষ্ঠানিক প্যারামিটার নামের সাথে সামঞ্জস্য না করে তবে টাইপআরর ব্যতিক্রম উত্থাপিত হয়, যদি না সিনট্যাক্স "** সনাক্তকারী" ব্যবহার করে একটি আনুষ্ঠানিক প্যারামিটার উপস্থিত থাকে; এই ক্ষেত্রে, সেই আনুষ্ঠানিক প্যারামিটারে অতিরিক্ত কীওয়ার্ড আর্গুমেন্ট (কী হিসাবে কীওয়ার্ড এবং যুক্ত মান হিসাবে সংশ্লিষ্ট মানগুলি ব্যবহার করে), বা কোনও অতিরিক্ত কীওয়ার্ড আর্গুমেন্ট না থাকলে একটি (নতুন) খালি অভিধান পাওয়া যায় dictionary


10

* টিপল হিসাবে পরিবর্তনশীল আর্গুমেন্ট গ্রহণ মানে

** অর্থ অভিধান হিসাবে পরিবর্তনশীল আর্গুমেন্ট গ্রহণ

নিম্নলিখিতগুলির মতো ব্যবহৃত:

1) একক *

def foo(*args):
    for arg in args:
        print(arg)

foo("two", 3)

আউটপুট:

two
3

2) এখন **

def bar(**kwargs):
    for key in kwargs:
        print(key, kwargs[key])

bar(dic1="two", dic2=3)

আউটপুট:

dic1 two
dic2 3

8

আমি একটি উদাহরণ দিতে চাই যা অন্যরা উল্লেখ করেনি

* কোনও জেনারেটরও আনপ্যাক করতে পারে

পাইথন 3 ডকুমেন্টের একটি উদাহরণ

x = [1, 2, 3]
y = [4, 5, 6]

unzip_x, unzip_y = zip(*zip(x, y))

আনজিপ_এক্স হবে [1, 2, 3], আনজিপ_ই হবে [4, 5, 6]

জিপ () একাধিক চলনযোগ্য আরোগুলি গ্রহণ করে এবং একটি জেনারেটর ফিরিয়ে দেয়।

zip(*zip(x,y)) -> zip((1, 4), (2, 5), (3, 6))

7

পাইথন 3.5, আপনি এছাড়া এই সিনট্যাক্স ব্যবহার করতে পারেন list, dict, tuple, এবং setপ্রদর্শন (এছাড়াও লিটারেল কখনও কখনও বলা হয়)। পিইপি 488 দেখুন : অতিরিক্ত আনপ্যাকিং সাধারণীকরণ

>>> (0, *range(1, 4), 5, *range(6, 8))
(0, 1, 2, 3, 5, 6, 7)
>>> [0, *range(1, 4), 5, *range(6, 8)]
[0, 1, 2, 3, 5, 6, 7]
>>> {0, *range(1, 4), 5, *range(6, 8)}
{0, 1, 2, 3, 5, 6, 7}
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> e = {'six': 6, 'seven': 7}
>>> {'zero': 0, **d, 'five': 5, **e}
{'five': 5, 'seven': 7, 'two': 2, 'one': 1, 'three': 3, 'six': 6, 'zero': 0}

এটি একাধিক পুনরাবৃত্তিকে একক ফাংশন কলে প্যাক করতে দেয়।

>>> range(*[1, 10], *[2])
range(1, 10, 2)

(পিইপি লিঙ্কের জন্য মিলিলেসনকে ধন্যবাদ))


1
আমি নিশ্চিত নই যে এটি "এটি করার একমাত্র উপায় আছে" এর লঙ্ঘন। একাধিক পুনরাবৃত্তিযোগ্য তালিকা থেকে তালিকাগুলি / প্রাথমিককরণের আর কোনও উপায় নেই - আপনার বর্তমানে এগুলিকে একটি একক পুনরাবৃত্তিতে চেইন করা দরকার যা সর্বদা সুবিধাজনক নয়। আপনি পিইপি -0448 এ যুক্তিযুক্ত সম্পর্কে পড়তে পারেন । এছাড়াও, এটি একটি অজগর 3.x বৈশিষ্ট্য নয়, এটি একটি অজগর 3.5 + বৈশিষ্ট্য :-)।
মিগিলসন

@ মিগিলসন, এটি আগে কেন উল্লেখ করা হয়নি তা ব্যাখ্যা করবে।
leewz

6

ফাংশন কলগুলির পাশাপাশি, * আরগস এবং ** কোয়ার্গাগুলি শ্রেণিবদ্ধ শ্রেণিতে কার্যকর এবং __init__পাইথনে পদ্ধতি লেখার বিষয়টি এড়ানোও যায় । জ্যাঙ্গো কোডের মতো ফ্রেমওয়ার্কগুলিতে অনুরূপ ব্যবহার দেখা যায়।

উদাহরণ স্বরূপ,

def __init__(self, *args, **kwargs):
    for attribute_name, value in zip(self._expected_attributes, args):
        setattr(self, attribute_name, value)
        if kwargs.has_key(attribute_name):
            kwargs.pop(attribute_name)

    for attribute_name in kwargs.viewkeys():
        setattr(self, attribute_name, kwargs[attribute_name])

একটি সাবক্লাস তারপর হতে পারে

class RetailItem(Item):
    _expected_attributes = Item._expected_attributes + ['name', 'price', 'category', 'country_of_origin']

class FoodItem(RetailItem):
    _expected_attributes = RetailItem._expected_attributes +  ['expiry_date']

সাবক্লাসটি তখন ততক্ষণে ইনস্ট্যান্ট করা হবে

food_item = FoodItem(name = 'Jam', 
                     price = 12.0, 
                     category = 'Foods', 
                     country_of_origin = 'US', 
                     expiry_date = datetime.datetime.now())

এছাড়াও, একটি নতুন অ্যাট্রিবিউটের সাথে একটি সাবক্লাস যা কেবলমাত্র সেই সাবক্লাস উদাহরণটিই বোধ করে __init__সেগুলি বৈশিষ্ট্য সেটিংটি অফলোড করতে বেস শ্রেণিকে কল করতে পারে। এটি * আরগস এবং ** কাওয়ার্গের মাধ্যমে করা হয়। kwargs প্রধানত ব্যবহৃত হয় যাতে কোডটি নামযুক্ত আর্গুমেন্টগুলি ব্যবহার করে পঠনযোগ্য। উদাহরণ স্বরূপ,

class ElectronicAccessories(RetailItem):
    _expected_attributes = RetailItem._expected_attributes +  ['specifications']
    # Depend on args and kwargs to populate the data as needed.
    def __init__(self, specifications = None, *args, **kwargs):
        self.specifications = specifications  # Rest of attributes will make sense to parent class.
        super(ElectronicAccessories, self).__init__(*args, **kwargs)

যা তাত্ক্ষণিকভাবে করা যেতে পারে

usb_key = ElectronicAccessories(name = 'Sandisk', 
                                price = '$6.00', 
                                category = 'Electronics',
                                country_of_origin = 'CN',
                                specifications = '4GB USB 2.0/USB 3.0')

সম্পূর্ণ কোড এখানে


1
১. মূলত দীক্ষা একটি পদ্ধতি, সুতরাং (এই প্রসঙ্গে) এটি আসলে আলাদা নয়। ।। মন্তব্য, না "" ", যা শুধু চিহ্ন আক্ষরিক স্ট্রিং 3. বিশেষত মাল্টি লেভেল উত্তরাধিকার সঙ্গে আপনার উদাহরণস্বরূপ সুপার ব্যবহার পছন্দের পথ হওয়া উচিত, 2. ব্যবহারের #
0xc0de

4

নিকডের উত্তরে বিল্ডিং ...

def foo(param1, *param2):
    print(param1)
    print(param2)


def bar(param1, **param2):
    print(param1)
    print(param2)


def three_params(param1, *param2, **param3):
    print(param1)
    print(param2)
    print(param3)


foo(1, 2, 3, 4, 5)
print("\n")
bar(1, a=2, b=3)
print("\n")
three_params(1, 2, 3, 4, s=5)

আউটপুট:

1
(2, 3, 4, 5)

1
{'a': 2, 'b': 3}

1
(2, 3, 4)
{'s': 5}

মূলত, যে কোন সংখ্যার অবস্থানগত আর্গুমেন্ট * args এবং কোন ব্যবহার করতে পারেন নামে আর্গুমেন্ট (অথবা kwargs ওরফে শব্দ আর্গুমেন্ট) ** kwargs ব্যবহার করতে পারেন।


3

*argsএবং **kwargs: আপনাকে কোনও ফাংশনে পরিবর্তনশীল সংখ্যক আর্গুমেন্ট পাস করার অনুমতি দেয়।

*args: ফাংশনে একটি অ-কীওয়ার্ডযুক্ত ভেরিয়েবল দৈর্ঘ্যের যুক্তি তালিকা পাঠাতে ব্যবহৃত হয়:

def args(normal_arg, *argv):
    print("normal argument:", normal_arg)

    for arg in argv:
        print("Argument in list of arguments from *argv:", arg)

args('animals', 'fish', 'duck', 'bird')

উত্পাদন করবে:

normal argument: animals
Argument in list of arguments from *argv: fish
Argument in list of arguments from *argv: duck
Argument in list of arguments from *argv: bird

**kwargs*

**kwargsআপনাকে কোনও ক্রিয়াকলাপে আর্গুমেন্টের কী-ওয়ার্ড ভেরিয়েবল দৈর্ঘ্য পাস করতে দেয়। আপনি **kwargsযদি কোনও ফাংশনে নামযুক্ত যুক্তিগুলি পরিচালনা করতে চান তবে আপনার ব্যবহার করা উচিত ।

def who(**kwargs):
    if kwargs is not None:
        for key, value in kwargs.items():
            print("Your %s is %s." % (key, value))

who(name="Nikola", last_name="Tesla", birthday="7.10.1856", birthplace="Croatia")  

উত্পাদন করবে:

Your name is Nikola.
Your last_name is Tesla.
Your birthday is 7.10.1856.
Your birthplace is Croatia.

2

এই উদাহরণটিতে সাহায্য করবে আপনার মনে *args, **kwargsএবং এমনকি superএকযোগে পাইথন এবং উত্তরাধিকার।

class base(object):
    def __init__(self, base_param):
        self.base_param = base_param


class child1(base): # inherited from base class
    def __init__(self, child_param, *args) # *args for non-keyword args
        self.child_param = child_param
        super(child1, self).__init__(*args) # call __init__ of the base class and initialize it with a NON-KEYWORD arg

class child2(base):
    def __init__(self, child_param, **kwargs):
        self.child_param = child_param
        super(child2, self).__init__(**kwargs) # call __init__ of the base class and initialize it with a KEYWORD arg

c1 = child1(1,0)
c2 = child2(1,base_param=0)
print c1.base_param # 0
print c1.child_param # 1
print c2.base_param # 0
print c2.child_param # 1

1

একটি ফাংশন উভয় ব্যবহারের একটি ভাল উদাহরণ:

>>> def foo(*arg,**kwargs):
...     print arg
...     print kwargs
>>>
>>> a = (1, 2, 3)
>>> b = {'aa': 11, 'bb': 22}
>>>
>>>
>>> foo(*a,**b)
(1, 2, 3)
{'aa': 11, 'bb': 22}
>>>
>>>
>>> foo(a,**b) 
((1, 2, 3),)
{'aa': 11, 'bb': 22}
>>>
>>>
>>> foo(a,b) 
((1, 2, 3), {'aa': 11, 'bb': 22})
{}
>>>
>>>
>>> foo(a,*b)
((1, 2, 3), 'aa', 'bb')
{}

1

টি এল; ডিআর

পাইথন প্রোগ্রামিংয়ের জন্য *এবং **এর জন্য 6 টি পৃথক ব্যবহারের কেস রয়েছে :

  1. ব্যবহার অবস্থানগত আর্গুমেন্ট যে কোন সংখ্যার স্বীকার করতে *args: def foo(*args): pass এখানে fooঅবস্থানগত আর্গুমেন্ট, অর্থাত্ যে কোন সংখ্যার গ্রহণ, নিম্নলিখিত কল বৈধ foo(1),foo(1, 'bar')
  2. ব্যবহার শব্দ আর্গুমেন্ট যে কোন সংখ্যার স্বীকার করতে **kwargs: def foo(**kwargs): pass এখানে 'foo বিন্যাস' শব্দ আর্গুমেন্ট, অর্থাত্ যে কোন সংখ্যার গ্রহণ, নিম্নলিখিত কল বৈধ foo(name='Tom'),foo(name='Tom', age=33)
  3. ব্যবহার করে*args, **kwargs যে কোনও স্থিতিক এবং কীওয়ার্ড আর্গুমেন্ট গ্রহণ করতে :def foo(*args, **kwargs): pass এখানে fooযে কোনও স্থিতিক এবং কীওয়ার্ড আর্গুমেন্ট গ্রহণ করা হয়, যেমন, নিম্নলিখিত কলগুলি বৈধ foo(1,name='Tom'),foo(1, 'bar', name='Tom', age=33)
  4. ব্যবহার করে শুধুমাত্র আর্গুমেন্ট শব্দ জোরদার করা *: def foo(pos1, pos2, *, kwarg1): pass এখানে *এর মানে হল যে foo বিন্যাস শুধুমাত্র pos2 পর শব্দ আর্গুমেন্ট গ্রহণ, অত: পর foo(1, 2, 3)TypeError উত্থাপন কিন্তু foo(1, 2, kwarg1=3)ঠিক আছে।
  5. *_(আরও মনে রাখবেন যে এটি কেবল একটি সম্মেলন) ব্যবহার করে আরও স্থিতিক যুক্তিতে আরও আগ্রহ প্রকাশ করার জন্য নয় : এর def foo(bar, baz, *_): pass অর্থ (কনভেনশন দ্বারা) এর কার্যকরী ক্ষেত্রে fooকেবল ব্যবহার barএবং bazযুক্তি দেয় এবং অন্যকে উপেক্ষা করবে।
  6. আরও কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করে আরও আগ্রহ প্রকাশ না করার জন্য \**_(দ্রষ্টব্য: এটি কেবল একটি সম্মেলন): এর def foo(bar, baz, **_): pass অর্থ (কনভেনশন দ্বারা) এর কার্যকরী ক্ষেত্রে fooকেবল ব্যবহার barএবং bazযুক্তি দেয় এবং অন্যদের উপেক্ষা করবে।

বোনাস: অজগর থেকে 3.8 এর পরে, /অবস্থানগত পরামিতিগুলি প্রয়োগ করতে কেউ ফাংশন সংজ্ঞা ব্যবহার করতে পারে । নিম্নলিখিত উদাহরণে, a এবং b পরামিতিগুলি কেবলমাত্র অবস্থানগত , যখন সি বা ডি অবস্থানীয় বা মূলশব্দ হতে পারে এবং e বা f কীওয়ার্ড হতে হবে:

def f(a, b, /, c, d, *, e, f):
    pass

0

টি এল; ডিআর

এটি ক্রিয়াকলাপের দেহের ভিতরে listএবং dictযথাক্রমে ক্রিয়ায় আর্গুমেন্টগুলি প্যাক করে । আপনি যখন কোনও ফাংশনের স্বাক্ষরটি এভাবে সংজ্ঞা দেন:

def func(*args, **kwds):
    # do stuff

এটিকে যে কোনও সংখ্যক আর্গুমেন্ট এবং কীওয়ার্ড আর্গুমেন্টের সাথে ডাকা যেতে পারে। অ-কীওয়ার্ড আর্গুমেন্টগুলি argsফাংশন বডিটির ভিতরে ডাকা একটি তালিকায় প্যাক হয়ে যায় এবং কীওয়ার্ড আর্গুমেন্টগুলি kwdsফাংশন বডির অভ্যন্তরে ডিক্টের মধ্যে প্যাক হয়ে যায় ।

func("this", "is a list of", "non-keyowrd", "arguments", keyword="ligma", options=[1,2,3])

এখন ফাংশন বডিটির ভিতরে, যখন ফাংশনটি বলা হয়, সেখানে দুটি স্থানীয় ভেরিয়েবল রয়েছে, argsযা একটি তালিকা রয়েছে যার মান রয়েছে ["this", "is a list of", "non-keyword", "arguments"]এবং kwdsযার dictমান রয়েছে{"keyword" : "ligma", "options" : [1,2,3]}


এটি বিপরীতে অর্থাৎ কলার দিক থেকেও কাজ করে। উদাহরণস্বরূপ আপনার যদি কোনও ফাংশন হিসাবে সংজ্ঞায়িত থাকে:

def f(a, b, c, d=1, e=10):
    # do stuff

আপনি কলিং স্কোপটিতে পুনরাবৃত্তিযোগ্য বা ম্যাপিংগুলি প্যাক করে এটিকে কল করতে পারেন:

iterable = [1, 20, 500]
mapping = {"d" : 100, "e": 3}
f(*iterable, **mapping)
# That call is equivalent to
f(1, 20, 500, d=100, e=3)

0

প্রসঙ্গ

  • অজগর 3.x
  • সঙ্গে আনপ্যাকিং **
  • স্ট্রিং ফর্ম্যাটিং সহ ব্যবহার করুন

স্ট্রিং ফর্ম্যাটিং সহ ব্যবহার করুন

এই থ্রেডের উত্তরগুলি ছাড়াও, এখানে আরও একটি বিবরণ দেওয়া হয়েছে যা অন্য কোথাও উল্লেখ করা হয়নি। ব্র্যাড সলোমন এর উত্তরে এটি প্রসারিত হয়

**পাইথন ব্যবহার করার সাথে আনপ্যাক করাও কার্যকর str.format

এটি পাইথন f-strings এফ-স্ট্রিংয়ের সাথে আপনি যা করতে পারেন তার সাথে কিছুটা একই তবে ভেরিয়েবলগুলি ধরে রাখার জন্য ডিক ঘোষণার যুক্ত ওভারহেডের সাথেও (এফ-স্ট্রিংয়ের জন্য ডিকের প্রয়োজন হয় না) similar

দ্রুত উদাহরণ

  ## init vars
  ddvars = dict()
  ddcalc = dict()
  pass
  ddvars['fname']     = 'Huomer'
  ddvars['lname']     = 'Huimpson'
  ddvars['motto']     = 'I love donuts!'
  ddvars['age']       = 33
  pass
  ddcalc['ydiff']     = 5
  ddcalc['ycalc']     = ddvars['age'] + ddcalc['ydiff']
  pass
  vdemo = []

  ## ********************
  ## single unpack supported in py 2.7
  vdemo.append('''
  Hello {fname} {lname}!

  Today you are {age} years old!

  We love your motto "{motto}" and we agree with you!
  '''.format(**ddvars)) 
  pass

  ## ********************
  ## multiple unpack supported in py 3.x
  vdemo.append('''
  Hello {fname} {lname}!

  In {ydiff} years you will be {ycalc} years old!
  '''.format(**ddvars,**ddcalc)) 
  pass

  ## ********************
  print(vdemo[-1])

-2
  • def foo(param1, *param2):একটি পদ্ধতি হ'ল মান নির্বিচারে মানগুলি গ্রহণ করতে পারে *param2,
  • def bar(param1, **param2): একটি পদ্ধতি হল কীগুলির সাথে মানের নির্বিচার সংখ্যাকে গ্রহণ করতে পারে *param2
  • param1 একটি সাধারণ পরামিতি।

উদাহরণস্বরূপ, জাভাতে ভারার্গগুলি বাস্তবায়নের জন্য সিনট্যাক্সটি নিম্নরূপ:

accessModifier methodName(datatype arg) {
    // method body
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.