Programing/Python

#함수 이해 및 활용 - 1

CouqueD'asse 2022. 6. 22. 14:29

함수?

  • 지금까지 무심코 코드에서 사용된 많은 함수들이 존재 합니다.
  • 예를들면, sum, len, range 같은 함수 등이 있죠.
  • 함수란 우리가 알고있는 개념처럼 주어진 입력(input)에 대해서 의도된 출력(output)를 전달하는 역할을 합니다.
  • 그렇다면, 하나씩 살펴보겠습니다.sum 함수는 리스트, 튜플등을 입력으로 전달하면 전체 아이템의 합을 출력으로 전달하는 역할을 합니다.
  • len 함수는 리스트, 튜플등을 입력으로 전달하면 아이템의 개수를 출력으로 전달하는 역할을 합니다.
  • range 함수는 정수를 입력으로 전달하면 [0, 정수) 로 이루어진 리스트를 생성하는 역할을 합니다.
  • 그리고, 위의 함수들은 모두 python 내부에 이미 정의(구현)이 되어 있습니다.
  • 위와 같은 함수를 내장함수(built-in function)이라고 합니다.
a = [1, 2,3 ,4]
length = len(a)
print(length)

sumResult = sum(a)
print(sumResult)

4
10

함수의 정의

  • 정의 시 최초에 def 키워드 사용
  • argument 정의 (함수에 입력으로 전달하는 값을 의미, argument 또는 parameter라고 함)
  • : (콜론) -> 함수 역시 코드 블록이기 때문에 콜론(:) 필요
  • body (함수의 구현 부분, 함수 역시 코드 블록이기 때문에 들여쓰기 된 부분까지 함수의 코드블록으로 인지 함)
    • 함수를 호출한 코드 (caller)로 함수가 해당 기능을 수행하고 완료된 값(output)을 전달하기 위해 return 키워드 사용
    • 즉, return 이후에 오는 값을 caller로 전달
  • 함수의 네이밍 역시 중요
    • 즉, 어떤 기능을 하는 함수인지 이름으로 최대한 나타날 수 있게 해야함
    • e.g) get_a (x) get_student_name (o)
def add(x, y): # 함수 정의
    n = x + y
    return n

a = 2
b = 10
print(add(a, b))

12

함수의 사용(호출)

  • 함수명(파라미터1, 파라미터2, ... 파라미터n)
  • 위와 같이 정의 된 함수의 이름과 전달되는 parameter(인자)를 괄호안에 전달하여 함수를 호출
  • 함수가 호출되면 실행의 흐름이 호출자(caller)에서 함수(callee)로 변경 됨
  • 함수의 입력(인풋) 파라미터(parameter), 아규먼트(argument)라고도 함

함수 네이밍(naming)

  • 함수 이름으로부터 기능이 명시
  • 의미와 반대되거나 맞지 않는 이름은 사용금지

parameter(argument) (인자)

  • 함수에 전달되는 입력(input)
  • 입력이 필요하지 않을 수도, 1개의 입력만 있을 수도, 여러개의 입력이 존재할 수 도 있음
  • 파라미터로 int, string, float, boolm, list, dict 등등 어떤 파이썬 객체도 전달 가능
  • 심지어, 함수도 함수의 파라미터로 전달 가능
  • python의 경우, 타입 명시가 없기 때문에, 함수 생성 시, 의도된 파라미터의 타입에 맞게 입력을 전달하는 것이 중요
  • 또한 파라미터를 전달 할 때, 정의된 순서에 따라 값을 전달하는 것이 중요

Default parameter (기본 인자)

  • 함수의 파라미터에 기본값 지정 가능
  • 파라미터를 명시하지 않을 경우, 지정된 기본값으로 대체
  • 기본 파라미터의 다른 예
    • print 함수
      • sep, end, file등 여러 기본 파라미터를 가짐
def add(x, y, z=5):
    a = x + y + z
    return a
print(add(10, 2))

17

print(1, 2, 3, sep='!', end='%%%')
print(2, 3, 4)

1!2!3%%%2 3 4

Default parameter 사용 시 주의 점

  • 디폴트 파라미터 뒤에 일반 파라미터가 위치할 수 없음
  • e.g) 올바른 예def test(a, b = 1, c = 2)
  • def test(a = 1, b = 1, c = 3)
  • def test(a, b, c = 1)
  • e.g) 올바르지 않은 예def test(a = 1, b, c)
  • def test(a = 1, b = 1, c)
  • def test(a, b = 1, c)

keyword parameter (키워드 파라미터)

  • 파이썬의 경우, 파라미터에 값을 전달 할 때, 파라미터의 이름을 명시하여 전달 가능
  • 파라미터 이름을 사용하지 않을 경우, 기본적으로 순서에 맞게 전달
def test(x, y, z):
    a = x + y + z
    return a

test(x=10, y=3, z=30)

43

return (리턴)

  • 기본적으로 함수의 종료를 명시
    • return 옆에 값이나 수식이 있다면 해당 값을 호출자(caller)에게 반환(전달)
    • return 만 존재하면 None 반환
    • return이 없는 경우, 기본적으로 함수 코드 블록이 종료되면 종료로 간주. 이때도 None 반환

multiple return (복수 값 반환)

  • tuple반환을 하여 복수개의 값 리턴 가능
def add_mul(x, y):
    s = x + y
    m = x * y
    return s, m
a, b = add_mul(20, 5)
print(a, b)

23 60

variable scope (변수의 범위)

  • 변수가 참조 가능한 코드상의 범위를 명시
  • 함수내의 변수는 자신이 속한 코드 블록이 종료되면 소멸됨
  • 이렇게 특정 코드 블록에서 선언된 변수를 지역변수(local variable) 이라고 함
  • 반대로 가장 상단에서 정의되어 프로그램 종료 전까지 유지되는 변수를 전역변수(global variable)이라고 함
  • 같은 이름의 지역변수와 전역변수가 존재할 경우, 지역변수의 우선순위가 더 높음
num1 = 10
num2 = 30
def test(num1, num2):
    print(num1, num2)
    return num1 + num2

print(test(20, 40))
print(num1, num2)

20 40
60
10 30

variable length argument (가변길이 인자)

  • 전달되는 파라미터의 개수가 고정적이지 않은 경우 사용
  • e.g)
    • print 함수
    • format 함수

*args, **kwargs

*args : 파라미터를 튜플의 형태로 전달

**kwargs : 파리미터를 딕셔너리 형태로 전달(네임드 파라미터)

def test(*x):    
    for item in x:
        print(item)
    
test(10, 30, 450)

10
30
450

keyword parameter (키워드 파라미터)

  • **가 붙은 경우에는 키워드 파라미터로 인식
  • 즉 함수 호출 시, 파리미터의 이름과 값을 함께 전달 가능
  • 가변길이 함수의 대표적인 예 문자열 포맷 함수
    • 여러가지 값과 포맷을 이용하여 문자열을 정의할 수 있는 함수
    • {} placeholder를 문자열 내에 위치 시킨 후, 해당 위치에 format함수로 전달된 값으로 대체하여 문자열 생성
    • 포맷 구성은 다음 링크 참조 : https://pyformat.info/
def test2(**x):
    for key, value in x.items():
        print('key :', key, 'value :', value)
    
test2(a=1, b=2, c=3, d=4)

key : a value : 1
key : b value : 2
key : c value : 3
key : d value : 4
a = '오늘 온도 : {today_temp}도, 강수확률은 : {today_rain}%, 내일 온도 : {tomorrow_temp}도'.format(today_temp = 20, today_rain = 60, tomorrow_temp =23)
print(a)

오늘 온도 : 20도, 강수확률은 : 60%, 내일 온도 : 23도