python 함수 관련 정리
함수는 이름이 붙여진 코드 조각이고 다른 것으로부터 분리되어 있다. 함수는 입력 매개변수로 모든 타입을 여러 개 취할 수 있고 반환값으로도 모든 타입을 여러 개 반환할 수 있다.
함수를 사용하기 위해서는 정의하기와 호출하기 2가지 작업을 수행해야 한다.
함수 정의는 다음과 같고 이후 내용은 들여쓰기를 해야한다.
def 함수 이름() :
함수 이름은 변수 이름과 동일한 규칙이다. 이름의 첫 글자는 영문자나 언더스코어이고 이름은 영문자, 숫자, 언더스코어만 사용할 수 있다.
함수로 전달한 값을 인자라고 한다. 인자와 함수를 호출하면 인자의 값은 함수 내에서 해당하는 매개변수에 복사된다.
함수 인자에 대한 내용은 아래에 정리했고 나머지 사항에 대한 정리이다.
https://cbjsena.blogspot.com/2019/01/python.html
함수를 사용하기 위해서는 정의하기와 호출하기 2가지 작업을 수행해야 한다.
함수 정의는 다음과 같고 이후 내용은 들여쓰기를 해야한다.
def 함수 이름() :
함수 이름은 변수 이름과 동일한 규칙이다. 이름의 첫 글자는 영문자나 언더스코어이고 이름은 영문자, 숫자, 언더스코어만 사용할 수 있다.
함수로 전달한 값을 인자라고 한다. 인자와 함수를 호출하면 인자의 값은 함수 내에서 해당하는 매개변수에 복사된다.
함수 인자에 대한 내용은 아래에 정리했고 나머지 사항에 대한 정리이다.
https://cbjsena.blogspot.com/2019/01/python.html
1. docstring
함수 몸체 시작 부분에 문자열을 포함시켜 함수 정의에 문서를 붙일 수 있다.
def echo(thing): 'echo returns its input argument' print(thing) help(echo)
---------------------------------------
Help on function echo in module __main__:
echo(thing)
echo returns its input argument
'''을 이용해 는 여러 줄을 입력할 수도 있다.
서식없는 docstring을 보고 싶다면 print(함수 이름.__doc__) 를 입력하면 된다.
2. 모든 것이 가능한 함수
파이썬의 철학은 모든 것이 객체다 이다. 객체는 숫자, 문자열, 튜플, 리스트, 딕셔너리, 그리고 함수를 포함한다.
함수를 변수에 할당할 수 있고, 다른 함수에서 인자로 사용가능하며, 함수에서 이를 반환할 수 도 있다.
def answer(): print(1) def run_something(func): func() run_something(answer)
---------------------
1
run_something () 정의 시 func는 함수를 실행하는 매개변수 이다. 함수 내부에서 func 매개변수로 함수를 호출한다.
answer()를 전달하는 것이 아니라 answer를 전달했다. 파이썬에서 ()는 함수를 호출한다는 의미이다. 괄호가 없으면 함수를 다른 객체와 마찬가지로 간주한다.
answer()를 전달하면 TypeError: 'NoneType' object is not callable 에러가 발생한다.
함수를 리스트, 튜플, 셋, 딕셔너리의 요소로 사용할 수 있다. 함수는 불변하기 때문에 딕셔너리의 키로도 사용할 수 있다.
3. 내부 함수
함수 안에 또 다른 함수를 정의할 수 있다.
내부 함수는 루프나 코드 중복을 피하기 위해 사용된다.
def square(number): def inner(a): return a * a return inner(number) print(square(3))
---------------------
9
4. 클로저
내부 함수는 클러저처럼 행동할 수 있다. 클로저는 다른 함수에 의해 동적으로 생성된다. 그리고 외부 함수로부터 생성된 변수값을 변경하고 저장할 수 있다.
def square2(number): def inner2(): return number * number return inner2 print(square2(3))
print(square2(3)())
---------------------
<function square2.<locals>.inner at 0x00000000029270D0>
9
innser2() 함수는 number 변수를 알고 있다. retunr inner2 라인은 (호출되지 않은) inner2 함수의 특별한 복사본을 반환한다. 이것이 외부 함수에 의해 동적으로 생성되고, 그 함수의 변수값을 알고 있는 함수인 클로저다.
5. 익명 함수: lambda()
람다 함수는 단일문으로 표현되는 익명 함수다.
days = ['Mon', 'Tue', 'Wed','Sun'] def print_days(days, func): for day in days: print(func(day)) def cap(day): return day.capitalize() + '!'print_days(days, cap)
---------------------------
Mon!
Tue!
Wed!
Sun!
람다를 사용해서 간단하게 바꿀 수 있다.
days = ['Mon', 'Tue', 'Wed','Sun'] def print_days(days, func): for day in days: print(func(day))print_days(days, lambda day : day.capitalize() + '!')
---------------------------
Mon!
Tue!
Wed!
Sun!
람다의 콜론과 닫는 괄호 사이가 함수의 정의 부분이다.
람다는 많은 작은 함수를 정의하고 이들을 호출해서 얻는 모든 결과값을 저장해야하는 경우 유용하다.
6. 제너레이터
파이썬에서 시퀀스를 생성하는 객체이다. 이터레이터에 대한 데이터 소스로 자주 사용된다.
for 문에서 제너레이터 중 하나인 range() 함수를 자주 사용한다.
제너레이터를 순회할 때마다 마지막으로 호출된 항목을 기억하고 다음 값을 반환한다. 일반 함수는 이전 호출에 대한 메모리가 없이 항상 똑같은 상태로 첫 번째 라인부터 수행한다.
다른 함수와 동일하고 yield 문으로 값을 반환하면 제너레이터 함수를 생성할 수 있다.
def my_range(first = 0, last = 10, step = 1): number = first while number < last: yield number number += step
print(my_range)
print(my_range())
-----------------------------
<function my_range at 0x0000000002917048>
<generator object my_range at 0x00000000025807D8>
7. 데커레이터
소스 코드를 수정하지 않고 함수를 수정하고 싶을 때가 있다. 예를 들어 함수에 전달된 인자를 보기 위해 디버깅 문을 추가하는 것이다.
데커레이터는 하나의 함수를 취해서 또 다른 함수를 반환하는 함수이다.
* 함수의 이름과 인자값을 출력
* 인자로 함수를 실행
* 결과 값을 출력
* 수정된 함수를 사용할 수 있도록 반환
추후 다시 정리
종료.
댓글
댓글 쓰기