*args (արգումենտներ) և **kwargs (բանալի արգումենտներ)
*args
Python-ում հնարավոր է ֆունկցիաներին փոխանցել կամայական քանակությամբ արգումենտներ *args-ի և **kwargs-ի միջոցով: Դուք կարող եք *args կամ **kwargs պարամետրերին տալ ցանկացած անուն, բայց պայմանականորեն դրանք կոչվում են args (արգումենտներ) և kwargs (keyword արգումենտներ):
*args-ն օգտագործում են այն ժամանակ, երբ հարկավոր է առանց keyword (բանալի) բառերի ֆունկցիային փոխանցել կամայական թվով արգումենտներ։ Ահա մեկ օրինակ.
def add(*args):
res = 0 # Initialize the final result to 0
for num in args: # Loop through the list of passed arguments
res += num # add each number to the sum
return res
print(add(3, 5, 7, 9)) # 24
Այս ծրագրում args-ը tuple է այն արժեքներով, որոնք մենք փոխանցում ենք ֆունկցիային: Այսպիսով, վերը նշված օրինակում, args-երը հավասար են (3, 5, 7, 9): Այս կերպ մենք կարող ենք ցանկացած քանակությամբ արգումենտ փոխանցել մեր ֆունկցիային:
**kwargs
**kwargs-ը թույլ է տալիս փոխանցել կամայական թվով keyword արգումենտներ: Ահա մեկ օրինակ.
def introduce(**kwargs):
for key, value in kwargs.items(): # Loop through all the key-value pairs
print(f'{key}: {value}') # prints each key-value pair
introduce(Name='Alice', Age=25, Country='USA')
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
Վերոնշյալ ծրագրում kwargs-ը բառարան է, որն ունի բանալի-արժեք զույգեր, որոնք մենք փոխանցում ենք ֆունկցիային: Այսպիսով, վերը նշված օրինակում, kwargs-ը հավասար է {'Name': 'Alice', 'Age': 25, 'Country': 'USA'}:
Կարող եք նաև համատեղել *args-ը և **kwargs-ը ֆունկցիայի կանչում: *args-ը պետք է լինի **kwargs-ից առաջ։
def combined_example(*args, **kwargs):
print(args) # prints the tuple of arguments
print(kwargs) # prints the dictionary of keyword arguments
combined_example(1, 2, 3, Name='Alice', Age=25)
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
Այս ֆունկցիայում args-ը tuple է (1, 2, 3) արժեքներով, իսկ kwargs-ը բառարան է՝ {'Name': 'Alice', 'Age': 25} արժեքներով:
Ցանկացած թվով արգումենտների և keyword արգումենտների հետ աշխատելու այս ճկունությունը կարող է իսկապես օգտակար լինել, եթե ցանկանում եք, որ ձեր ֆունկցիաները ավելի դինամիկ լինեն:
*args-ի և **kwargs-ի համադրումը ստանդարտ ֆունկցիայի արգումենտների հետ
*args-ը և **kwargs-ը կարող են օգտագործվել ֆունկցիայի ստանդարտ արգումենտների հետ համատեղ: Այս դեպքերում դուք պետք է հիշեք մի քանի կանոն.
Ֆունկցիայի սահմանման մեջ արգումենտների ճիշտ հաջորդականությունը պետք է լինի՝ ստանդարտ արգումենտներ, հետո *args, ապա **kwargs:
Ստանդարտ արգումենտները (նաև հայտնի են որպես դիրքային արգումենտներ) միշտ պետք է փոխանցվեն *args-ից և **kwargs-ից առաջ:
def function_example(a, b, *args, **kwargs):
print(a) # print the first standard argument
print(b) # print the second standard argument
print(args) # print additional non-keyworded arguments
print(kwargs) # print keyworded arguments
function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Այստեղ 1-ը և 2-ը ստանդարտ արգումենտներ են, որոնք ֆունկցիայի սահմանման մեջ համապատասխանում են a-ին և b-ին: (3, 4, 5) tuple-ը ներկայացնում է լրացուցիչ արգումենտներ, որոնք խմբավորված են args-ի մեջ: Մնացած keyword արգումենտները խմբավորված են kwargs-ի մեջ՝ որպես բառարան:
*args-ը և **kwargs-ը ստանդարտ արգումենտների հետ կիրառելիս մի՛ մոռացեք default արգումենտների մասին ֆունկցիան կանչելու ժամանակ, քանի որ դա կարող է հանգեցնել TypeError-ի: Օրինակ՝ եթե կանչեք function_example(1, Name='Alice', Age=25) ֆունկցիան առանց b արգումենտին արժեք տրամադրելու, ապա սա կհանգեցնի սխալի: