python

[python] *args ๊ณผ **kwargs

Chan Lee 2023. 10. 10. 02:05

*args (arguments)

Python ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ํ•จ์ˆ˜์— ์ธ์ž(arguments)๊ฐ€ ๋ช‡๊ฐœ ์ž…๋ ฅ๋  ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์„ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ฐœ์ธ๋ณ„๋กœ ๊ฐ€์กฑ์˜ ๊ตฌ์„ฑ์› ์ˆ˜๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ž๊ฐ€ ์ด ๋ช‡๊ฐœ ์ž…๋ ฅ๋ ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

์„ธ๊ณ„์˜ ๋ชจ๋“  ๊ฐ€์กฑ์ด 4๋ช…์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์•Œ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

def family(dad, mom, sibling, me):
	print(dad, mom, sibling, me)
   
family("๊น€๋ฒ”์ˆ˜", "์ด์†Œ๋ผ", "๋ฐ•ํšจ์‹ ", "์žฅ๋ฒ”์ค€")		
# output: ๊น€๋ฒ”์ˆ˜ ์ด์†Œ๋ผ ๋ฐ•ํšจ์‹  ์žฅ๋ฒ”์ค€

ํ•˜์ง€๋งŒ ๋‹น์—ฐํžˆ ์„ธ์ƒ์˜ ๋ชจ๋“  ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์€ ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ณ , ์ด๋Ÿด ๊ฒฝ์šฐ *args๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

*args์˜ args๋Š” arguments๋ฅผ ์ค„์ธ ๊ฒƒ์ด๋‹ค.

args์— ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, *args๋กœ ์“ฐ๋“  *name์œผ๋กœ ์“ฐ๋“  *numbers ์ดํ›„์— ํ˜•ํƒœ๋งŒ ๋งž์ถ˜๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

*args์˜ ์ž…๋ ฅ ๊ฐ’์€ tuple์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹จ์ˆœํžˆ print(args)๋ฅผ ํ•˜๋ฉด, ์ž…๋ ฅํ–ˆ๋˜ ๊ฐ’๋“ค์ด tuple์˜ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

def numbers(*nums):
    print(nums)

numbers(1, 2, 3, 4)
# output: (1, 2, 3, 4)

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๊ฐ๊ฐ์˜ ์ž…๋ ฅ ๊ฐ’์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํ•จ์ˆ˜ ๋‚ด์— ๋ฐ˜๋ณต๋ฌธ์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

def add_1(*nums):
    for num in nums:
        print(num + 1, end=" ")

add_1(1, 2, 3, 4)
#output: 2 3 4 5

 

์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์งœ๋ฉด,

def family(*members):
	for member in members:
    	print(member, end=" ")
        
family("mother", "father", "me")
#output: mother father me

family("mother", "me", "brother", "sister")
#output: mother me brother sister

family("grandmother", "grandfather", "father", "uncle", "sister", "brother", "me")
#output: grandmother grandfather father uncle sister brother me

์ด๋ ‡๊ฒŒ ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋ฅผ ๋•Œ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋”ํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋ณด์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งค ์ˆ˜ ์žˆ๋‹ค.

def add(*args):
	result = 0
	for num in args:
    	result += num
	return result

print(add(1, 2, 3))
# output: 6

print(add(300, 100, 30, 3, 500))
# output: 933

 


 

*kwagrs (key word arguments)**

kwargs๋Š” ํ‚ค์›Œ๋“œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. 

*args ์ฒ˜๋Ÿผ kwargs ๋‹จ์–ด ์ž์ฒด์— ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ์—, ์›ํ•˜๋Š” ๊ธ€์ž๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

def calculate(**kwargs):
	print(kwargs)

calculate(add=5, multiply=10, divide=2)
# output: {"add": 5, "multiply": 10, "divide": 2}

 

์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ์™€ ๊ฐ’์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ๊ธˆ์˜ ํ•จ์ˆ˜๋ฅผ ํ™•์žฅํ•ด์„œ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋ฅผ ํ™œ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ ๊ณผ์ •์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค

(์‹ค์ œ๋กœ๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉ ์•ˆํ•˜๊ฒ ์ง€๋งŒ, kwargs๋ฅผ ์ดํ•ดํ•˜๊ธฐ์— ๋„์›€์ด ๋œ๋‹ค)

def calculate(num, **kwargs):
    num += kwargs["add"]
    num *= kwargs["multiply"]
    num /= kwargs["divide"]
    print(num)

calculate(3, add=5, multiply=10, divide=2)
# (3 + 5) * 10 / 2 = 40
# output: 40

 


Class์—์„œ์˜ kwargs

kwargs๋Š” class ์„ ์–ธ์—์„œ๋„ ์ž˜ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.

class Car:

	def __init__(self, **kw):
    	self.model = kw["model"]	
        self.company = kw["company"]
        self.color = kw["color"]

first_car = Car(company="Hyundai", model="Santafe", color="black")

print(first_car.company, first_car.model, first_car.color)
#output: Hyundai Santafe black

 

ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋˜ ํ˜•ํƒœ๊ฐ€ ๋ณด์ธ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ์— keyword์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๋นผ๋จน๋Š”๋‹ค๋ฉด ๋ฌด์Šจ ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ?

 

class Car:

	def __init__(self, **kw):
    	self.model = kw["model"]	
        self.company = kw["company"]
        self.color = kw["color"]

first_car = Car(company="Hyundai", model="Santafe")

print(first_car.company, first_car.model, first_car.color)
#KeyError: 'color'

 

KeyError: keyword ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” kw["color"] ๋ง๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๊ฒƒ์€ get() ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

class Car:

	def __init__(self, **kw):
   	    self.model = kw.get("model")
	    self.company = kw.get("company")
            self.color = kw.get("color")

first_car = Car(company="Hyundai", model="Santafe")

print(first_car.company, first_car.model, first_car.color)
#output: Hyundai Santafe None

get() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  None ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

์ด๊ฒƒ์€ ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ๋งŽ์€ ํด๋ž˜์Šค์—์„œ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋ฌผ๋ก , ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

class Car:
	def __init__(self, company="Hyundai",**kw):
            self.model = kw.get("model")	
            self.company = company
            self.color = kw.get("color")

car1 = Car(color="blue", company="Ferrari")
car2 = Car(color="purple", model="GV80")
car3 = Car()

print(car1.color, car1.company, car1.model)
# output: blue Ferrari None

print(car2.color, car2.company, car2.model)
# output: purple Hyundai GV80

print(car3.color, car3.company, car3.model)
# output: None Hyundai None

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด, self.company ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” kw์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์•Œ๋˜ ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.