<python> Function

jm_yoon·2020년 12월 17일
1

replit

목록 보기
3/5

함수 (Function)

함수는 일정한 작업을 수행하는 코드블럭이다.
사용하는 이유는
반복되어 계속 사용되는 코드들을 함수로 정의하여 효과적으로 사용하기 위해,
함수로 정리를 해서 코드의 가독성을 높이기 위해
사용한다.

개념적으로만 봤을때 함수는 수학의 함수와 동일하며
즉 input이 있고 output이 있는 아주 간단한 구조 이다.

함수 개념

  1. Input을 받아서
  2. 어떠한 계산 혹은 기능을 실행하고
  3. Output을 생성한다.

def() : 사용자 정의 함수

def 함수이름(parameter):
	문장1(실행할 명령)
    문장2
    ...
    문장n
    return 리턴값

def define의 영어 약자
함수이름print, input 처럼 함수의 이름을 만들어줘야 한다.
parameter 인자, 매개변수 라고도 한다. print()함수 괄호 안에 들어가 있는 문자열, 숫자, 리스트 등을 인자라고 한다.
: def()함수 정의 후 반드시 뒤에 :(콜론) 붙여야한다.
실행할 명령 함수를 실행시켰을 때 수행할 명령어이다. 반드시 들여쓰기(띄어쓰기 4칸)해야한다. :다음에 엔터하면 자동으로 들여쓰기가 된다.
return 결과값을 출력한다.

parameter와 return은 optional이다.
input parameter와 return값이 없는 함수도 있을 수 있다.

Function Parameters

함수는 input parameter를 받아서 return 값을 output으로 리턴한다.
그리고 함수를 호출할때 parameter를 함수에 건내주어서(pass) 호출 한다.

def love_you(my_name, your_name): # my_name, your_name은 parameter(매개변수)
    print(f"{my_name}loves{your_name}"
    
love_you("정우성", "아이유") # "정우성", "아이유"는 argument(전달인자)

#출력결과 
"정우성 loves 아이유"

위와같이 parameter값 순서대로 함수로 전해진다.(가장 기본적인 형태)

parameter(매개변수) : 함수와 메서드 입력 변수(Variable)명
argument(전달인자) : 함수와 메서드 입력 값(Value), 함수 호출시 전달되는 실제 값

Keyword Arguments

위의 경우처럼 순서에 맞춰서 parameter값을 전해주지 않을 수 있는 방법도 있다.
순서대신 parameter 이름으로 맞추어서 값을 전해줄 수 있다.

def love_you(my_name, your_name):
    print(f"{my_name}loves{your_name}"
    
love_you(your_name = "아이유", my_name = "정우성") 
#함수parameter순서와 argument순서는 다르지만 Keyword를 넣어서 괜찮음!

#출력결과 
"정우성 loves 아이유"

parameter 이름을 써주기 때문에 실수로 값이 바뀔 확률도 적고 가독성이 높아진다는 장점이 있다.

Mixing positional arguments and keyword arguments

순서를 맞추어서 parameter값을 전해주는 positional arguments와 keyword arguments를 혼용하여 사용하는 것도 가능하다.
다만 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다. 예를 들어, 다음 처럼 함수를 호출하면 error가 난다.

def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
   
   love_you(your_name = "아이유", "정우성") 
   #key arguments가 먼저 나와있음..이러면 안됨!
# key arguments:your_name = "아이유" , positional argument:"정우성"

> Traceback (most recent call last):
    File "python", line 1
SyntaxError: positional argument follows keyword argument

error가 나는 이유?

positional arguments 순서가 함수 선언문 순서와 다를 경우, 호출 시 실행문 print (f “{my_name} loves {your_name}”) 의 순서대로 변수의 바인딩, 선언 및 메모리 할당이 이루어지는 과정에서, {my_name}은 전역 범위에서 동일한 함수명을 가진 함수 선언문의 매개변수 my_name을 참조하려 하지만, 여기에는 바인딩 된 자료형을 찾을 수 없다. 왜냐하면 함수 호출문의 argument에서 선언문 매개변수 순서를 따라 my_name을 찾으려 하면 그 자리에 your_name=”아이유” 변수 정의문이 있기 때문이다.

Parameter Default Value

함수의 parameter에 default값을 정의해 줄 수도 있다.
default값이 정의된 parameter함수는 호출될 때 값을 정의하지 않아도 된다.

def love_you(my_name, your_name="아이유"): #default 값 정의X, 정의O -> OK
    print(f"{my_name}loves{your_name}"
    
love_you("정우성") #함수 호출 시 두번째 값을 정의하지 않음

#출력결과 "정우성 loves 아이유" # 함수를 호출할 때 2번째 parameter를 정의하지 않았으나 default값이 정의되어 있으므로 default값이 자동으로 사용된다.

love_you("정우성")만 호출 시 실행문이 정상으로 출력되는 이유?

호출문 내부의 실행문 print (f “{my_name} loves {your_name}”)에서 {my_name}은 전역범위에서 동일한 함수명을 가진 함수 선언문 매개변수 my_name을 거쳐 호출문의 인수 “정우성”을 지칭하고, 문자열을 바인딩한다. 한편, {your_name}은 전역범위에서 동일한 함수명을 가진 함수 선언문 내부에서 ”아이유”로 정의된 변수 your_name을 참조(“아이유” 문자열 data 위치가 아닌 매개변수 your_name의 위치를 참조)한다.
따라서 출력 결과는 "정우성 loves 아이유"로 정상이다.

다만, default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다. 만일 default value parameter를 non-default value parameter 앞에 선언하면 syntax error가 발생한다.

def love_you(my_name = "정우성", your_name): #default 값 정의O, 정의X -> NO
    print(f"{my_name} loves {your_name}")
    
love_you("정우성")
   
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

왜? default value parameter를 non-default value parameter 앞에 정의 하면 안될까?

love_you(“정우성”)으로 호출 시 실행문의 {my_name}은 함수 선언문 내부에서 문자열 “정우성”으로 정의된 매개변수 my_name을 참조하여 가져오지만, {your name}은 선언문 내부에서도, 어디에서도 정의되지 않았기 때문에 바인딩할 자료형을 찾을 수 없기 때문이다.

Assignment

args(=arguments)는 정해지지 않은 수의 (일반)피라미터를 받는다. 가변인수
kwargs(=keyword arguments)는 정해지지 않은 수의 키워드 피라미터를 받는다. 가변키워드인수
[args? kwargs?]

1. 위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치를 참고 자료를 통해 조사해서 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과를 정리해보기

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)


func_param_with_var_args("정우성", "01012341234", "seoul", 20)

<Error 내용>

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

에러를 해석해보면 함수의 'age'parameter(매개변수)에 필요한 arg(인자)가 없다는 뜻이다.

이 오류는 *args때문에 발생했다.
여러개의 arguments를 받아 튜플형태로 리턴해주기 때문에 호출할 때 받은 arg중 args를 포함한 그 뒤에 있는 인자는 모두 args에서 할당되기 때문에 age가 할당되지 않은 것이다.

오류를 수정하기 위해서는 두가지 방법이 있다.
1. 기존의(name, args, age)순서를 (name, age, args)로 바꿔준다.
2. args, kargs위치에 따라 'age'에 keyword argument를 지정해준다.

<1번 오류수정>

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", 20)
#출력결과
#name=정우성
#args=('seoul', 20)
#age=01012341234 #왜 age에 폰번호가..? arg순서를 바꾸면..?

<1-1번 수정>

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", 20, "01012341234", "seoul") #함수 parameter순서따라 바꿈
#출력결과
#name=정우성
#args=('01012341234', 'seoul')
#age=20 # 해결!

<2번 오류수정>

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", age=20)
#출력결과
# name=정우성
# args=('01012341234', 'seoul')
# age=20

2. 가변 키워드 인수 (variable length keyword arguments)의 위치를 다음 참고 자료를 통해 조사해서 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과를 정리해보기

def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

<Error 내용>

def func_param_with_kwargs(name, age, **kwargs, address=0):
SyntaxError: invalid syntax

"SyntaxError: invalid syntax" 문법이 잘못됐다는 오류...!

이 오류는 **kwargs때문에 발생했다.

함수 parameter순서는 position(위치인수)이 먼저 위치하고 그다음 keyword, args(가변인수) 마지막으로 kwargs(가변키워드인수)순서이다.

따라서 오류를 수정하기위해서는 (name, age, **kwargs, address=0)순서를 (name, age, address=0, **kwargs,)로 바꿔 주면된다.

<오류수정>

def func_param_with_kwargs(name, age, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
#출력결과
# name=정우성
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

3.위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치를 다음 참고 자료를 통해 조사해서 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과를 정리해보기

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

<ERROR 내용>

def mixed_params(name="아이유", *args, age, **kwargs, address):
SyntaxError: invalid syntax

위 문제와 같은 오류이다. 역시 문법이 잘못됐는다는 것!
인수 순서를 바꿔준다.
기존의 (name="아이유", *args, age, **kwargs, address)에서 (age, address, name="아이유", *args, **kwargs)로 바꿔주면 될 것같지만 'adress'에 key arg 줬기 때문에 kwargs에 해당한다.

따라서 순서는 (age, name="아이유", *args, address, **kwargs)로 해준다.

<오류수정>

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

#출력결과
# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

왜? name이 아이유가 아닌 정우성이지?
mixed_params에 '정우성'이라는 요소가 있기 때문에 함수의 가장 기본적인 형태로 순서대로 값이 parameter로 전해졌다.

'아이유'로 출력되기 위해서는 즉, name의 defalt값을 이용하기 위해서는 name위치를 바꿔줘야한다.
(age, name="아이유", *args, address, **kwargs)에서 (age, *args, name="아이유", address, **kwargs)으로 바꿔주면된다.

#출력결과

name=아이유
args=('정우성', '01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

default값으로 '아이유'를 넘겨 받았기 때문에 arg에 '정우성'이 포함된다.

profile
Hello!

0개의 댓글