스터디/파이썬 스터디 강의자료

[2팀/김세연] 5차시 파이썬 스터디 - 함수

알 수 없는 사용자 2023. 4. 5. 13:21

5차시_함수_강의안.pdf
0.99MB
5차시_함수_과제.pdf
0.16MB

함수기초

기초
-함수
:어떤 일을 수행하는 코드의 덩어리, 코드의 묶음

-함수의 장점
: 필요할 때마다 호출 가능
(반복적으로 수행해야 하는 업무를 한 번만 작성해 놓고 필요할 때마다 호출하여 사용)

:코드의 캡슐화
인터페이스는 코드에 입력 되는값과 수행 결과인 출력값을 명확히 한다는 것
(흔히 블랙박스라고도 하는데, 인터페이스가 잘 정의된 함수라면 코드의 내부 구조를 몰라도 함수를 사용하는 데에는 아무 문제가 없음)

-함수의 선언


1) def는 ‘definition’의 줄임말로 함수 정의 시작을 의미

 

2)함수이름 (일반적으로 따르는 규칙이 존재)
:소문자 입력, 띄어쓰기 대신 _기호 사용
:동사와 명사를 함께 사용 (ex.find_number)
:줄임말보단 짧고 명료한 이름 설정

3)매개변수
:함수에서 입력값으로 사용하는 변수를 의미하며, 1개 이상의 값을 적을 수 있음

4)명령문
:반드시 들여쓰기한 후 코드를 입력해야 함.
수행해야 하는 코드는 일반적인 코드와 같음.
if나 for문 등의 제어문을 사용할 수도 있고, 고급 프로그래밍 기법 으로 함수 안에 함수를 사용하기도 함

 

def calculate_rectangle_area(x, y)
return x * y


함수명은 calculate_rectangle_area이고,
x와 y라는 2개의 매개변수 사용, return은 값을 반환하는 함수

-함수의 실행 순서

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

 

1행은 함수가 정의된 def부분은 실행 안됨 / 함수만 파일에 저장하고 별도 출력X

아무것도 실행되지 않는 것 같지만, 실제로 해당 코드를 메모리에 업로드해,
다른 코드를 호출해 쓸수 있는 준비과정임 (맨 마지막에 정의하면 오류남)

 

-함수의 형태

매개변수와 변환값 유무에 따라 4가지로 구분

 

#매개변수X 반환값X
#반환값이 없기 때문에 함수 자체는 none값을 가짐
def a_rectangle_area():
    print(5 * 7)


#매개변수O 반환값X
def b_rectangle_area(x, y):
    print(x * y)

#함수 안에 print가 있는 것이 아닌 함수를 호출할 때 print를 사용
#>return이 있는 경우 함수를 호출하는 곳에서 함수의 반환값을 변수에 할당 

#매개변수X 반환값O
def c_rectangle_area():
    return(5 * 7)

#매개변수O 반환값O
def d_rectangle_area(x ,y):
    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

#모두 35라는 같은 값이지만 , 함수의 형태에 따라 사용 방법이 다름

 

함수 심화

심화

-함수의 호출방식

 

:메모리 주소는 변수가 저장되는 공간을 가르킴

: 그 공간 자체에 새로운 값을 할당하면,그 공간을 가리키고 있는 다른 변수에도 영향을 줌


>파이썬은 객체의 주소가 함수로 넘어간다는 뜻의 객체 호출 방식을 사용함

 

파이썬에서 객체의 주소를 함수로 넘기기 때문에 전달된 객체의 값에 변경이 있을 경우,

(=즉 새로운 값을 할당하거나 해당 객체를 지울 때는)

영향을 주지 않지만, 단순히 해당 객체 에 값을 추가할 때는 영향을 줌

 

def spam(eggs):
    eggs.append(1)
    eggs=[2,3]

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

[0,1]

 

-변수의 사용범위

:변수가 코드에서 사용되는 범위를 말함

함수 내부에서 사용할 것인지, 또는 프로그램 전체에서 사용할 것인지 그 범위를 결정하는 규칙을 뜻함

 

-지역 변수: 함수 내부에서만 사용

-전역 변수: 프로그램 전체에서 사용

 

def test(t):
    print(x)
    t =20
    print("In Function:", t)
#x선언 안함, t선언 함

#여기부터 시작
x = 10
test(x)
print("In Main:", x)
print("In Main:", t)


#x는 프로그램 전체에서 사용하는 전역변수 (함수 내에서 재정의 안했음)
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
#에러가 난 이유는 T는 함수내부에서만 사용하는 지역변수이기 때문임
def f():
    s = "I love London!"
    print(s)

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

I love London!
I love Paris!

#함수 내부와 외부에 있는 변수s는 같은 이름이지만 다른 메모리 주소인 다른 변수
#서로 영향 안줌
def f():
    global s
    s ="I love London!"
    print(s)

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

I love London!
I love London!

#함수 내부와 외부의 변수를 같은 메모리에 두혀면 전역변수 선언하면 됨 > global
#함수 내외부 같은 메모리주소

-재귀함수

:자기 자신을 다시 호줄하는 함수 - 수학의 점화식과 같은 형태

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

재귀함수의 기본 구조: 종료조건, 단계별 반환 (=반복문(for문과 while문과 비슷)으로 표현가능)

>재귀함수는 고급 프로그래머로 갈수록 자주 접하게 됨

함수의 인수

:함수의 입력으로 들어가는 변수의 다양한 형태

 

  • 인수의 종류
    -키워드 인수
    : 함수에 입력되는 매개변수의 변수명을 사용해 함수의 인수를 지정하는 방법

def print_something(my_name, your_name):
    print("Hello {0}, My name is {1}".format(your_name, my_name))

#print_something이라는 함수는 (my_name, your_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

-디폴트 인수

:매개변수에 기본값을 지정하여 사용하고, 아무런 값도 인수로 넘어가지 않을 때 지정된 기본값을 사용하는 방식

 

#인터페이스 정의, your_name의 기본값은 'TEAMLAB'으로 지정
def print_something_2(my_name, your_name = "TEAMLAB"):
    print("Hello {0}, My name is {l}".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

-가변인수 (매개변수의 개수를 정하지 않아야 하는 경우)

:기본적으로 곱셈 또는 제곱 연산외에도 변수를 묶어주는 가변 인수를 만들 때 사용함

 

#*args는 가변인수
def asterisk_test(a, b, *args):
    return a + b + sum(args)

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

15

 

def asterisk_test(a, b, *args):
    print(args)

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

(3,4,5) # 튜플 자료형
NONE
def asterisk_test_2(*args):
    x, y, *z = args # 입력 박은 가변 인수의 개수를 안다면 언패킹 가능
    return x, y, z

print(asterisk_test_2(3, 4, 5))

(3,4,[5])

 

def asterisk_test_2(*args):
    x, y, *z = args # 입력 박은 가변 인수의 개수를 안다면 언패킹 가능
    return x, y, z

print(asterisk_test_2(3, 4, 5))

(3,4,[5])

-키워드 가변 인수

:가변 인수는 변수의 순서대로 튜플형태로 저장

 

사용할 때는 매우 간단하지만 변수의 이름을 지정할 수 없다는 단점

단점을 보완하는 방법이 키워드 가변 인수

튜플이 아닌 딕셔너리 자료형(쌍으로 저장)

 

키워드 가변 인수는 반드시 매개변수의 맨 마지막, 가변인수 다음에 선언되어야 함

(매개변수의 이름을 따로 지정하지 않고 입ㅎ력하는 이번 가변인수, *2개를 이용해 매개변수 표시)

 

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