[Basic] 함수

고보·2024년 1월 16일

1 함수

  • 내장 함수, 사용자 정의 함수 등이 있다.
  • 함수가 (((()))) 여러 겹 있을 경우 가장 안쪽부터 실행해서 바깥으로 값 반환

1-1 용어 정리

  • 함수(function): 독립적으로 설계된 프로그램 코드의 집합
  • 인자(parameter, 매개변수): 함수의 정의할 때 어떤 argument를 받을지 사용
  • 인수(argument): 함수 호출할 때 전달하는 실제 값
  • 함수 vs 메서드(method): 후자는 클래스에 포함된 함수. 객체를 통해 호출되는 클래스 내부의 기능.

1-2 함수의 생성과 호출

def 함수명(parameter1, ...):
    """
    Docstring(함수의 설명)
    """
    함수 바디
    return 반환값
  • 함수 아래는 들여쓰기로 함수의 바디라는 것을 표현한다. 들여쓰기는 space*4이다.
  • return(반환값)과 parameter(입력값) 없어도 함수가 기능할 수 있다.
  • return 값은 존재한다면 무조건 하나. 함수에 return 여러 개 있어도 가장 먼저 만나는 return으로 그 값을 반환하고 함수가 끝난다.
a = 함수명(arg1, ...)
  • 이와 같이 위의 함수를 호출할 수 있다. 함수 선언부에서 요구하는 parameter와 일치하는 argument들을 전달해야 한다.
  • pass: 전체 구조에서 함수를 만들었지만, 상세부는 만들지 않았을 때 이렇게 표시한다. 그럼 에러가 뜨지 않는다. 조건문, 반복문, 예외 처리, 클래스 등에서도 마찬가지.

1-3 parameter의 종류

  • 위치-키워드
    • default. 위치 argument, 키워드 argument 둘 다 받을 수 있다.
  • 위치 전용: (param1, /, param2): / 이전의 parameter들은 위치 전용으로 설정되어 키워드 파라미터가 안된다(param1).
  • 키워드 전용: (param1, *, param2): * 이후의 parameter들은 키워드 전용으로 설정되어 위치 파라미터가 안된다(param2).
  • 가변 위치: (*param1). 여러 개의 입력값을 받아서 튜플로 묶어서 전달.
    *list를 전달하면, 개별 인자를 튜플로, list를 전달하면 리스트 통째로
def add_many(*args):
	result = 0
    for i in args: result = result + i
    return result
  • 가변 키워드: (**kwargs). 키워드=값 형태로 여러 개를 입력해서 보내면 그게 dictionary형태로 전달되서 함수로 들어온다.
  • default parameter 선언: func(name, age = 29)처럼 미리 정함. 위치는 non-default 뒤 가장 마지막에 와야 한다.

1-4 지역변수, 전역변수, 중첩 함수

  • 지역변수(local variable): 함수 내에서 선언되어 그 함수 내에서만 유효한 변수.
  • 전역변수(global variable): 함수 밖에서 선언된 변수. 함수 안에서 사용은 가능하지만, 함수 밖까지 영향을 끼쳐 수정할 수는 없다.
num = 10
def printnum():
	num = 20
    print(num)
def print num2():
	print(num+5)
printnum()
printnum2()
print(num)

의 출력값은 아래와 같다.

20
15
10

즉, printnum() 함수 내에 num이 되지만, 이는 기존에 선언된 전역변수 num=10을 들고오는 것이 아닌, 지역변수를 새로이 할당한 것이다.
printnum2()의 경우 전역변수 num을 들고와서 +5를 더한 15가 출력되지만, 함수가 끝나고 밖으로 빠져나왔을 때 전역변수에 영향을 미칠 수는 없다.

  • 함수 안의 변수를 통해 밖으 ㅣ변수 변경하기
a = 1
def vartest():
	return a + 1

a = 1
def vartest():
	global a
    a = a + 1

위의 방법이 가장 단순한데, return으로 밖으로 값을 반환하는 거다.
다른 방법은 global 명령어다. global a를 지정하면, a 변수를 함수 밖의 a를 직접 사용하겠다는 뜻이다. => 프로그래밍에서 좋은 방법은 아니다.

  • 중첩함수(Nested FUnction): 하나의 함수 내에 다른 함수를 정의하는 것으로, 그 함수 안에서만 유효하고, 외부에서 호출할 수 없다.
def outer_function(x):
	def inner_function(y):
    	return y*2
    return inner_function(x)

1-5 Lambda

  • anonymous function(익명 함수). 호출될 때 값이 구해지는 하나의 표현식.
  • def와 lambda가 동일한 역할을 한다고 보면 된다.
  • lambda <매개변수>: <표현식>(<인수>)
    ex) (lambda x: x+10)(10)
  • 이렇게 함수 자체를 변수에 담아서 사용할 수 있다
    ex) twice = lambda x:x*2, print(twice(10))
  • 활용 예시
    • if else를 한 줄로
      <True일 때 값> if <조건식> else <False일 때 값>
      ex) 'A' if 90<score<=100 else 'B' if 80<score else'c'
    • lambda와 map() 활용
      list(map(lambda <parameter1>, <parameter2>: <표현식>, <iterable1>, <iterable2>))
      ex) list1 = list(map(len, list2)), list3 = list(map(int,list4))
    • lambda와 filter() 활용
      list(filter(lambda <parameter1>: <조건식>, <iterable>))
    • lambda와 sort, sorted 활용
      array.sort(key = lambda x: (표현식, 표현식))
      sorted(array, key = lambda x: (표현식, 표현식))
      sorted 함수의 기준을 정해서 정렬. x 그 자체가, 기본 sorted. x[0]이면 2차원에서 리스트의 [0]번째 원소를 기준으로 오름차순. abs(x-n)이면 abs(x-n)이 작은 순서로. -가 들어가면 내림차순, 역순. 표현식 2개로 적은 건, 1의 기준으로 같을 경우 2로 순서 나눔.
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글