Python
20210107_ Python 입문5, 함수,*args,**kwargs, parameter hint, lambda
Python 입문 05, 함수,args,*kwargs, parameter hint, lambda
Python 함수 정의 및 lambda(람다) 사용
1. 함수
반복적, 중복 프로그래밍을 피할수 있음
1) 함수 정의(선언) 방법
- 구조
def 함수명(매개변수parameter):
code
- 리턴값이 없는 함수
def hello(world):
print("hello", world)
hello("python!")
# world 만 붙여 출력만 하는 함수라서 값이 지정 되어 있지 않아 type()로 데이터 형식 확인 안됨
- 리턴값이 있는 함수
def hello_return(world):
v = "hello" + str(world)
return v
print(hello_return("python!!!"))
print(type(hello_return("python!!!")))
# 리턴 값이 할당이 되어서 type()로 데이터 형식 확인 가능
- 다중 리턴 함수
여러 리턴값들을 가지는 함수
def func_mul(x):
y1 = x * 100
y2 = x * 200
y3 = x * 300
return y1, y2, y3
# parmeter x하나 넣으면 리턴 3개 값이 나옴
val1, val2, val3 = func_mul(100)
# 변수 3개에 한개의 라인으로 선언
print(type(val1), val1, val2, val3)
# type() 확인하면 그대로 int 나옴
- 다중 리턴 함수 + 데이터 타입 반환
다중 리턴 함수에서 리턴 값들을 다른 타입의 데이터로 반환하게 하는 것
# list 형 (for반복문 연계)
def func_mu2(x):
y1 = x * 100
y2 = x * 200
y3 = x * 300
return [y1, y2, y3] # [ ] 사용
# tuple 형 (for반복문 연계)
def func_mu3(x):
y1 = x * 100
y2 = x * 200
y3 = x * 300
return (y1, y2, y3) # ( ) 사용
2) *args (arguments), **kwargs(keyword arguments) 사용
기본 매개변수(parameter)가 필수 사항이면 args, *kwargs 는 선택사항으로 두고 매개변수(parameter)가 몇개 올지 모르는 상황에서 사용
단, args 는 리턴 시키거나, print 전까진 tuple 형태, *kwargs는 dict 형태로 리턴 됨, 그리고 그냥 print()형태 함수로 하면 표현은 tuple, dict 형태로 나오는데 type은 none type임
- *args 기본 구조
def args_func(*args):
print(type(args))
args_func('kim')
# 선언만 되어도 기본 튜플 타입
def args_func(*args):
return args
print(type(args_func('kim')))
# 리턴 해도 기본 튜플 타입
def args_func(*args):
print(args)
args_func('kim')
print(type(args_func('kim'))
# 출력은 튜플 형태로 보이나, 출력자체는 none type
- **kwargs 기본 구조
def kwargs_func(**kwargs):
print(kwargs)
kwargs_func(name1="kim", name2="park", name3="lee")
# dict 형태로 출력
- *args, **kwargs + for 문 활용
def args_func(*args):
for t in args:
print(t)
args_func('kim', 'Park', 'Lee')
# 차례 대로 kim , park , lee 출력
def kwargs_func1(**kwargs):
for i, v in kwargs.items():
print(i, v)
kwargs_func1(name1="kim", name2="park", name3="lee")
# dict형태로 만들어진 key - value 묶음으로 차례대로 출력
3) enumerate 함수 활용
입력으로 받은 데이터(순서있는 데이터 : str,tuple,list )를 인덱스 값을 포함하는 enumerate 객체로 리턴
enumerate 객체 : (인덱스 , 값)
- 구조
def args_func(*args):
for i, v in enumerate(args): # 인덱스 뽑는 거니까 i, v 두개
print(i, v)
args_func('kim', 'Park', 'Lee')
# 출력 : 0 Kim , 1 Park , 2 Lee 차례대로 하나씩
- enumerate + range 활용
def args_func(*args):
for i, v in enumerate(range(10)):
print(i, v)
args_func('kim')
# 뭘 넣든 그냥 0~9 인덱스 와 0~9 값이 묶여 객체로 리턴
4) 중첩함수(클로저)
클로저 형태로 하면 변수의 선언 줄이고 메모리 관리 효율적
def func(num):
def func_in_func(num): # 1. 내부 함수 선언만 한 상태
print(">>>", num) # 4. 내부 함수에 들어온 20000을 넣어 출력
print("in func") # 2. 외부 함수에 값 들어오고 in func 출력
func_in_func(num + 10000) # 3. 내부 함수에 외부함수에 넣은 값을 +10000 해서 넣고
func(10000) # 20000
5) Parameter Hint (파라미터 힌트)
-
ctrl + shift + space
: 힌트 보기 -
구조
def func_mul(x : int) -> list: # 명시적으로 입력값 int -> 출력값 list 라고 알려 줄 수 있다.
y1 = x * 100
return [y1]
print(func_mul(5))
2. lambda 식 (람다 식)
메모리 절약, 가독성 향상, 코드 간결
-
함수의 객체 생성(선언만 하더라도 print, type에서 확인 가능) -> 메모리 할당
-
람다 즉시 실행 -> 메모리 초기화
1) 구조
lambda_1 = lambda num: num * 10
# lambda num 부분이 입력 부분이고 : num * 10 이 출력 부분
print(lambda_mul_10(10))
# 단순히 코드의 길이를 줄이는게 아니고 빠르게 처리하는데 의미가 있음
print(type(lambda_mul_10(10)))
# type 확인해 보면 int로 바로 가져옴 중간에 함수 fuction으로 메모리 할당 없이 가능
- 매개변수를 함수, lambda로 받는 경우
def func_final(x, y, func): # 매개변수(파라미터)로 함수를 받을 수도 있음
print(x * y * func(10))
func_final(10, 10, lambda_mul_10) # 기존의 함수에 10이 들어가서 현재 함수에서 계산됨
print(func_final(10, 10, lambda x : x * 1000))
# 그런데 그냥 람다 형식도 된다.함수 선언 없이 빠르고 메모리 할당도 없이 좋다.
하루평
: 눈이 엄청 왔다. 런닝은 포기하고 홈트레이닝으로 해야 할듯하다. 강의는 class도 들었는데 여기서 부터 조금 개념 이해가 조금 힘들어지긴 하는데 구글링, 유튜브로 해결하고 있다. 클래스는 여기 글에 올리기에는 좀 그래서 내일 글에 올릴 예정이다.
'Python' 카테고리의 다른 글
20210109_ Python 입문7, txt파일 읽기 쓰기, 에러 예외 처리 (0) | 2021.01.09 |
---|---|
20210108_ Python 입문6, 클래스(class), 클래스의 상속, 모듈(module)과 패키지(pakage) (0) | 2021.01.09 |
20210106_Python 입문4, 흐름제어 조건문, 반복문, List comprehension(리스트 컴프리핸션) (0) | 2021.01.07 |
20210105_Python 입문3, 자료구조, list, tuple, dict, set (0) | 2021.01.06 |
20210104_Python 입문2, 가상환경 설정, pip, 데이터 형태, 문자,숫자 함수 등 (0) | 2021.01.05 |