-
[파이썬]07. 함수파이썬 2022. 3. 29. 14:05
[파이썬]07. 함수
1. 함수 기본
2. 변수의 유효범위
3. 함수 심화
4. 제너레이터와 yield
===============================
[파이썬]07. 함수
1. 함수 기본
(1) 함수 개념
- 특정 값X를 인자로 받고, 결과값을 반환 : Y = f(X)
- 함수가 필요할 때마다 호출 가능
- 논리적인 단위로 분할 가능
- 코드의 캡슐화(capsulation)
- 중복되는 소스코드를 최소화
- 소스코드의 재사용성을 높임
(2) 함수 선언
- 함수 선언문법
def 함수명(매개변수): <수행문> return <반환값>
- def : 정의definition의 줄임으로 사용
- 함수명 : 사용자가 임의로 지정
- 함수명 컨벤션(convention)
º 짧고 명료한 이름
º 소문자로 입력
º 띄어쓰기는 '_'기호 사용(hell_world)
º 동사와 명사를 함께 사용(fine_name)
- 매개변수(parameter) : 함수에서 입력값으로 사용하는 변수
- 반환값 : 함수에서 반환할 결과값 지정
(3) 매개변수와 반환값이 없는 함수
- 함수에 매개변수와 반환값이 없이 사용 가능
- 함수를 호출하면 함수의 수행문이 실행
def hello(): print('Hello Python') hello()
(4) 매개변수만 있는 함수
- 문자열 매개변수를 사용한 함수
def hello(string): print('Hello', string) hello('world')
(5) 반환값만 있는 함수
- 문자열 반환값을 사용한 함수
def hello(): return "Hello Python" hello()
(6) 매개변수와 반환값이 있는 함수
- 정수형 매개변수와 반환값을 사용한 함수
def square(num): return num * num square(5)
(7) 매개변수가 여러 개 있는 함수
- 정수형 매개변수 여러 개를 사용한 함수
- 매개변수를 지정하여 호출 가능
def add(n1, n2): return n1 + n2 print(add(5,8)) print(add(n2=5,n1=8))
(8) 키워드 매개변수
- 함수의 매개변수를 변수명을 지정하여 호출 가능
def add(n1, n2): return n1 + n2 print(add(n2=5,n1=8))
(9) 가변 매개변수
- 매개변수가 몇 개인지 알 수 없을 때 사용
- 매개변수 앞에 '*'을 표시
def sum(*args): result = 0 for i in args: result += i return result print(sum(1,2,3)) print(sum(1,2,3,4,5))
def sum(*args): result = 0 print(type(args)) for i in args: print(i) print(sum(1,2,3)) print(sum(1,2,3,4,5))
(10) 가변 키워드 매개변수
- 매개변수의 이름을 따로 지정하지 않고 사용
- 매개변수 앞에 '**'을 표시
def print_kwargs(**kwargs): print(type(kwargs)) print(kwargs) print_kwargs(n1 = 5, n2 =8) print_kwargs(id = 'Python', pw = '1234')
(11) 초기값 매개변수
- 매개변수에 초기값을 설정하여 사용
- 함수에 매개변수를 사용하지 않을 때 초기값을 사용
def power(b = 2, n = 2): return pow(b, n) print(power()) print(power(3)) print(power(5, 3)) print(power(n = 3))
(12) 여러 반환값이 있는 함수
- 함수의 반환값은 하나
- 여러 반환값을 사용할 경우 튜플 형태로 반환
def plus_and_minus(n1, n2): return n1 + n2, n1 - n2 result = plus_and_minus(8, 5) print(result) result1, result2 = plus_and_minus(8,5) print(result1, result2)
(13) 예제 : 계산기 함수
- 두 수에 대해서 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 함수
def calc(op, n1, n2): result = 0 if op == '+': result = n1 + n2 elif op == '-': result = n1 - n2 elif op == '*': result = n1 * n2 elif op == '/': result = n1 / n2 return result print(calc('+', 8, 5)) print(calc('*', 8, 5))
(14) 예제 : 가변 매개변수의 평균값 계산
- 가변 매개변수로 들어오는 모든 수의 평균값 계산
def avg(*args): sum = 0 for i in args: sum += i return sum / len(args) print(avg(1,2,3,4,5,6,7))
2. 변수의 유효범위
(1) 유효범위
- 변수는 유효한 범위가 존재
- 함수 안에서 선언된 변수는 함수 내부에서 유효함.
def var_scope(a): a = a + 1 a = 10 var_scope(a) print(a)
(2) 변수의 종류
- 지역변수 : 한정된 지역에서만 사용되는 변수
- 전역변수 : 프로그램 전체에서 사용되는 변수
a = 10 def func1(): a = 20 print(a) def func2(): print(a) func1() func2()
(3) 전역 변수 사용 global
- 함수 내부에서 전역 변수를 사용하기 위한 global 키워드
a = 10 def func1(): global a a = 20 print(a) def func2(): print(a) func1() func2()
3. 함수 심화
(1) 내부함수(Nested Function)
- 함수 안에 함수가 존재
- 내부함수는 외부에서 호출 불가
def func1(n1, n2): def func2(num1, num2): return num1 + num2 return func2(n1, n2) print(func1(5,8)) # print(func2(5,8)) #에러 내부함수를 호출할 수 없다.
(2) 재귀함수(Recursive Function)
- 함수가 자기 자신을 다시 부르는 함수
- count() 함수 내부에서 count()함수를 호출
- 재귀적으로 카운트 수를 출력
def count(n): if n >= 1: print(n, end=' ') count(n - 1) else: return count(10)
1) 예제 : 재귀함수를 이용한 합계
- sum()함수 내부에서 sum()함수를 호출
- 재귀적으로 합계를 계산
def sum(n): if n == 1: return 1 else: return n + sum(n - 1) print(sum(10))
2) 예제 : 팩토리얼 함수
- 팩토리얼함수factorial function는 대표적인 재귀함수
- 팩토리얼 함수 : n! = 1*2*3*....*(n-2)*(n-1)*n
def factorial(n): if n == 1: return 1 else: return n * factorial(n - 1) print(factorial(3)) print(factorial(5)) print(factorial(10))
(3) 람다 함수
1) 람다함수
- 함수를 한 줄로 간결하게 만들어 사용
def add(n1, n2): return n1 + n2 print(add(5,8)) add2 = lambda n1, n2 : n1 + n2 print(add2(5,8))
2) map()
- map() : built-in함수로 list나 dictionary와 같은 iterable한 데이터를 인자로 받아 list안의 개별 item을 함수의 인자로 전달하여 결과를 list로 형태로 반환해 주는 함수
- 람다 함수와 map()함수를 이용한 리스트 계산
li = [1,2,3,4,5] square = lambda n : n * n li = list(map(square,li)) print(li)
3) filter()
- filter()함수 : iterable한 데이터를 인자로 개별 item을 특정 조건에 해당하는 값으로만 필터링
- 람다 함수와 filter()함수를 이용한
li = list(range(10)) print(li) evens = filter(lambda n: n % 2 is 0, li) print(list(evens))
4) reduce()
- reduce()함수 : iterable한 데이터를 인자로 받아 개별 item을 축약하여 하나의 값으로 만들어 가는 과정
- 람다 함수와 reduce()함수를 이용한 리스트 계산
import functools li = list(range(10)) print(li) sum = functools .reduce(lambda x, y: x + y, li) print(sum) len = functools .reduce(lambda x, y: x + 1, li, 0) print(len) max = functools .reduce(lambda x, y: x if x > y else y, li) print(max)
4. 제너레이터와 yield
- 함수 안에서 yield를 사용하면 제너레이터
- yield : 함수를 끝내지 않고 값을 계속 반환
def gen(): yield 1 yield 2 yield 3 print(gen()) print(list(gen()))
for i in gen(): print(i)
g = gen() print(next(g)) print(next(g)) print(next(g))
예제 : 짝수만 생성하는 제너레이터
- 0 ~ n개의 숫자 중에서 짝수만 생성하는 제너레이터 함수 생성
def gen_even(n): for i in range(n): if i % 2 == 0: yield i for i in gen_even(10): print(i)
'파이썬' 카테고리의 다른 글
[파이썬]09. 모듈과 패키지 (0) 2022.03.31 [파이썬]08. 객체와 클래스 (0) 2022.03.30 [파이썬]06. 입력과 출력 (0) 2022.03.28 [파이썬]03. 문자열 (0) 2022.03.27 [파이썬]02. 변수/자료형/연산자 (0) 2022.03.27