- 코드 재사용과 조직화하기 위한 수단
- 파이썬 명령들의 집합에 이름을 지어 가독성 좋은 코드 작성할 수 있도록 함
- def 예약어로 정의, return 예약어를 사용해 값 반환
def my_function(x, y):
if x > y:
return x
else:
return y
- return 문은 여러 개 와도 상관 X / 없다면 None이 반환
- 함수는 여러 개의 일반 인자와 키워드 인자를 받을 수 있음
- 키워드 인자는 기본값 또는 부수적인 인자를 지정하기 위해 사용됨
- 항상 일반 인자 다음으로 와야 함
- 키워드 인자끼리는 순서 상관 X 이름만 기억
네임스페이스, 스코프, 지역 함수
- 함수는 전역과 지역, 두 가지 스코프(영역)에서 변수를 참조함
- 변수의 스코프를 설명하는 다른 용어: 네임스페이스
- 함수 내에서 선언된 변수는 기본적으로 지역 네임스페이스에 속함
- 지역 네임스페이스는 함수 호출 시 생성, 함수의 인자를 통해 즉시 생성됨
- 함수 실행이 끝나면 지역 네임스페이스는 사라짐
- 함수 스코프 밖에서 변수에 값 대입하려면
global
예약어를 이용해 전역 변수로 선언해야 함
여러 값 반환
- 파이썬은 하나의 함수에서 여러 개의 값을 반환할 수 있음
함수도 객체
- 파이썬에서는 함수도 객체이므로 다른 언어와 달리 객체 생성을 쉽게 표현할 수 있음
- 문자 데이터를 분석하려면 문자열 리스트를 정형화해야 함
- ex) 공백 제거, 불필요한 문장부호 제거, 대소문자 맞추기 등등
- 내장 문자열 라이브러리와 정규 표현식을 위한
re
표준 라이브러리로 가능
익명 함수
- 파이썬은 익명 함수 혹은 람다 함수라고 하는, 값을 반환하는 단순한 한 문장으로 이루어진 함수를 지원함
lambda
예약어로 정의함. // '익명 함수를 선언한다'는 뜻
- 람다 함수를 사용하면 실제 함수를 선언하거나 람다 함수를 지역 변수에 대입하는 것보다 코드를 적게 쓰고 더 간결하게 쓸 수 있음
커링: 일부 인자만 취하기
- 커링은 일부 인자만 취하는 새로운 함수를 만드는 기법
def add_numbers(x, y):
return x + y
- 이 함수를 하나의 변수만 인자로 받아 5를 더해주는 새로운 함수로 변경
add_five = lambda y : add_numbers(5, y)
- 내장 functions 모듈의 partial 함수를 이용하면 이 과정을 단순화할 수 있음
제네레이터
- 파이썬은 리스트 내의 객체나 파일의 각 로우 등 순차적인 자료를 순회하는 일관적인 방법을 제공
- 이터레이터 프로토콜을 이용해 순회 가능한 객체 생성 가능
- 이터레이터는 for문 같은 컨텍스트에서 사용될 경우 객체를 반환
- 리스트나 리스트와 유사한 객체를 취하는 대부분 메서드는 순회 가능한 객체도 허용함
- min, max, sum 같은 내장 메서드, list, tuple 같은 자료구조를 생성하는 메서드 포함
- 제네레이터는 순회 가능한 객체를 생성하는 간단한 방법
- 일반 함수는 실행되면 단일 값을 반환하지만, 제네레이터는 순차적인 값을 매 요청 시마다 하나씩 반환
- 제네레이터 생성은 return 대신
yield
예약어를 사용함
- 제네레이터를 호출하더라도 즉각적으로 코드 실행 X
- 제네레이터로부터 값을 요청해야 제네레이터 코드가 실행됨
제네레이터 표현식
- 제네레이터를 생성하는 더 간단한 방법
- 리스트에서 대괄호를 사용하듯, 괄호를 사용하면 제네레이터 생성 가능
gen = (x ** 2 for x in range(100))
위 코드와 동일한 코드
def _make_gen():
for x in range(100):
yield x ** 2
gen = _make_gen()
- 제네레이터 표현식은 리스트 표현식을 인자로 받는 어떤 파이썬 함수에서도 사용 가능함
- 일반 데이터 알고리즘을 위한 많은 제네레이터를 포함
- groupby는 순차 자료구조와 함수를 인자로 받아, 인자로 받은 함수에서 반환하는 값에 따라 이름을 지어 줌
함수 | 설명 |
---|
combinations(iterable, k) | iterable에서 순서를 고려하지 않고 길이가 k인 가능한 모든 조합을 생성 |
permutations(iterable, k) | iterable에서 순서를 고려해 길이가 k인 모든 조합을 생성 |
groupby(iterable[, keyfunc]) | iterable에서 각각의 고유한 키에 따라 그룹을 생성 |
product(*iterables, repeat=1) | iterable에서 카테시안 곱을 구함. 중첩 for문 사용과 유사 |
에러와 예외 처리
- 견고한 프로그램 작성하기 위해 예외 처리가 필수
- try/except 블록을 사용하면 개선된 함수를 작성할 수 있음
float('1.2345')
>>> 1.2345
float('somthing')
>>> ValueError ...
위와 같은 오류를 방지하려면
def attempt_float():
try:
return float(x):
except ValueError:
return x
와 같이 try/except 블록을 사용해 float 함수를 호출하면 됨 // except 블록의 코드는 float(x)가 예외를 발생했을 때 실행
IPython에서 예외 처리
%run
을 이용해 코드를 실행시키던 중에 예외가 발생하면 IPython은 기본적으로 전체 트레이스백을 출력하고, 해당 위치 주변의 코드를 보여 줌
%xmode
매직 명령어를 이용하면 Plain에서부터 함수 인잣값 등을 포함해서 보여 주는 Verbose 단계까지 직접 제어 가능