Python - Function

Jin·2021년 7월 13일
0

Python

목록 보기
3/6
post-thumbnail

함수

a, b = 2,3
c = a+b

print("내장 함수 str.format()print()를 이용한 c의결 과 출력 : {}.format(c))

함수의 선언

def 함수명(매개변수)

명령문1
명령문2
return문

인터프린터 언어로 함수의 위치가 중요. 위에서부터 하나씩.

def calc_sum(x,y):  # 매개변수에 인자값 전달
	return x +y     # calc_sum() 함수를 호출한 위치에 반환 값이 전달됨
    
a, b = 2,3
c = calc_sum(a,b)  # 반환값 5가 c에 저장
d = calc_sum(a,c)  # 반환값 7이 변수 d에 저장

print("사용자 정의 함수 calc_sum() 호출을 이용한 c의 결과 : {0}".format(c))
print("사용자 정의 함수 calc_sum() 호출을 이용한 d의 결과 : {0}".format(d))

calc_sum() : 두 개의 값을 전달 받아 합을 구하는 사용자 정의 함수.

매개변수와 반환 값이 있는 함수

def func_parameters_return(x,y,z):
	print("매개변수로 전달된 값은 {}, {}, {} 입니다.".format(x,y,z))
    print("매개변수와 반환값이 있는 함수입니다.")
    return "Hello, Python"
     # func_parameters_return() 함수를 호출한 위치에 반환 값으로 전달
     
ret_val = func_parameters_return(1,2,3)
print("func_parameters_return() 함수가 반환한 값: {}".format(ret_val))

# 매개변수로 전달된 값은 1,2,3 입니다
# 매개변수와 반환값이 있는 함수입니다.
# func_parameters_return() 함수가 반환한 값: Hello, Python!

매개변수는 없고, 반환 값이 있는 함수

def func_noparameters_return():  #매개 변수가 없어 괄호만 입력
	print("매개변수가 없는 함수입니다")  #문자열 출력
    return "Hello, Python" 
    #func_noparameters_return() 함수를 호출한 위치에 반환 값으로 전달
ret_val = func_noparameters_return()
print("func_noparameters_return() 함수가 반환한 값 : {}".format(ret_val))

[Result]
매개변수가 없는 함수입니다.
func_noparameters_return() 함수가 반환한 값 : Hello, Python!

매개변수는 있고 반환 값이 없는 함수

def func_noparmaeters_noreturn(x,y,z):
	print("매개변수로 전달된 값은 {} {] {} 입니다". format(x,y,z)
    print("반환값이 없는 함수입니다")

func_noparameters_noreturn(1,2,3)

Result]
매개변수로 전달된 값은 1 2 3 입니다.
반환값이 없는 함수입니다

매개변수와 반환 값이 없는 함수

def func_noparameters_noreturn():
	print("매개변수와 반환값이 없는 함수입니다.")

func_noparameters_noreturn()

[Result]
매개변수와 반환값이 없는 함수입니다.
언팩 연산자
매개변수의 개수를 가변적으로 사용할 수 있또록 언팩 연산자(*) 제공
매개변수에 적용 시 인자를 튜플 형식으로 처리
가변형 매개변수를 가장 마지막 매개변수로 지정해야 부작용 없이 사용 가능
def calc_sum(*params):  # 매개변수에 인자 값들이 튜플 형식으로 전달
	total = 0
    for val in params:
    	total += val
    return total
    
ret_val = calc_sum(1,2) # 1,2가 인자로 전달되아 for문이 두 번 반복
print('cacl_sum(1,2) 함수가 반환한 값: {}".format(ret_val))
# cacl_sum(1,2) 함수가 반환한 값 : 3

ret_val = calc_sum(1,2,3)
print('cacl_sum(1,2,3) 함수가 반환한 값: {}".format(ret_val))
# cacl_sum(1,2,3) 함수가 반환한 값 : 6

ret_val = calc_sum(1,2,3,4)
print('cacl_sum(1,2,3,4) 함수가 반환한 값: {}".format(ret_val))
# # cacl_sum(1,2) 함수가 반환한 값 : 10

명시적 매개변수와 가변 매개변수의 혼합 사용

def calc_sum(precision, *params):
	if precision ==0:
    	total = 0 
    elif 0 < precision <1:
    	total = 0.0
    for val in params:
    	total +=val
    return total

ret_val  calc_sum(0,1,2)  
print("calc_sum(0,1,2) 함수가 반환한 값:{}".format(ret_val))
# calc_sum(0,1,2) 함수가 반환한 값:3

ret_val  calc_sum(0.1,1,2)
print("calc_sum(0.1,1,2) 함수가 반환한 값:{}".format(ret_val))
# calc_sum(0,1,2) 함수가 반환한 값:3.0

키워드 언팩 연산자(**)

  • 매개변수의 개수를 가변적으로 사용할 수 있도록 함
  • 키워드 인자들을 전달해 매개변수를 딕셔너리 형식으로 처리함
  • 키1 = 값1, 키2=값2
def use_keyword_arg_unpacking(**params):
	for k in params.keys():
    	print("{}: {}".format(k, params[k]))"

print("use_keyword_arg_unpacking()의 호출")
use_keyword_arg_unpacking(a=1,b=2,c=3)

[Result]
use_keyword_arg_unpacking()의 호출
a:1
b:2
c:3

기본 값을 갖는 매개변수

def calc(x,y,operator="+"): #operator에 전달할 인자를 생략하면 "+"가 기본 인자로 사용됨
	if operator == "+"
    	return x+y
    else:
    	return x-y
ret_val = calc(10,5, "+")
print(re_val)
# 15

scope 변수의 유효범위

  • 전역 스코프 : 어디서나 접근 가능한 전역 변수
  • 함수 스코프 : 함수 내에서만 접근 가능한 지역 변수
  • 함수 스코프 내에서 가장 먼저 변수를 찾고 함수 스코프 내에 변수가 없을 경우 전역 스코프에서 변수를 찾음
  • 지역변수와 전역변수 이름이 같을경우! 전역변수가 가려져 접근 못할 수 있음
def test_scope(a):
	result = a +1
    print("\n\ttest_scope()안에서의 a의 값 : {}".format(a))
    print("\ttest_scope() 안에서의 result의 값 : {}\n" .format(result))
    return result
x = 5
print("test_scope() 호출 전 x의 값: {}".format(x)
ret_val = test_scope(x) # 전역변수 x의 값: 매개변수 a의 인자로 전달, 지역변수 result에 6저장
print("test_scope() 함수가 반환한 값: {}".format(ret_val))
print("test_scope() 호출 후 x의 값: {}".format(x))

함수내에서 global 변수에 접근하기

def change_global_var():
	global x
   	x+=1

x=5
change_global_Var() #변수 x의 값 5가 전역변수 x의 값으로 변경
prnit("전역변수 x의 값: {}".format(x))

[Reuslt]
전역 변수 x의 값 : 6 

중첩함수

  • 함수내에 중첩함수를 선언해 사용 가능
  • 중첩함수를 포함하는 함수 내에서만 호출이 가능함
  • 중첩함수를 포함하는 함수의 스코프에도 접근이 가능함
  • 함수 내에서 직접 선언해 호출할 수도 있고, 함수의 매개변수로 함수 인자를 전달 받아 함수 내에서 호출해서 사용 가능
def calc(operator_fn,x,y):
	return operator_fn(x,y)

def plus(op1, op2):
	return op1+op2

def minus(op1, op2):
	return op1-op2

ret_val = calc(plus, 10, 5)
print("calc(plus, 10, 5)의 결과 값: {}".format(ret_val))
# calc(plus, 10, 5)의 결과 값: 15

ret_val = calc(minus,10,5)
print("calc(minus, 10, 5)의 결과 값: {}".format(ret_val))
# calc(minus, 10, 5)의 결과 값: 5

람다식

  • Lambda 매개변수 :반환값
  • 변수에 저장해 재사용이 가능한 함수처럼 사용함
  • 기존의 함수처럼 매개변수의 인자로 전달함
  • 함수의 매개변수에 직접 인자로 전달함
def calc(operator_fn,x,y):
	return operator_fn(x,y)
    
ret_val = calc(lambda a, b: a+b, 10, 5)
print("calc(lambda a, b : a+b, 10, 5)의 결과 값: {}".format(ret_val))

ret_val = calc(lambda a, b: a-b, 10, 5)
print("calc(lambda a, b : a-b, 10, 5)의 결과 값: {}".format(ret_val))

클로저

  • 중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근 가능
  • 중첩함수 자체를 반환값으로 사용한다면?
    정보 은닉 구현 가능
    전역변수의 남용 방지
    메서드가 하나밖에 없는 객체를 만드는 것보다 우아한 구현 가능
def outer_func():
	id=0 # 지역변수

	def inner_func():
   		nonlocal id # 변수 id가 중첩함수인 inner_func 함수의 지역변수가 아님
       # 변수 id 접근 시 outer_func 함수 스코프에서 찾게 만듬
       		id += 1
       		return id
   return inner_func
   
make_id = outer_func()
   	
       

profile
내가 다시 볼려고 작성하는 블로그

0개의 댓글