코딩/파이썬

'23.3.7(화) 파이썬 입문 <12: functions>

ILIL_EUN 2023. 3. 7. 16:54



1. 파이썬 함수 쌩기초
 
정의 : 프로그래머가 이름을 통해서 정의 후 필요할 때마다 호출하는 것.
           즉 반복 되는 코드를 한 번 구현 후 재사용 가능한 코드의 집합

  함수 구현 : 재사용, 루틴(프로시저, 서브루틴)

 

 

2. 함수의 종류  
 2-1 매개변수가 필요한 함수
 2-2 매개변수가 필요하지 않은 함수 
 2-3 결과값을 반환하는 함수(return)
 2-4 결과값을 반환하지 않는 함수

 


# 파이썬 함수 생기초 

# 예제 1 : 매개변수가 필요하지 않은 함수

def function1(): #리턴값이 없음
  print('예제1 호출')

# 실행
function1()

# 예제 2 : 매개변수가 필요한 함수

print()

def function2(a, b): # 리턴값이 없음
  print('예제 2 호출', a,b)

#실행
function2(10,20)

# 예제3 결과값을 반환하지 않은 함수
print()

def function3(x,y):
  print('예제 3 호출', x,y)

# 실행
function3(100,200)

# 예제 4 결과값을 반환하는 함수
print()

def function4(x,y):
  return x+y

#실행
r = function4(50,100)
print('예제 4 호출: ', r)

3. 프로그래밍 분야에서 함수 사용이 중요함
 - 장점 (1) : 코드의 복잡도가 높아지는 경향을 함수 단계별로 만든다면 프로그램 흐름을 쉽게 만들 수 있음
            (2) : 코드의 재사용성이 가능함
            (3) : 코드의 안전성이 좋아짐 

# 함수의 함수식 및 lambda(람다)

# 파이썬 함수 정의 방법
# def function_name(parameter):
#             code

# 예제1

def first_func(w):
  print('hello',w)

word = 'Goodboy'

first_func(word)

print()

# 예제2
print()

def second_func(w1):
  value = 'hello , ' + str(w1)
  return value
  
x =  second_func('Goodboy2') 
print(x)

# 예제3 (다중 반환)
print()

def func_mul(x):
  y1 = x*10
  y2 = x*20
  y3 = x*30
  return y1, y2, y3

#unpacking
x,y,z = func_mul(10)
print(x,y,z)

print('>>>')

def func_mul1(x):
  y1 = x*10
  y2 = x*20
  y3 = x*30
  return (y1, y2, y3)

#packing
p = func_mul1(20)
print(type(p), p, list(p))


print('>>>')

def func_mul2(x):
  y1 = x*10
  y2 = x*20
  y3 = x*30
  return [y1, y2, y3]

#packing
p = func_mul2(30)
print(type(p), p, set(p))

print('>>>')

def func_mul4(x):
  y1 = x*10
  y2 = x*20
  y3 = x*30
  return {'v1': y1, 'v2':y2, 'v3':y3}

#packing
d = func_mul4(40)
print(type(d), d)
print(d.get('v2'), d.items(), d.keys())
## 중요
print()
# *args, **kwargs
# *args는 튜플형으로, *kwargs는 딕셔너리형으로 암기!!!!

# *args(언팩킹)... args에 어떤 가변 인자를 언팩킹하겠다
def args_func(*args): #매개변수 명 자유
  for i, v in enumerate(args): # index, value
    print('result : {}'.format(i), v)
  print('______')

args_func('lee')
args_func('lee', 'park')
args_func('lee', 'park', 'choi')

# kwargs(언팩킹)
print()

def kwargs_func(**kwargs): #매개변수 명 자유
  for v in kwargs.keys():
    print('{}'.format(v), kwargs[v]) #딕셔너리 접근할대는 get 또는 속성으로 접근할 수 있다!!
  print('-----')

kwargs_func(name1 ='lee')
kwargs_func(name1 ='lee', name2 = 'park')
kwargs_func(name1 ='lee', name2 = 'park', name3 =' choi')


# 전체 혼합
print()

def example(args_1, args_2, *args, **kwargs):
  print(args_1, args_2, args, kwargs)

example(10,20,'lee','kim','park', age1 = 10, age2= 20, age3=30)


# 중첩 함수
print()

def nested_func(num):
  def func_in_func(num):
    print(num)
  print('In func')
  func_in_func(num+100)

nested_func(100)
# 만약 func_in_finc을 호출했을 때는 오류가 뜸
# lamvbda(람다)
# 람다의 장점: 메모리 절약, 가독성 향상, 코드 간결
# 함수는 객체를 생성하고 리소스(메모리) 항당 됨
# 람다는 즉시 실행하는 함수(heap 영역에 저장) 메모리 초기화
# 남발 시 가독성 오히려 감소됨

print()

# 일반적 한수 -> 할당
def mul_func(x,y):
  return x*y

print(mul_func(50,50))

mul_func_var = mul_func
print(mul_func_var(20,50))

# 람다 함수 -> 할당
# 함수의 이름이 없음. 즉 익명이라서 변수에 담아서 쓰거나 함수의 인자로 넘길 수 있음
print()

lambda_mul_func = lambda x,y:x*y
print(lambda_mul_func(30,50))

#람다와 일반함수 혼합 사용방법
print(">>>")

def func_final(x,y,func):
  print(x*y*func(100,100))
  
func_final(10,20, lambda x,y: x*y)
func_final(10,20, mul_func_var)
func_final(10,20, lambda_mul_func)