본문 바로가기

Python/중급

[Python] 일급함수

일급함수

  • 런타임 초기화 - 실행시첨에 초기화
  • 함수를 변수에 할당 가능
  • 함수를 다른함수의 인수로 전달 가능
  • 함수를 다른함수의 결과로 반환 가능
# 함수 객체

def factorial(n):
    '''Factorial Function -> n : int'''
    if n == 1 :
        return 1
    return n * factorial(n-1)

class A:
    pass

print(factorial(5))
print(factorial.__doc__), print()

print('함수의 타입과 클래스의 타입 비교')
print(type(factorial), type(A))
print(dir(factorial)), print()

print('함수만 가지고 있는 속성들(함수 - 클레스))')
print(set(sorted(dir(factorial))) - set(sorted(dir(A))))

--------------------------------------------[result]

120
Factorial Function -> n : int

함수의 타입과 클래스의 타입 비교
< class 'function' > < class 'type' >
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

함수만 가지고 있는 속성들
{'__call__', '__defaults__', '__qualname__', '__name__', '__annotations__', '__get__', '__code__', '__kwdefaults__', '__closure__', '__globals__'}

 

변수에 함수 할당

 

# 변수에 할당
var_func = factorial

print('factorial id: ', id(factorial))
print(var_func)
print('var_func id: ', id(var_func))

print(var_func(10))
print('map: ', map(var_func, range(1,6)))
print(list(map(var_func, range(1,6))))

--------------------------------------------[result]

factorial id:  2948940843616
<function factorial at 0x000002AE9A924A60>
var_func id:  2948940843616

3628800
map:  <map object at 0x000002AE99F4ED68>
[1, 2, 6, 24, 120]

 

함수 인수로 할수를 전달 및 함수의 결과로 함수 반환

 

# 함수를 결과로 반환
print([var_func(i) for i in range(1,6) if i % 2])


# 함수를 인자로 전달
print(list(map(var_func, filter(lambda x: x%2, range(1,6)))))
print(list(map(var_func, range(1,6))))

--------------------------------------------[result]

[1, 6, 120]

[1, 6, 120]
[1, 2, 6, 24, 120]

 

Reduce

 

# reduce()
from functools import reduce
from operator import add

print(reduce(add, range(1,11), 10)) # 누적, 초기값 10
print(reduce(add, range(1,11))) # 누적, 초기값 없음

# reduce 대신 sum 사용한 경우
print(sum(range(1,11)))

--------------------------------------------[result]

65

55

55

users = [
    {'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'sex': 'M', 'age': 73},
    {'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'sex': 'F', 'age': 29},
    {'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'sex': 'M', 'age': 51},
    {'mail': 'daniel79@gmail.com', 'name': 'Karen Rodriguez', 'sex': 'F', 'age': 32},
    {'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'sex': 'F', 'age': 42}
]

from functools import reduce
reduce(lambda acc, cur: acc + cur["age"], users, 0)

# 익명함수(lambda)
# 가급적 주석 작성 - 이해의 편의성을 위해서
# 가급적 함수 사용 - 간결한 경우만 사용 익명함수(lambda)
# 가급적 주석 작성 - 이해의 편의성을 위해서
# 가급적 함수 사용 - 간결한 경우만 사용
# 일반 함수 형태로 리팩토링 권장

# 람다함수 사용 예시
print(reduce(lambda x, t: x + t, range(1,11)))

# 일반 함수 형태로 리팩토링 권장
print(reduce(lambda x, t: x + t, range(1,11)))

--------------------------------------------[result]

55
55

 

Callable & signature

 

# Callable : 호출 연산자 -> 메소드 형태로 호출 가능한지 확인
# 호출 가능 확인
print(callable(str), callable(list), callable(var_func), callable(A), callable(3.14))

# signature 함수를 통해서 함수의 인자 타입을 알 수 있다.
from inspect import signature 

sg = signature(var_func)

print(sg)
print(sg.parameters)

--------------------------------------------[result]

True True True True False
(n)
OrderedDict([('n', <Parameter "n">)])

 

Partial

 

# partial 사용법 : 인수 고정 -> 콜백 함수에 사용
from operator import mul
from functools import partial

print(mul(10,10))

--------------------------------------------[result]

100
# 인수 고정
five = partial(mul, 5)

# 고정 추가
six = partial(five, 6)

print(five(10))
print(six())

# 5의 배수 표현, comprehensive & map
print([five(i) for i in range(1,11)])
print(list(map(five, range(1,11))))

--------------------------------------------[result]

50
30
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

 

'Python > 중급' 카테고리의 다른 글

[Python] Decorator  (0) 2021.05.25
[Python] Closure  (0) 2021.05.25
[Python] 고급 - Dict 및 Set(2)  (0) 2021.05.24
[Python] 고급 - Dict 및 Set(1)  (0) 2021.05.23
[Python] 고급 - 리스트 및 튜플(2)  (0) 2021.05.23