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

[1팀/허서원] 5차시 파이썬 스터디 - 함수

허서원 2023. 4. 6. 23:36

출처 - 데이터 과학을 위한 파이썬 프로그래밍

5차시_함수_과제.pdf
0.26MB
5차시_함수_강의안.pdf
0.64MB
5차시_함수_과제답안.pdf
0.23MB

학습 목표

  • 함수를 선언하는 방법. 함수의 실행 순서. 함수의 4가지 형태에 대해 알아본다.
  • 함수를 호출하는 방식과 변수의 사용 범위에 대해 학습하고. 재귀 함수에 대해 이해한다.
  • 함수의 인수인 키워드 인수, 디폴트 인수, 가변 인수, 키워드 가변 인수에 대해 알아본다.
  • 좋은 코드의 의미를 이해하고, 코딩 규칙과 함수 개발 가이드라인에 대해 학습한다

01 함수 기초

  • 함수의 개념과 장점
    • 함수(function)란?
      • 어떤 일을 수행하는 코드의 덩어리, 또는 코드의 묶음
        ex) 도형의 넓이를 구하는 프로그램에서 사각형의 넓이를 구하는 작업이 있다면, 해당 작업을 함수화하여 필요할 때마다 호출해서 사용
    • 함수를 만들었을 때 장점
      • 필요할 때마다 호출 가능
        함수는 반복적으로 수행해야 하는 업무를 한 번만 작성해 놓고 필요할 때마다 호출하여 사용할 수 있다.
        → 코드를 수정할 때 같은 작업을 여러 번 반복하지 않아도 된다.
      • 논리적인 단위로 분할 가능
        함수는 코드를 논리적인 단위로 나눌 수 있다.
        ex) 도형을 계산하는 프로그램을 작성할 때 곱셈, 덧셈, 나눗셈을 하는 코드를 나눔
      • 코드의 캡슐화
        캡슐화 → 함수의 인터페이스만 잘 정의하면 다른 사람이 자신의 코드를 쉽게 가져다 사용 가능
        🙌 인터페이스를 정의한다
        코드에 입력되는 입력값과 코드의 수행 결과인 출력값을 명확히 한다는 것이다. 흔히 블랙박스라고도 하는데, 인터페이스가 잘 정의된 함수라면 코드의 내부 구조를 몰라도 함수를 사용하는 데에는 아무 문제가 없다.
  • 함수의 선언
    • 함수를 선언하는 방법
    def 함수 이름 (매개변수 #1 …):
        명령문 1
        명령문 2
        return <반환값>
    1. def
      ’definition’의 줄임말, 함수의 정의를 시작한다는 의미이다.
    2. 함수 이름
      함수 이름은 개발자가 마음대로 지정할 수 있지만 일반적으로 파이썬 규칙을 따름
      • 소문자로 입력한다.
      • 띄어쓰기를 할 경우에는 _ 기호를 사용한다. ex) save_model
      • 작업을 나타내기 위해 동사와 명사를 함께 사용하는 경우가 많다. ex) find_number
      • 외부에 공개하는 함수일 경우 줄임말을 사용하지 않고, 명료한 이름으로 정한다.
    3. 매개변수(parameter)
      함수에서 입력값으로 사용하는 변수를 의미하며, 1개 이상의 값을 적을 수 있다.
    4. 명령문
      명령문은 반드시 들여쓰기한 후 코드를 입력해야 한다.
      수행해야 하는 코드는 지금까지 배운 일반적인 코드와 같다.
      if나 for문 등의 제어문을 사용할 수도 있고, 함수 안에 함수를 사용하기도 한다.
    5. return 값을 반환한다는 의미

  • 함수 이름은 calculate_rectangle_area
  • x, y 2개의 매개변수를 사용하고 있다.
  • x, y를 곱한 값을 반환하는 함수이다.

함수의 실행 순서

→ 함수가 정의된 def 부분은 실행되지 않는다. 단지 정의만 하는 것!!
함수만 파일에 저장하고 파이썬 명령으로 실행시켰을 때 별도의 출력이 일어나지 않는다.
정확히 말하면, 아무것도 실행되지 않는 것처럼 보이지만 실제로는 코드를 메모리에 업로드하여 다른 코드를 호출해 사용할 수 있도록 준비 과정을 거친다. 만약 함수의 선언 부분을 코드의 맨 마지막에 입력한다면 해당 코드 호출에 오류가 발생

→ 그 다음으로 함수가 수행해야 하는 명령이 실행된다.
정확히는 rectangle_x = 10과 rectangle_y = 20으로 변수에 값이 할당되고 그 값을 출력한다.
→ 그 다음, print("사각형의 넓이:", calculate_rectangle_area(rectangle_x, rectangle_y))를 수행
이 코드의 핵심은 calculate_rectangle_area(rectangle_x, rectangle_y) 부분이다. 함수를 호출하고. rectangle_x와 rectangle_y 변수에 할당된 값이 calculate_rectangle_area 함수에 입력값이 된다. 그러면 코드 return x * y에 의해 반환값 200이 반환된다.
즉, calculate_rectangle_area(rectangle_x, rectangle_y) 는 200으로 치환되고. 이 값이 화면에 출력

 

  • 프로그래밍 함수와 수학의 함수
  • 프로그래밍에서의 함수와 수학에서의 함수는 매우 비슷하다.

  • 함수의 형태
  • 함수는 매개변수와 반환값의 유무에 따라 네 가지 형태로 구분한다.

→ 함수의 형태에 따라 사용하는 방법이 다르다.

  • 첫 번째 함수는 매개변수와 반환값이 모두 없는 경우이다.
    입력값도 없고 반환되는 값도 없지만, print(5 * 7)로 인해 35가 출력된다. 이 경우에 a_rectangle_area()가 35로 치환되는 것이 아니라, 반환값이 없기 때문에 함수 자체는 none 값을 가진다. 대신 내부 함수인 print() 함수로 인해 35가 출력된다.
  • 두 번째 함수는 매개변수는 있지만 반환값이 없는 경우이다.
    b_rectangle_area()가 매개변수로 x, y를 넘겨받고, 그 값을 계산하여 출력하는 함수이다. 역시 반환값이 없으므로 b_rectangleArea(5, 7) 이라고 실행시켜야 35가 출력되는 것이지 b_rectangleArea(5, 7) 자체가 35로 치환되는 것은 아니다. 반환이 없으면 해당 함수는 none으로 치환된다.
  • 세 번째, 네 번째 함수는 반환값이 있는 경우이다.
    c_rectangle_area()와 d_rectangle_area() 함수 모두, 함수 안에서 print() 함수를 수행시키는 것이 아니라 함수를 호출할 때 print() 함수를 이용한다는 것을 알 수 있다. 즉, 두 함수 모두 return 문으로 인해 35로 치환되는 것이다. 이렇게 return이 있는 경우, 함수의 반환값이 있는 경우에는 함수를 호출하는 곳에서 함수의 반환값을 변수에 할당하여 사용하는 것이 가능하다.

02 함수 심화

  • 함수의 호출 방식

→ f(x)의 x에 5와 3이 입력된다.
함수 안에서의 x와 함수 밖에서의 x는 같은 변수일까, 아니면 다른 변수일까?

함수 밖에 있는 변수 x의 메모리 주소와 함수 안에 있는 변수 x의 메모리 주소가 같은지 다른지 확인할 필요가 있다.

함수 안에서 변수가 인수의 형태로 입력될 때 변수를 호출하는 방식은 크게 두 가지로 나눈다.

종류설명

값에 의한 호출 (call by value) • 함수에 인수를 넘길 때 값만 넘김
• 함수 내부의 인수값 변경 시 호출된 변수에 영향을 주지 않음
참조 호출 (call by referance) • 함수에 인수를 넘길 때 메모리 주소를 넘김
• 함수 내부의 인수값 변경 시 호출된 변수값도 변경됨

메모리 주소는 변수가 저장되는 공간을 가르키고, 그 공간 자체에 새로운 값을 할당하면 그 공간을 가리키고 있는 다른 변수에도 영향을 준다.

하지만 파이썬은 전통적인 두 가지 방식을 혼합한 방식을 사용하고 있다.

파이썬은 객체의 주소가 함수로 넘어간다는 뜻의 객체 호출 방식을 수용한다. 파이썬에서는 객체의 주소를 함수로 넘기기 때문에 전달된 객체의 값에 변경이 있을 경우, 즉, 새로운 값을 할당하거나 해당 객체를 지울 때는 영향을 주지 않지만 단순히 해당 객체에 값을 추가할 때는 영향을 준다.

  • 변수의 사용 범위
    변수의 사용 범위는 말 그대로 변수가 코드에서 사용되는 범위를 말하는데, 흔히 함수 내부에서 사용할 것인지, 또는 프로그램 전체에서 사용할 것인지 그 범위를 결정하는 규칙을 뜻한다. 일반적으로 변수의 사용 범위를 결정할 때는 고려해야 할 두 가지 변수가 있다.
    • 지역 변수(local variable): 함수 내부에서만 사용
    • 전역 변수(global variable): 프로그램 전체에서 사용
  • 재귀 함수(recursive function)
    재귀 함수는 자기 자신을 다시 호출하는 함수이다.
    재귀적이라는 표현은 자신을 이용해 다른 것을 정의한다는 뜻이다. 수학의 점화식과 같은 형태!!!
    → 팩토리얼factorial 함수이다. 정확히는 ‘n!’로 표시하고 n! = n x (n - 1)!로 선언할 수 있다. 자신의 숫자에서 1씩 빼면서 곱하는 형식이다. 보통은 점화식이라고 한다.
    코드화

factorial() 함수는 n이라는 변수를 입력 매개변수로 넘겨 받은 후 n == 1이 아닐 때까지 입력된 n과 n에서 1을 뺀 값을 입력값으로 다시 factorial() 함수를 호출하여 반환된 값과 곱한다. 만약 처음 사용자가 5를 입력했다면 다음과 같은 순서대로 계산될 것이다.

 

03 함수의 인수

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

  • 파이썬에서 인수를 사용하는 방법
종류 내용
키워드 인수 함수의 인터페이스에서 지정한 변수명을 사용하여 함수의 인수를 지정하는 방법
디폴트 인수 별도의 인수값이 입력되지 않을 때 인터페이스 선언에서 지정한 초깃값을 사용하는 방법
가변 인수 함수의 인터페이스에서 지정한 변수 이외의 추가 변수를 함수에 입력할 수 있도록 지원하는 방법
키워드 가변 인수 매개변수의 이름을 따로 지정하지 않고 입력하는 방법
  • 키워드 인수(keyword arguments)

함수에 입력되는 매개변수의 변수명을 사용하여 함수의 인수를 지정하는 방법이다.

 

  • 디폴트 인수(default arguments)

별도의 인수값이 입력되지 않을 때 인터페이스 선언에서 지정한 초깃값을 사용하는 방법

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

  • 가변 인수(variable-length arguments)

함수의 인터페이스에서 지정한 변수 이외의 추가 변수를 함수에 입력할 수 있도록 지원하는 방법

코드를 작성할 때 가끔 함수의 매개변수 개수를 정하지 않아야 하는 경우에 사용

*(asterisk라고 부름)로 표현할 수 있는데. *는 파이썬에서 기본적으로 곱셈 또는 제곱 연산 외에도 변수를 묶어주는 가변 인수를 만들 때 사용한다.

 

  • 키워드 가변 인수

매개 변수의 이름을 따로 지정하지 않고 입력하는 방법

가변 인수는 변수의 순서대로 튜플 형태로 저장된다. 사용은 간단하지만 변수의 이름을 지정할 수 없다는 단점을 보완한 것이 키보드 가변인수

→ 매개변수의 이름을 따로 지정하지 않고 입력하는 방법으로 *을 2개 사용하여 함수의 매개변수를 표시

입력된 값은 튜플 자료형이 아닌 딕셔너리 자료형으로 사용할 수 있다.

 

04 좋은 코드를 작성하는 방법

  • 좋은 코드의 의미컴퓨터가 이해할 수 있는 코드는 어느 정도 실력이 되면 만들 수 있지만, 좋은 프로그래머가 되기 위해서는 사람이 이해할 수 있는 프로그램 코드를 만들어야 한다.
    다시 말해 다른 사람이 내가 작성한 코드를 굉장히 쉽게 이해할 수 있도록 프로그램을 작성해야 한다는 뜻이다. 이러한 것을 가독성이라고 한다.
    결국 프로그램 코드는 많은 사람이 쉽게 읽고 이해할 수 있도록 가독성이 좋아야 한다.
  • 코딩 규칙
    가독성이 좋은 코드를 작성하기 위해서는 여러 가지가 필요하지만, 먼저 여러 사람의 이해를 돕기 위한 규칙이 필요하다. 프로그래밍에서는 이러한 규칙을 일반적으로 코딩 규칙이라 한다. 파이썬 역시 기본 코딩 규칙이 있으며 대표적인 것은 다음과 같다.
    • 들여쓰기는 4 스페이스
    • 한 줄은 최대 79자까지
    • 불필요한 공백은 없애기

    파이썬에서는 이러한 코딩 규칙 중 파이썬 개발자가 직접 정한 것이 있다.
    → PEP 8 (Python Enhance Proposal 8)
    : 파이썬 개발자들이 필요한 파이썬의 기능이나 여러 가지 부수적인 것을 정의한 문서
    하지만 꼭 PEP 8에 맞춰 코딩할 필요는 없음! 개발하다 보면 팀의 상황이나 구성원의 성향이 모두 다르므로 팀에 맞도록 규칙을 정하면 된다. 
    실제 PEP 8에는 다음과 같은 규칙이 있다. 가능하면 다음 규칙을 지키면서 코딩하는 것이 좋다.
    • = 연산자는 1칸 이상 띄우지 않는다.
    • 주석은 항상 갱신하고 불필요한 주석은 삭제한다.
    • 소문자 l, 대문자 O, 대문자 I는 사용을 금한다.
    • 함수명은 소문자로 구성하고, 필요하면 밑줄로 구분한다.