📌 Python 함수 2

  • 매개변수(Parameter)와 인자(Argument)
    - 매개변수 : 값을 받는 곳 (가인수)
    - 인자 : 값을 넘기는 곳 (실인수)


  • 매개변수 유형
    - 위치 매개변수 : 인수와 순서대로 대응
    - 기본값 매개변수 : 매개변수에 입력값이 없으면 기본값 사용
    - 키워드 매개변수 : 인수와 매개변수를 동일이름으로 대응
    - 가변 매개변수 : 인수의 갯수가 동적인 경우
def showGugu(start, end=9):
    for dan in range(start, end + 1):
        print(f'{str(dan)}단 출력')

showGugu(2, 3)  # 위치 매개변수에 대응하는 인자로 전달하기
showGugu(2)     # 기본값 매개변수를 인지하여 첫번째 인자만 전달하기
showGugu(start=2, end=3)    # 키워드 매개변수의 이름과 동일한 이름으로 인자 전달하기
showGugu(end=3, start=2)
showGugu(2, end=5)

# 2번째 인자부터 상수로 Mapping 할 때 에러 발생
# showGugu(start=2, 3)
# showGugu(end=3, 2)

# 가변 매개변수
def func1(*ar):
    for i in ar:
        print(i)

func1('비빔밥', '공기밥')
func1('비빔밥', '공기밥', '김밥')
  • 가변 매개변수 유형
    - *매개변수 : 전달된 인자를 tuple로 받는다.
    - **매개변수 : 전달된 인자를 dict로 받는다.
def func4(a, b, *c, **d):
    print(a, b)
    print(c)
    print(d)

func4(1, 2)
# 출력 : 1 2
func4(1, 2, 3)
# 출력 : 1 2 (3,)
func4(1, 2, 3, 4)
# 출력 : 1 2 (3, 4)
func4(1, 2, 3, 4, 5)
# 출력 : 1 2 (3, 4, 5)
func4(1, 2, 3, 4, 5, irum='aa', anum='aa')
# 출력 : 1 2 (3, 4, 5) {'irum': 'aa', 'anum': 'aa'}


📌 Python 클로저(Closure)

  • 클로저
    - 정의 : scope에 영향을 받지 않는 변수를 포함하고 있는 코드 블록이다.

  • 구현 방법
    1. 상위 함수 내부에 지역변수를 선언한다.
    2. 상위 함수 내부에 내부함수를 선언한다.
    3. 내부함수에서 상위 함수의 지역변수를 nonlocal로 참조한다.
    4. 상위 함수의 반환값은 내부함수의 주소이다.
    5. 상위 함수를 호출한 결과(내부함수 주소)를 변수에 저장한다.
    6. 변수를 호출하여 계속해서 지역변수의 값을 변경한다.
def outer():	# 상위 함수
    count = 0   # 상위 함수의 지역변수
    def inner():	# 내부함수 선언
        # 상위 함수의 변수를 참조하고 있기 때문에 해당 함수를 여러번 돌리면 count 값이 계속 올라간다.
        nonlocal count	# 지역변수 참조
        count += 1
        return count
    return inner    # 내부함수의 주소를 반환

inFunc = outer()    # 상위 함수는 inner() 함수를 사용하기 위한 초기화 함수로 인식
print(inFunc())     # 출력 : 1
print(inFunc())     # 출력 : 2


📌 Python 일급객체(First Class Object)

  • 일급객체
    1. 파라미터로 함수를 받는다.
    2. 상위 함수안에 내부함수를 선언한다.
    3. 상위 함수의 반환값은 함수이다.
# 인자로 전달할 함수
def func1(a, b):
    return a + b

# 일급객체 생성
def func3(func):    # 1. 파라미터로 함수를 받는다.
    def func4():    # 2. 함수안에 함수
        print('내부 함수 실행')
    func4()
    return func     # 3. 반환값이 함수

aa = func3(func1)   # func1의 주소를 갖는다.
print(aa(3, 4))


📌 Python 람다 함수

  • 람다 함수(lambda)
    - 정의 : 축약 함수, 단발성 함수, 한 줄 함수
    - 선언 형식 : lambda 인자1, 인자2, .... : 표현식
    - 호출 형식 : (lambda 인자1, 인자2, .... : 표현식)(인자1, 인자2, ....)
    - 사용 이유 : def를 사용할 정도로 복잡하지 않거나, def를 적용할 수 없는 곳에 사용하기 위함
    - 특징 : return 문 없이 결과를 반환
# 일반 함수
def Hap(x, y):
    return x + y
print(Hap(1, 2))

# 람다 함수
print((lambda x,y : x+y)(1, 2))

# 실제 사용 방법
# filter 함수에 람다 함수 적용
print(list(filter(lambda a: a<5, range(10))))
print(list(filter(lambda a: a%2, range(10))))


📌 Python decorator @

  • @ - decorator
    - meta 기능이 있다.
    - 장식자는 또 다른 함수를 감싼 함수이다. 주함수가 호출되면 그의 반환값이 장식자에게 전달된다.
    - 그러면 장식자는 포장된 함수로 교체하여 함수를 돌려 준다.
# 일반 호출 함수
def make2(func):
    return lambda: f'안녕 {func()}'

def make1(func):
    return lambda: f'반가워 {func()}'

def hello():
    return 'aa'

hi = make2(make1(hello))
print(hi())
# 출력 : 안녕 반가워 aa


# 장식자 사용
@make2
@make1
def hello2():
    return 'aa'

print(hello2())
# 출력 : 안녕 반가워 aa


📌 Python 재귀 함수 (recursive)

  • 재귀 함수
    - 정의 : 함수가 자기 자신을 호출하는 것 -> 반복 처리
print('factorial : 1부터 n까지의 양의 정수를 모두 곱한 값')
def factor(n):
    if n is 1:
        return 1
    return n * factor(n-1)	# 재귀 함수

print(factor(10))


📌 Python 모듈

  • 모듈
    - 정의 : 반복되는 동작을 하나의 큰 단위로 묶어 사용하는 것
    - 종류 : 내장 모듈, 사용자 정의 모듈, 제3자(Third Party) 모듈
# 내장 모듈
import random
print(random.randint(9, 10))


# 사용자 정의 모듈
# 같은 패키지 or 다른 패키지 or site-packages 폴더에 있는 모듈
def test():
	print('aa')

# 사용자 정의 모듈 호출
import module.myModule as m1
m1.test()


# 제3자 모듈
# 외부에서 install 해야하는 모듈
import pygame


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글