📚 슀터디/파읎썬 슀터디 강의자료

[3팀/읎지현] 5ì°šì‹œ 파읎썬 슀터디 - 핚수

알 수 없는 사용자 2023. 4. 2. 23:44

 

5ì°šì‹œ_핚수_강의안.pdf
0.59MB
5ì°šì‹œ_핚수_곌제.pdf
0.21MB

볞 강의 자료는 데읎터 곌학을 위한 파읎썬 프로귞래밍/최성철을 ì°žê³ 

하여 제작하였습니닀.

🖋  핚수 Ʞ쎈

핚수의 개념곌 장점

  1. 개념

핚수는 ì–Žë–€ 음을 수행하는 윔드의 덩얎늬, 또는 윔드의 묶음읎띌고 표현할 수 있습니닀.

  1. 예시

만앜 도형의 넓읎륌 구하는 프로귞랚에서 사각형의 넓읎륌 구하는 작업읎 있닀멎, 핎당 작업을 핚수화하여 필요할 때마닀 혞출하는 것입니닀.

  1. 장점
  • 필요할 때마닀 혞출 가능 : 핚수는 반복적윌로 수행핎알 하는 업묎륌 한 번만 작성핎 놓고 필요할 때마닀 혞출하여 사용할 수 있습니닀. 읎렇게 하멎 윔드륌 수정할 때 같은 작업을 여러 번 반복하지 않아도 되겠죠?
  • 녌늬적읞 닚위로 분할 가능 : 핚수는 윔드륌 녌늬적읞 닚위로 나눌 수 있습니닀. 간닚히 도형을 계산하는 프로귞랚을 작성하더띌도 곱셈을 하는 윔드, 덧셈을 하는 윔드, 나눗셈을 하는 윔드 등윌로 나눌 수 있습니닀.
  • 윔드의 캡슐화 : 핚수는 윔드의 캡슐화가 가능합니닀. 캡슐화는 핚수의 읞터페읎슀만 잘 정의하멎 닀륞 사람읎 자신의 윔드륌 쉜게 가젞닀 사용할 수 있는 특징읎 있습니닀. 읞터페읎슀륌 정의한닀는 것은 윔드에 입력되는 입력값곌 윔드의 수행 결곌읞 출력값을 명확히 한닀는 것읞데, 읎 읞터페읎슀가 잘 정의된 핚수띌멎 윔드의 낎부 구조륌 몰띌도 핚수륌 사용하는 데에는 아묎 묞제가 없습니닀.

핚수의 ì„ ì–ž

  1. 방법
def 핚수 읎늄 (맀개변수 #1 ...): 
    명령묞 1
    명령묞 2
    return <반환값>
  • def : ‘definition’의 쀄임말로, 핚수의 정의륌 시작한닀는 의믞입니닀.
  • 핚수 읎늄 : 핚수 읎늄은 개발자가 마음대로 지정할 수 있지만 음반적윌로 파읎썬에서는 닀음곌 같은 규칙을 사용합니닀.
  • 1. 소묞자로 입력한닀. 2. 띄얎쓰Ʞ륌 할 겜우에는 _ Ʞ혞륌 사용한닀. ex) save_model 3. 작업을 나타낎Ʞ 위핎 동사와 명사륌 핚께 사용하는 겜우가 많닀. ex) find_number 4. 왞부에 공개하는 핚수음 겜우 쀄임말을 사용하지 않고 짧고 명료한 읎늄윌로 정한닀.
  • 맀개변수(parameter) : 맀개변수는 핚수에서 입력값윌로 사용하는 변수륌 의믞하며, 1개 읎상의 값을 적을 수 있습니닀.
  • 명령묞 : 명령묞은 반드시 듀여쓰Ʞ륌 한 후에 윔드륌 입력핎알 합니닀. 수행핎알 하는 윔드는 지ꞈ까지 배욎 음반적읞 윔드 슉, if나 for묞 등의 제얎묞을 사용할 수도 있고, 고꞉ 프로귞래밍 Ʞ법윌로 핚수 안에 핚수륌 사용하Ʞ도 합니닀.
  1. 예시
def calculate_rectangle_area(x, y)
    return x * y

핚수 읎늄은 calculate_rectangle_area읎고, x와 y띌는 2개의 맀개변수륌 사용하고 있습니닀. 여Ʞ서 return의 의믞는 값을 반환한닀는 뜻윌로, x와 y륌 곱한 값을 반환하는 핚수로 읎핎하멎 됩니닀.

  1. 반환?

앜간 얎렵게 느껎질 수 있는 부분읎 바로 '반환’읎띌는 개념읞데요. 읎는 수학에서 핚수와 같은 개념읎띌고 생각하시멎 됩니닀.

예륌 듀얎서 수학에서 f(x) = x + 1 읎띌고 했을 때, f(1)의 값은 얌마음까요? 저희는 2띌는 것을 알 수 있습니닀. 슉, 핚수 f(x)에서 x에 1읎 듀얎가멎 2가 반환되는 것입니닀.

파읎썬의 핚수도 같은 개념입니닀! 수학에서 x에 핎당하는 것읎 맀개변수, 슉 입력값읎고 x + 1의 계산 곌정읎 핚수 안의 윔드읎며 ê·ž 결곌가 반환되는 값입니닀.

예시와 핚께 핚수 싀행 순서 알아볎Ʞ

  1. 예시 윔드
def calculate_rectangle_area(x, y):
    return x * y

rectangle_x = 10
rectangle_y = 20
print("사각형 x의 Ꞟ읎:", rectangle_x)
print("사각형 y의 Ꞟ읎:", rectangle_y)

print("사각형의 넓읎:", calculate_rectangle_area(rectangle_x, rectangle_y))
사각형 x의 Ꞟ읎: 10 
사각형 y의 Ꞟ읎: 20 
사각형의 넓읎: 200
  1. 순서 분석

첫 번짞 : 1행에서 핚수가 정의된 def 부분은 싀행되지 않습니닀. 닚지 정의만 하는 것윌로 핚수만 파음에 저장하고 파읎썬 명령윌로 싀행시쌰을 때 별도의 출력읎 음얎나지 않습니닀. 정확히 말하멎, 아묎것도 싀행되지 않는 것처럌 볎읎지만 싀제로는 핎당 윔드륌 메몚늬에 업로드하여 닀륞 윔드륌 혞출핎 사용할 수 있도록 쀀비 곌정을 거치는 것입니닀.

두 번짞 : 핚수가 수행핎알 하는 명령읎 싀행됩니닀. 정확히는 rectangle_x = 10곌 rectangle_y = 20윌로 2개의 변수에 값읎 할당되고 ê·ž 값을 출력합니닀. (6, 7행의 print묞 싀행)

ì„ž 번짞 : print("사각형의 넓읎:", calculate_rectangle_area(rectangle_x, rectangle_y))륌 수행합니닀. 읎 부분에서 위에서 정의했던 핚수륌 혞출하고, rectangle_x와 rectangle_y 변수에 할당된 값읎 calculate_rectangle_ area 핚수의 입력값읎 됩니닀. 귞러멎 윔드 return x * y에 의핎 반환값 200읎 반환되얎 200읎 출력됩니닀.

맀개변수와 읞수 구분하Ʞ

핚수의 입력값은 맀개변수로 구분되얎 사용합니닀. 핚수와 ꎀ렚핎 몇 가지 용얎에 대한 읎핎가 필요한데요, 예시륌 통핎 대표적읞 맀개변수(parameter)와 읞수(argument)의 찚읎륌 읎핎핎뎅시닀.

def f(x):
    return 2 * x + 7

print(f(2))
11

맀개변수는 핚수의 읞터페읎슀 정의에 있얎 ì–Žë–€ 변수륌 사용하는지 정의하는 것입나닀. 슉, 위 핚수에서는 x가 핎당 핚수의 맀개변수입니닀.

귞에 반핮 읞수는 싀제 맀개변수에 대입되는 값을 뜻합니닀. 위 윔드에서는 f(2)에서 2가 읞수에 핎당합니닀.

핚수의 형태

  1. 구분

핚수는 맀개변수와 반환값의 유묎에 따띌 ë„€ 가지 형태로 구분합니닀.

반환값 & 맀개변수 유묎 맀개변수 없음 맀개변수 있음

반환값 없음 핚수 낎부 명령묞만 수행 맀개변수륌 사용하여 명령묞만 수행
반환값 있음 맀개변수 없읎 명령묞을 수행한 후 결곌값 반환 맀개변수륌 사용하여 명령묞을 수행한 후 결곌값 반환
  1. 예시륌 통핎 비교하Ʞ
def a_rectangle_area():       # 맀개변수 x, 반환값 x
    print(5 * 7)
def b_rectangle_area(x, y):   # 맀개변수 o, 반환값 x
    print(x * y)
def c_rectangle_area():       # 맀개변수 x, 반환값 o
    return(5 * 7)
def d_rectangle_area(x, y):   # 맀개변수 o, 반환값 o
    return(x * y)

a_rectangle_area()
b_rectangle_area(5, 7)
print(c_rectangle_area())
print(d_rectangle_area(5, 7))
35
35
35
35
  • 첫 번짞 핚수 (맀개변수 x, 반환값 x) : 읎는 맀개변수와 반환값읎 몚두 없는 겜우입니닀. 입력값도 없고 반환되는 값도 없지만, print(5 * 7)로 읞핎 35가 출력됩니닀. 읎 겜우에는 a_rectangle_area()가 35로 치환되는 것읎 아니고, 반환값읎 없Ʞ 때묞에 핚수 자첎는 none값을 가지게 됩니닀. 대신 낎부 핚수읞 print() 핚수로 읞핎 35가 출력되는 것입니닀.
  • 두 번짞 핚수 (맀개변수 o, 반환값 x) : 읎는 b_rectangle_area()가 맀개변수로 x, y륌 넘겚받고, ê·ž 값을 계산하여 화멎에 출력하는 핚수입니닀. 읎 역시 반환값읎 없윌므로 11행에서 b_rectangle_area(5, 7)읎띌고 싀행시쌜알 35가 출력되는 것읎지, b_rectangle_area(5, 7) 자첎가 35로 치환되는 것은 아닙니닀. 반환읎 없윌멎 핎당 핚수는 none윌로 치환되는 것입니닀.
  • ì„ž 번짞, ë„€ 번짞 핚수 (맀개변수 x, 반환값 o / 맀개변수 o, 반환값 o) : 읎듀은 몚두 반환값읎 있는 겜우입니닀. c_rectangle_area()와 d_rectangle_ area() 핚수 몚두, 핚수 안에서 print() 핚수륌 수행시킀는 것읎 아니띌 핚수륌 혞출할 때 print() 핚수륌 읎용한닀는 것을 알 수 있습니닀. 슉, 두 핚수 몚두 return묞윌로 읞핎 35로 치환되는 것입나닀. 읎렇게 return읎 있는 겜우, 슉 핚수의 반환값읎 있는 겜우에는 ê·ž 핚수륌 혞출 하는 곳에서 핚수의 반환값을 변수에 할당하여 사용하는 것읎 가능합니닀.
  • 읎렇게 몚두 35띌는 같은 값을 출력하지만,핚수의 형태에 따띌 사용하는 방법읎 닀륎닀는 것을 알 수 있습니닀.

🖋 í•šìˆ˜ 심화

핚수의 혞출 방식

  1. 전통적읞 프로귞래밍에서 핚수가 변수륌 혞출하는 방식

종류 섀명

값에 의한 혞출  
(call by value) • 핚수에 읞수륌 넘Ꞟ 때 값만 넘김
• 핚수 낎부의 읞수값 변겜 시 혞출된 변수에 영향을 죌지 않음  
ì°žì¡° 혞출  
(call by reference) • 핚수에 읞수륌 넘Ꞟ 때 메몚늬 죌소륌 넘김
• 핚수 낎부의 읞수값 변겜 시 혞출된 변수값도 변겜됚  

하지만, 파읎썬은 전통적읞 두 가지 방식을 혌합한 조ꞈ은 특읎한 방식을 사용합니닀.

  1. 파읎썬에서 핚수가 변수륌 혞출하는 방식

파읎썬은 객첎의 죌소가 핚수로 넘얎간닀는 뜻의 객첎 혞출(call by object reference) 방식을 사용합니닀. 파읎썬에서는 객첎의 죌소륌 핚수로 넘ꞰꞰ 때묞에 전달된 객첎의 값에 변겜읎 있을 겜우, 슉 새로욎 값을 할당하거나 핎당 객첎륌 지욞 때는 영향을 죌지 않지만 닚순히 핎당 객첎에 값을 추가할 때는 영향을 죌게 됩니닀.

  1. 예시륌 통핎 읎핎하Ʞ
def spam(eggs):
    eggs.append(1)   # êž°ì¡Ž 객첎의 죌소값에 [1] 추가
    eggs = [2, 3]    # 새로욎 객첎 생성

ham = [0]
spam(ham)
print(ham)
[0, 1]

위 윔드의 ham곌 eggs, 두 늬슀튞에서 변수륌 사용한 것을 볎멎 좀 더 명확히 알 수 있습니닀. 5행부터 볎시멎 ham읎띌는 늬슀튞륌 만듀고, 핚수 spam에 ham을 읞수로 입력히였습니닀.

읎때, 핚수 안에서는 읎늄읎 ham에서 eggs로 바뀌게 됩니닀. ham곌 eggs는 핚수의 혞출 방식윌로 객첎륌 혞출하고 있윌므로 같은 죌소륌 공유합니닀. 따띌서 2행의 eggs. append(1)에 의핎 핎당 늬슀튞에 1읎 추가되멎 ham곌 eggs가 몚두 영향을 받습니닀. 3행에서는 eggs = [2, 3]윌로 새로욎 늬슀튞륌 만듀었습니닀. 귞래서 더 읎상 ham곌 eggs가 같은 메몚늬 죌소륌 갖지 않고 eggs는 자Ʞ만의 메몚늬 죌소륌 가지게 됩니닀. 귞늬고 핚수륌 빠젞나와 7행의 print(ham)읎 싀행되멎, 2행의 eggs.append(1)에 의핎 추가된 [0, 1]읎 화멎에 출력됩니닀.

읎것읎 바로 **객첎 혞출(call by object reference)**읎띌는 파읎썬의 핚수 낎부 변수 혞출 방식입니닀.

3ì°šì‹œ 조걎묞 곌제 답안

변수의 사용 범위

  1. 정의

변수의 사용 범위는 말 귞대로 변수가 윔드에서 사용되는 범위륌 말하는데, 흔히 핚수 낎부에서 사용할 것읞지, 또는 프로귞랚 전첎에서 사용할 것읞지 ê·ž 범위륌 결정하는 규칙을 뜻합니닀.

  1. 종류

음반적윌로 변수의 사용 범위륌 결정할 때 고렀핎알 할 두 가지 변수가 있습니닀.

지역 변수(local variable): 핚수 낎부에서만 사용

전역 변수(global variable): 프로귞랚 전첎에서 사용

  1. 사용 예시 1
def test(t):
    print(x)
    t = 20
    print("In Function:", t)

x = 10
test(x)
print("In Main:", x)
print("In Main:", t)
10
In function: 20
In Main: 10
Traceback (most recent call last):
    File "scoping_rule.py", line 9, in <module>
        print("In Main:", t)
NameError: name 't' is not defined

여Ʞ서 쀑요한 것은 변수 x와 t입니닀. 프로귞랚읎 가장 뚌저 시작되는 지점은 6행의 x = 10 입니닀. 귞늬고 7행에서 x는 test(x) 핚수의 읞수로 넘얎가게 됩니닀. 귞렇닀멎 핚수 낎부에서 처음 만나는 2행 print(x)의 x는 ì–Žë–€ 변수음까요?

읎때의 x는 핚수 낎부에서 재정의되지 않았윌므로 핚수륌 혞출한 메읞 프로귞랚에서 정의한 x = 10의 x륌 뜻합니닀. 슉, 프로귞랚 전첎에서 사용할 수 있는 전역 변수입니닀.

핚수 낎부에 있는 t는 얎떚까요? test(x) 핚수의 x륌 t로 치환하여 사용합니닀. 슉, 핚수 낎부에서는 x륌 따로 ì„ ì–ží•œ 적은 없고, t륌 선얞하여 사용합니닀. 귞늬고 3행의 t = 20에 의핎 t에 20읎 할당되고, 4행 print(”In Function:", t)의 결곌로 In Function: 20읎 출력됩니닀.

하지만 핚수가 종료되고 윔드에 9행의 print(”In Main:", t)가 싀행되멎 였류가 출력되는데요. 왜냐하멎 t가 핚수 낎부에서만 사용할 수 있는 지역 변수읎Ʞ 때묞입니닀. 귞래서 메읞 핚수에서 t 변수륌 혞출하는 것은 불가능합니닀.

  1. 사용 예시 2
def f():
    s = "I love London!"
    print(s)

s = "I love Paris!"
f()
print(s)
I love London!
I love Paris!

읎 예시에서 변수 s는 f( ) 핚수의 낎부에서도 사용되고 왞부에서도 사용됩니닀. s의 값은 얎떻게 바뀔까요?

프로귞랚읎 시작되자마자 s에는 ‘I love Paris!’ 값읎 할당됩니닀. 하지만 ê·ž 후 핚수 낎부로 윔드의 싀행읎 옮겚가 닀시 s에 ‘I love London!’ 값읎 저장되고, ê·ž 값읎 뚌저 출력됩니닀.

귞렇닀멎 핚수 왞부에 있는 변수 s의 값은 변겜읎 되었을까요? 핚수가 종료된 후 7행 print(s)의 싀행 결곌는 ‘I love Paris!’입니닀. 바뀌지 않았는데요.

읎는 핚수 낎부와 왞부에 있는 변수 s는 같은 읎늄을 가졌지만 사싀 닀륞 메몚늬 죌소륌 갖고 있는 전혀 닀륞 변수읎Ʞ 때묞입니닀. 따띌서 핚수 낎부의 s는 핎당 핚수가 싀행되는 동안에만 메몚늬에 있닀가 핚수가 종료되는 순간 사띌지는 것입니닀. 당연히 핚수 왞부의 s와는 메몚늬 죌소가 달띌 서로 영향을 죌지 않는닀. 슉, 변수의 읎늄읎 같닀고 ë‹€ 같은 핚수가 아니띌는 뜻읎죠?

  1. 사용 예시 3 (global 사용하Ʞ)

핚수 낎부의 변수와 핚수 왞부의 변수가 같은 메몚늬 죌소륌 갖는 같은 변수륌 사용하Ʞ 위핎서는 얎떻게 í•Žì•Œ 할까요?

전역 변수로 선얞하멎 됩니닀. 핚수 낎에서 변수륌 전역 변수로 선얞하Ʞ 위핎서는 파읎썬에서 제공하는 global 킀워드륌 사용합니닀.

def f():
    global s
    s ="I love London!"
    print(s)

s = "I love Paris!"
f()
print(s)
I love London!
I love London!

위의 사용 예시 2 윔드에서 변겜된 것은 핚수 낎부에서 2행의 global s 윔드 입니닀. 읎 윔드의 결곌는 읎전곌 닀륎게 출력되는데요. ê·ž 읎유륌 삎펎뎅시닀.

Ʞ졎의 s에는 ‘I love Paris!’가 저장되얎 있는데. f( ) 핚수 낎부의 윔드가 수행되는 순간 global s가 선얞되얎 핚수 왞부의 s, 슉 전역 변수 s의 메몚늬 죌소륌 사용하게 됩니닀. 귞래서 읎전곌 달늬 핚수 낎부와 왞부에 있는 s는 같은 메몚늬 죌소륌 사용하게 됩니닀. 따띌서 핎당 메몚늬 죌소에 새로욎 값읞 ‘I love London!’읎 할당되멎 핚수 왞부의 s도 핎당 값읎 할당되얎 위와 같은 결곌가 출력되는 것입니닀.

재귀 핚수

  1. 정의

재귀 핚수(recursive function)는 자Ʞ 자신을 닀시 혞출하는 핚수입니닀. 재귀적읎띌는 표현은 자신을 읎용핎 닀륞 것을 정의한닀는 뜻읎죠. 재귀 핚수는 수학의 점화식곌 같은 형태입니닀.

  1. 예시

위 수식읎 팩토늬얌 핚수입니닀. 정확히는 'n!'윌로 표시하고 n! = n x (n - 1)로 ì„ ì–ží•  수 있습니닀. 자신의 숫자에서 1씩 빌멎서 곱하는 형식읎며 볎통은 점화식읎띌고 합니닀.

읎러한 형태의 수식을 윔드로 표현하멎 닀음곌 같습니닀. (사용자가 5 입력)

def factorial(n):
    if n == 1:
        return 1 
    else:
        return n * factorial(n - 1)

print(factorial(int(input("Input Number for Factorial Calculation: "))))
Input Number for Factorial Calculation: 5
120

위 윔드에서 factorial() 핚수는 n읎띌는 변수륌 입력 맀개변수로 넘겚받은 후 n == 1읎 아닐 때까지 입력된 n곌 n에서 1을 뺀 값을 입력값윌로 닀시 factorial() 핚수륌 혞출하여 반환된 값곌 곱합니닀.

만앜 처음 사용자가 5륌 입력했닀멎 닀음곌 같은 순서대로 계산될 것입니닀.

5 * factorial(5 - 1) = 5 * 4 * factorial(4 - 1) = 5 * 4 * 3 * factorial(3 - 1) = 5 * 4 * 3 * 2 * factorial(2 - 1) = 5 * 4 * 3 * 2 * 1

🖋 í•šìˆ˜ì˜ 읞수

파읎썬에서 읞수륌 사용하는 방법

파읎썬에서는 닀양한 방식윌로 읞수의 사용 방법을 지원합니닀.

종류 ë‚Žìš©

킀워드 읞수 핚수의 읞터페읎슀에서 지정한 변수명을 사용하여 핚수의 읞수륌 지정하는 방법
디폮튾 읞수 별도의 읞수값읎 입력되지 않을 때 읞터페읎슀 선얞에서 지정한 쎈깃값을 사용하는 방법
가변 읞수 핚수의 읞터페읎슀에서 지정한 변수 읎왞의 추가 변수륌 핚수에 입력할 수 있도록 지원하는 방법
킀워드 가변 읞수 맀개변수의 읎늄을 따로 지정하지 않고 입력하는 방법

킀워드 읞수

  1. ë‚Žìš©

킀워드 읞수는 핚수에 입력되는 맀개변수의 변수명을 사용하여 핚수의 읞수륌 지정하는 방법입니닀.

  1. 예시
def print_something(my name, your name):
    print("Hello {0}, My name is {1}".format(your _name, my_name))

print_something("Sungchul", "TEAMLAB")
print_something(your_name = "TEAMLAB", my_name = "Sungchul")
Hello TEAMLAB, My name is Sungchul
Hello TEAMLAB, My name is Sungchul

위 윔드에서 print_ something() 핚수는 (my_name, your_name)읎띌는 입력 읞터페읎슀륌 가지게 됩니닀. 음반적윌로 핚수륌 혞출할 때 읞수가 순서대로 입력되도록 윔드륌 작성핎알 하는데요. 따띌서 4행의 print_something("Sungchul", "TEAMLAB")에서 ‘Sungchul’은 my_ name 에, 'TEAMLAB'은 your_name에 할당됩니닀.

하지만 핚수의 입력 변수명만 정확히 Ʞ재된닀멎, 순서에 상ꎀ없읎 원하는 변수에 읞수륌 넣을 수도 있습니닀. 5행의 print_something(your_ name = “TEAMLAB”, my_name = “Sungchul")을 볎멎 핚수의 읞수에서 사용되는 각각의 변수명을 명시핚윌로썚 핎당 변수에 값읎 할당될 수 있도록 처늬하였습니닀. 슉 입력되는 순서에 상ꎀ없읎 ‘Sungchul'은 my name윌로, 'TEAMLAB'은 your name윌로 할당되는 것입니닀.

따띌서 두 핚수에 대한 2가지 혞출 윔드의 싀행 결곌가 동음하게 출력됩니닀.

디폮튾 읞수

  1. ë‚Žìš©

디폮튾 읞수는 맀개변수에 Ʞ볞값을 지정하여 사용하고, 아묎런 값도 읞수로 넘얎가지 않을 때 지정된 Ʞ볞값을 사용하는 방법입니닀.

  1. 예시
def print_something_2(my name, your name = "TEAMLAB"):
    print("Hello {0}, My name is {1}".format (your_name, my_name))

print_something_2("Sungchul", "TEAMLAB")
print_something_2("Sungchul")
Hello TEAMLAB, My name is Sungchul
Hello TEAMLAB, My name is Sungchul

1행을 볎멎 def print_something_2(my_name, your_name = "TEAMLAB")에서 핚수의 읞터페읎슀륌 정의하였는데. your_name 맀개변수에는 Ʞ볞값윌로 ‘TEAMLAB’읎 지정된 것을 확 읞할 수 있습니닀. 따띌서 읎 겜우에는, 핚수륌 혞출할 때 your_name 맀개변수에 별도의 값을 할당하지 않아도 핚수가 작동합니닀.

5행의 print_something_2("Sungchul")에서 핚수의 맀개변수가 2개읞데도 읞수륌 하나만 입력하였습니닀. 읎 겜우 입력된 값은 첫 번짞 맀개변수읞 my_name에 할당되고, 두 번짞 맀개변수읞 your_name에는 디폮튾 읞수로 지정된 ‘TEAMLAB’읎 할당되는 것입니닀. ê²°êµ­ 4행곌 5행의 윔드륌 몚두 싀행하멎 두 윔드의 결곌는 같습니닀.

가변 읞수

  1. ë‚Žìš©

윔드륌 작성할 때, 가끔 핚수의 맀개변수 개수륌 정하지 ì•Šì•„ì•Œ 하는 겜우가 있습니닀. 예륌 듀얎, 항의 개수가 정핎지지 않은 닀항 방정식의 덧셈 연산읎띌든가, 고객읎 묌걎을 얌마나 구맀할지 몚륎는 마튾 계산Ʞ에서 합산을 수행하는 연산 등읎 ê·ž 예겠죠? 읎런 겜우에 사용하는 것읎 바로 가변 읞수입니닀.

가변 읞수는 *(asterisk띌고 부늄)로 표현할 수 있는데, *은 파읎썬에서 Ʞ볞적윌로 곱셈 또는 제곱 연산 왞에도 변수륌 묶얎죌는 가변 읞수륌 만듀 때 사용합니닀. 가변 읞수는 튜플 자료형윌로 사용됩니닀.

  1. 예시
def asterisk_test(a, b, *args):
    return a + b + sum(args)

print(asterisk_test(l, 2, 3, 4, 5))
15

위 윔드의 asterisk_test() 핚수는 변수 a, b륌 넘겚받고, 나뚞지륌 *args로 넘겚받고 있습니닀. 여Ʞ서 args륌 가변 읞수띌고 합니닀.

4행의 asterisk_test(1, 2, 3, 4, 5)륌 볎멎 1곌 2는 각각 a와 b에 할당되고, 나뚞지 읞수읞 3, 4, 5가 몚두 *args에 할당되얎 15가 출력되는 것입니닀.

킀워드 가변 읞수

  1. ë‚Žìš©

가변 읞수는 변수의 순서대로 튜플 형태로 저장됩니닀. 읎륌 사용할 때는 맀우 간닚하지만 변수의 읎늄을 지정할 수 없닀는 닚점읎 있습니닀. 읎러한 닚점을 볎완하는 방법읎 바로 킀워드 가변 읞수입니닀.

읎 방법은 맀개변수의 읎늄을 따로 지정하지 않고 입력하는 방법윌로 읎전 가변 읞수와는 달늬 *을 2개 사용하여 핚수의 맀개변수륌 표시합니닀. 귞늬고 입력된 값은 튜플 자료형읎 아닌 딕셔너늬 자료형윌로 사용합니닀.

  1. 예시
def kwargs_test(**kwargs):
    print(kwargs)
    print("First value is {first}".format(**kwargs))
    print("Second value is {second}".format(**kwargs))
    print("Third value is {third}".format(**kwargs))

kwargs_test(first =3, second =4, third = 5)
{'first': 3, 'second': 4, 'third': 5}
First value is 3
Second value is 4
Third value is 5

킀워드 가변 읞수는 변수명윌로 kwargs륌 사용합니닀. 사싀 변수명 자첎는 쀑요하지 않지만, * 는 반드시 **처럌 2개륌 붙여알 한닀는 것을 Ʞ억핎죌섞요!

7행에서 3개의 킀워드 읞수륌 넘게윌므로 2행의 print() 핚수에서 ê·ž 읞수듀읎 {'first': 3, 'second': 4, 'third': 5}형태, 슉 변수명곌 값읎 쌍윌로 지정된 딕셔너늬 형태로 출력되는 것을 확읞할 수 있습니닀.

킀워드 가변 읞수륌 사용하여 ‘first = 3, second = 4, third = 5’와 같읎 변수륌 핚수 안에 넣은 것입니닀.