පරාමිතීන් සඳහා ** (ද්විත්ව තරු / තරු) සහ * (තරු / තරු) කරන්නේ කුමක්ද?


2365

පහත දැක්වෙන ක්‍රම නිර්වචන වලදී, *සහ **කුමක් param2කරන්නේද?

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



හිස් තරු ලකුණු සඳහා stackoverflow.com/questions/14301967/… ද බලන්න
naught101

26
මෙම ප්‍රශ්නය ඉතා ජනප්‍රිය අනුපිටපත් ඉලක්කයකි, නමුත් අවාසනාවකට එය බොහෝ විට වැරදි ලෙස භාවිතා කරයි. මෙම ප්‍රශ්නය වරග්ස් ( def func(*args)) සමඟ කාර්යයන් නිර්වචනය කිරීම ගැන අසන බව මතක තබා ගන්න . ක්‍රියාකාරී ඇමතුම් වල තේරුම කුමක්දැයි අසන ප්‍රශ්නයක් සඳහා ( func(*[1,2])) මෙහි බලන්න . තර්ක ලැයිස්තු ඉවත් කරන්නේ කෙසේදැයි අසන ප්‍රශ්නයක් සඳහා මෙහි බලන්න . *වචනයේ පරිසමාප්ත අර්ථයෙන්ම කුමක්දැයි අසන ප්‍රශ්නයක් සඳහා ( [*[1, 2]]) මෙහි බලන්න .
අරන්-ෆේ

ක්‍රියාකාරී අර්ථ දැක්වීම සහ ක්‍රියාකාරී ඇමතුමෙහි එහි භාවිතය පිළිබඳව ඔබට මෙහි ඉගෙන ගත හැකිය: pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
අක්ෂේ

Answers:


2247

මෙම *argsසහ **kwargsකොටසේ විස්තර කර ඇති පරිදි කටයුතු කිරීමට තර්ක අත්තනෝමතික අංකය ඉඩ පොදු බස් වහරක් වන කාර්යයන් නිර්වචනය පිළිබඳ වැඩි සඳහා python ලියකියවිලි වල.

මෙම *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 නව අර්ථකථන එක් කරයි ( PEP 3102 බලන්න ):

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

එවැනි ශ්‍රිතයක් පිළිගන්නේ ස්ථානීය තර්ක 3 ක් පමණක් වන අතර, පසුව සියල්ල *සම්මත කළ හැක්කේ මූල පද තර්ක ලෙස පමණි.


10
[6] හි ප්‍රතිදානය ප්‍රතිලෝම අනුපිළිවෙලින් පවතී. නම එක් වයස 27
thanos.a

55
key thanos.a පයිතන් ඩික්ට්ස්, අර්ථකථන වාක්‍ය සම්මත කිරීම සඳහා අර්ථාන්විතව භාවිතා කරයි, අත්තනෝමතික ලෙස ඇණවුම් කර ඇත. කෙසේ වෙතත්, පයිතන් 3.6 හි, යතුරු පද තර්ක ඇතුළත් කිරීමේ අනුපිළිවෙල මතක තබා ගැනීමට සහතික වේ. " **kwargsදැන් පවතින මූලද්‍රව්‍ය අනුපිළිවෙල ශ්‍රිතයට යතුරු පද ඉදිරිපත් කළ අනුපිළිවෙලට අනුරූප වේ." - docs.python.org/3/whatsnew/3.6.html ඇත්ත වශයෙන්ම, CPython 3.6 හි ඇති සියලුම විධානයන් ඇතුළත් කිරීමේ අනුපිළිවෙල ක්‍රියාත්මක කිරීමේ විස්තරයක් ලෙස මතක තබා ගනු ඇත, මෙය පයිතන් 3.7 හි සම්මත බවට පත්වේ.
ආරොන් හෝල්

14
ඉතා නිවැරදි, පිරිසිදු හා තේරුම් ගැනීමට පහසුය. මම ඔබට එය මම සී +1 යොමු කළේ ළඟින් සිට වෙනස හැකි නිසා බව, මෙහි "විහිදු ක්රියාකරු" බව, සඳහන් ඒක අගය කරනවා
bballdave025

PEP 3102 සමඟ අවසාන ශ්‍රිතය පරීක්ෂා කරන්නේ කෙසේද? මම එය func (1,2,3, name = "me", age = 10) සමඟ අමතන අතර එය ව්‍යතිරේකය විසි කරයි:got an unexpected keyword argument 'name'
Kok How Teh

OckKokHowTeh ඔබ ක්වාර්ග්ස් නම් කර ඇති පරිදි ඒවා සම්මත කළ යුතුය: func (1, 2, 3, kwarg1 = 'me', kwarg2 = 10)
ජෝන් ආරොන්

623

ඔබට භාවිතා කළ හැකි බව *සහ **කාර්යයන් ඇමතීමේදීද සඳහන් කිරීම වටී . මෙය කෙටිමඟක් වන අතර එය ලැයිස්තුවක් / ටුපල් හෝ ශබ්දකෝෂයක් භාවිතා කරමින් සෘජුවම ශ්‍රිතයකට බහු තර්ක ඉදිරිපත් කිරීමට ඉඩ දෙයි. උදාහරණයක් ලෙස, ඔබට පහත ශ්‍රිතය තිබේ නම්:

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). Foo () param2 හි ශරීරයේ 2-5 අඩංගු අනුක්‍රමයකි.

ද්විත්ව ** යන්නෙන් අදහස් කරන්නේ අමතර නම් කළ පරාමිතීන් ගණනක් තිබිය හැකි බවයි. bar()වැනි ආයාචනා කළ හැකිය bar(1, a=2, b=3). බාර් () param2 හි body 'a': 2, 'b': 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}

5
foobar(param1, *param2, **param3)මෙම පිළිතුරේ සම්පූර්ණත්වය සඳහා අමතර උදාහරණයක් අවශ්‍ය වේ.
අනිකෙට් තාකූර්

1
N අනිකෙට් තාකූර් මෙහි ඉතිරි කොටස මෙහි එක් කළේය .
රාජ්

148

**(ද්විත්ව තාරකාව) සහ *(තාරකාව) පරාමිතීන් සඳහා කරන්නේ කුමක්ද?

ඒවා පිළිගැනීමට කාර්යයන් නිර්වචනය කිරීමට සහ පරිශීලකයින්ට ඕනෑම තර්ක, ස්ථානීය ( *) සහ යතුරු පද ( **) සම්මත කිරීමට ඉඩ දෙයි .

කාර්යයන් නිර්වචනය කිරීම

*argsඕනෑම විකල්ප ස්ථානීය තර්ක (පරාමිතීන්) සඳහා ඉඩ ලබා දේ args.

**kwargsනම් කරන ලද විධානයක් තුළ ඇති ඕනෑම විකල්ප මූල පද තර්ක (පරාමිතීන්) සඳහා ඉඩ ලබා දේ kwargs.

ඔබට හැකි (හා විය යුතු) ඕනෑම සුදුසු නමක් තෝරා, නමුත් තර්ක විශේෂිත නොවන semantics විය කිරීම සඳහා බලාපොරොත්තුව වන්නේ නම්, argsහා kwargsසම්මත නම් වේ.

පුළුල් කිරීම, ඕනෑම තර්ක ගණනාවක් සම්මත කිරීම

ඔබ ද භාවිතා කළ හැකිය *argsසහ **kwargsපිළිවෙළින්, ලැයිස්තු (හෝ ඕනෑම iterable) සහ dicts (හෝ ඕනෑම සිතියම්) සිට පරාමිතීන් සම්මත කිරීමට.

පරාමිතීන් ලබා ගැනීමේ ශ්‍රිතය ඒවා පුළුල් වන බව දැන සිටිය යුතු නොවේ.

උදාහරණයක් ලෙස, පයිතන් 2 හි xrange පැහැදිලිවම අපේක්ෂා නොකරයි *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මූල පද තර්කයක් ලෙස ලබා දිය යුතුය - ස්ථානීය නොවේ:

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 ක භාවිතා කළ හැකි බව කරුණාවෙන් සලකන්න:

අ) ශ්‍රිත ඇමතුම

b) ශ්‍රිත අර්ථ දැක්වීම

ක්‍රියාකාරී ඇමතුමෙහි '*' ක්‍රියාකරු සහ '**' ක්‍රියාකරු භාවිතා කිරීම .

අපි කෙලින්ම උදාහරණයකට ගොස් එය සාකච්ඡා කරමු.

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

ශ්‍රිත අර්ථ දැක්වීමේදී '**' ක්‍රියාකරු විසින් ලැබුණු තර්ක ශබ්දකෝෂයකට ඇසුරුම් කරයි.

එබැවින් මතක තබා ගන්න:

දී උත්සවය කතා ද '*' unpacks කාර්යය නිර්වචනය විසින් ලැබිය යුතු ස්ථානීය හෝ මූල පදය තර්ක බවට දත්ත tuple හෝ ලැයිස්තුව ව්යුහය.

දී කාර්යය ඇමතුමක් මෙම '**' unpacks කාර්යය නිර්වචනය විසින් ලැබිය යුතු ස්ථානීය හෝ මූල පදය තර්ක බවට දත්ත ශබ්ද කෝෂය ව්යුහය.

දී කාර්යය අර්ථ දැක්වීම ද '*' ඇසුරුම් ස්ථානීය තර්ක ඉතා tuple බවට.

දී කාර්යය අර්ථ දැක්වීම ද '**' ඇසුරුම් ඉඟි පද තර්ක ශබ්දකෝෂ බවට.


සැබවින්ම පිරිසිදු, පියවරෙන් පියවර සහ පැහැදිලි කිරීම අනුගමනය කිරීම පහසුය!
ඇලෙක්සැන්ඩර්

ස්තූතියි ඉහළට එනවා. [තවද මගේ වැඩිදුර සටහන් සඳහා, මම ට්විටර් හි rmrtechmaker හි සිටිමි]
කරන් අහුජා

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

*සහ **ශ්‍රිත තර්ක ලැයිස්තුවේ විශේෂ භාවිතයක් ඇත. * තර්කය ලැයිස්තුවක් **බවත් තර්කය ශබ්ද කෝෂයක් බවත් අඟවයි. මෙය ශ්‍රිතයන්ට අත්තනෝමතික තර්ක සංඛ්‍යාවක් ගැනීමට ඉඩ දෙයි


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. විකල්ප නොවන තර්ක පැවරීම පළමුව සිදු වේ.
  3. ඔබට විකල්ප නොවන තර්කයක් දෙවරක් භාවිතා කළ නොහැක.
  4. අදාළ නම් , සෑම විටම **පසුව පැමිණිය යුතුය *.

14

පයිතන් ප්‍රලේඛනයෙන්:

විධිමත් පරාමිති තව් වලට වඩා ස්ථානීය තර්ක තිබේ නම්, “* හැඳුනුම්පත” යන වාක්‍ය ඛණ්ඩය භාවිතා කරන විධිමත් පරාමිතියක් නොමැති නම්, TypeError ව්‍යතිරේකයක් මතු වේ; මෙම අවස්ථාවෙහිදී, එම විධිමත් පරාමිතියට අතිරික්ත ස්ථානීය තර්ක අඩංගු ටුපල් එකක් ලැබේ (හෝ අතිරික්ත ස්ථානීය තර්ක නොමැති නම් හිස් ගෙඩියක්).

කිසියම් මූල පද තර්කයක් විධිමත් පරාමිති නාමයකට අනුරූප නොවන්නේ නම්, “** හැඳුනුම්පත” යන වාක්‍ය ඛණ්ඩය භාවිතා කරන විධිමත් පරාමිතියක් නොමැති නම්, TypeError ව්‍යතිරේකයක් මතු වේ; මෙම අවස්ථාවෙහිදී, එම විධිමත් පරාමිතියට අතිරික්ත මූල පද තර්ක අඩංගු ශබ්දකෝෂයක් ලැබේ (යතුරු පද ලෙස යතුරු සහ තර්ක අගයන් අනුරූප අගයන් ලෙස භාවිතා කිරීම), හෝ අතිරික්ත මූල පද තර්ක නොමැති නම් (නව) හිස් ශබ්දකෝෂයක්.


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

අනෙක් අය සඳහන් නොකළ උදාහරණයක් දීමට මට අවශ්‍යය

* ට උත්පාදක යන්ත්රයක් ඉවත් කළ හැකිය

Python3 ලේඛනයෙන් උදාහරණයක්

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

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

unzip_x [1, 2, 3], unzip_y වනු ඇත [4, 5, 6]

සිප් () ට අයර්ටබල් ආර්ග් කිහිපයක් ලැබෙන අතර උත්පාදක යන්ත්‍රයක් ආපසු එවන්න.

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

7

Python 3.5 දී, ඔබ ද මේ වාග් රීතිය භාවිතා කළ හැකි list, dict, tuple, සහ setසංදර්ශන (ඇතැම් විට literals හැඳින්වේ). PEP 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)

(PEP සබැඳිය සඳහා mgilson ට ස්තූතියි.)


1
මෙය "එය කිරීමට ඇත්තේ එක් මාර්ගයක් පමණි" යන්න උල්ලං is නය කිරීමක් බව මට විශ්වාස නැත. බහුවිධ පුනරාවර්තන වලින් ලැයිස්තුවක් / ටුපල් එකක් ආරම්භ කිරීමට වෙනත් ක්‍රමයක් නොමැත - ඔබට දැනට ඒවා සෑම විටම පහසු නොවන තනි පුනරාවර්තනයකට සම්බන්ධ කළ යුතුය. තාර්කිකත්වය ගැන ඔබට PEP-0448 හි කියවිය හැකිය . එසේම, මෙය python3.x අංගයක් නොවේ, එය python3.5 + විශේෂාංගයකි :-).
mgilson

gmgilson, එය කලින් සඳහන් නොකිරීමට හේතුව පැහැදිලි කරයි.
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__සැකසුම අක්‍රීය කිරීම සඳහා මූලික පන්තියට ඇමතිය හැකිය . මෙය සිදු කරනු ලබන්නේ * args සහ ** kwargs හරහා ය. 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
1. මූලික වශයෙන් init යනු ක්‍රමයකි, එබැවින් (මෙම සන්දර්භය තුළ) එය සැබවින්ම වෙනස් නොවේ. 2. අදහස් සඳහා # භාවිතා කරන්න, වචනාර්ථයෙන් නූල් සලකුණු කරන "" "නොව 3. සුපිරි භාවිතා කිරීම වඩාත් සුදුසු ක්‍රමය විය යුතුය, විශේෂයෙන් ඔබේ උදාහරණය සඳහා බහු මට්ටමේ උරුමයක් ඇත.
0xc0de

5

නික්ඩ්ගේ පිළිතුර මත ගොඩනැගීම ...

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 aka keyword තර්ක) ** 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හා එකවර Python දී උරුම.

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

2

ටීඑල්; ඩී.ආර්

පයිතන් ක්‍රමලේඛනය සඳහා *සහ භාවිතා කරන විවිධ භාවිත අවස්ථා 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 පරාමිතීන් ස්ථානීය-පමණක් වන අතර, c හෝ d ස්ථානීය හෝ මූල පද විය හැකි අතර, ඊ හෝ එෆ් මූල පද විය යුතුය:

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

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')
{}

0

ටීඑල්; ඩී.ආර්

එය ශ්‍රිතයට listසහ dictපිළිවෙලින් ශ්‍රිතයට ඇතුලත් කරන ලද තර්ක ඇසුරුම් කරයි. ඔබ මේ ආකාරයේ ශ්‍රිත අත්සනක් නිර්වචනය කරන විට:

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

එය ඕනෑම තර්ක සහ මූල පද තර්ක සමඟ කැඳවිය හැකිය. මූල පදය නොවන තර්ක argsශ්‍රිත ශරීරය තුළ ඇති ලැයිස්තුවකට ඇසුරුම් වන අතර මූල පද තර්ක kwdsශ්‍රිත ශරීරය තුළ ඇති ආ ict ාවකට ඇසුරුම් වේ.

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

සන්දර්භය

  • python 3.x
  • සමඟ ඉවත් කිරීම **
  • නූල් හැඩතල ගැන්වීම සමඟ භාවිතා කරන්න

නූල් හැඩතල ගැන්වීම සමඟ භාවිතා කරන්න

මෙම ත්‍රෙඩ් එකේ ඇති පිළිතුරු වලට අමතරව, වෙනත් තැනක සඳහන් නොකළ තවත් විස්තරයක් මෙහි දැක්වේ. බ්‍රැඩ් සොලමන්ගේ පිළිතුර මත මෙය පුළුල් වේ

**පයිතන් භාවිතා කරන විට ඇසුරුම් කිරීමද ප්‍රයෝජනවත් වේ str.format.

මෙය ඔබට පයිතන් f-strings එෆ්-ස්ට්‍රිං සමඟ කළ හැකි දේට තරමක් සමාන නමුත් විචල්‍යයන් රඳවා තබා ගැනීම සඳහා ආ ict ාවක් ප්‍රකාශයට පත්කිරීමේ අමතර පිරිවැය සමඟ (එෆ්-ස්ට්‍රිංට ආ ict ාවක් අවශ්‍ය නොවේ).

ඉක්මන් උදාහරණය

  ## 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])

0

තර්ක 3 ක් ඇති ශ්‍රිතයක් ලබා දී ඇත

sum = lambda x, y, z: x + y + z
sum(1,2,3) # sum 3 items

sum([1,2,3]) # error, needs 3 items, not 1 list

x = [1,2,3][0]
y = [1,2,3][1]
z = [1,2,3][2]
sum(x,y,z) # ok

sum(*[1,2,3]) # ok, 1 list becomes 3 items

මෙම සෙල්ලම් බඩුවක් ත්රිකෝණයක බෑගයක්, රවුමක් සහ සෘජුකෝණාස්රාකාර අයිතමයක් සමඟ සිතන්න. එම බෑගය කෙලින්ම නොගැලපේ. එම අයිතම 3 රැගෙන යාම සඳහා ඔබ බෑගය ඉවත් කළ යුතු අතර දැන් ඒවා ගැලපේ. පයිතන් * ක්‍රියාකරු මෙම ඉවත් කිරීමේ ක්‍රියාවලිය සිදු කරයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


-2
  • def foo(param1, *param2):ක්‍රමයක් සඳහා අත්තනෝමතික අගයන් පිළිගත හැකිය *param2,
  • def bar(param1, **param2): ක්‍රමයක් සඳහා යතුරු සමඟ අත්තනෝමතික අගයන් ගණනක් පිළිගත හැකිය *param2
  • param1 සරල පරාමිතියකි.

උදාහරණයක් ලෙස, ජාවා හි වරග්ස් ක්‍රියාත්මක කිරීම සඳහා වන වාක්‍ය ඛණ්ඩය පහත පරිදි වේ:

accessModifier methodName(datatype arg) {
    // method body
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.