TIL Python - Function Parameters (과제1)

finelinefe·2020년 8월 21일
0

PYTHON

목록 보기
2/6

Function

일단 함수 기본 구조부터 요약하자면 아래와 같다

def 함수명(parameter)
	문장1, 2..
    
    return
    
 1) input parameter가 없을수도 있고, 리턴값이 없을수 있다
 2) return =  결과값 반환. parameter를 줘서 호출

Function Parameters

기본 구조 1 함수 파라미터(Function Parameters)

def 에 정의한 parameter 순서 == 값의 순서

기본 구조 2 (Keyword Arguments)

호출을 parameter 순서 != 값의 순서. parameter 이름과 값을 맞춰 전달.
순서가 바뀌어도 이름과 맞추어 같으므로 괜찮다(짝의 개념이라 생각했다). 가독성 증가.
파라미터 순서(1번 구조)대로 하면 값만 바뀔 경우 가독성이 떨어질 우려있음.
그것에 비해 상대적으로 값이 바뀔 확률이 상대적 적음.

기본 구조 3 (Mixing positional arguments and keyword arguments)

구조 1과 2의 혼용( positional arguments+keyword arguments).
정우성의 값은 1번(파라미터 순)구조
아이유는 파라미터:값(쌍) 인 2번(파라미터와 값의 연결)구조

하지만 아이유처럼 keyword argument의 순서는 바뀌어도 괜찮지만,
정우성처럼 1번 구조인 function parameter의 경우 순서가 바뀌면 안된다
아래는 오류의 예시. keyword argument가 순서를 따지는 function parameter인 정우성보다 앞에 나와서 오류

def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
   
   love_you(your_name = "아이유", "정우성") <-- 오류부분!

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

기본 구조 4 (Parameter Default Value)

정우성의 경우와 다르게 아이유라는 default 값을 parameter에 미리 정의할 수 있다.
따라서 자동으로 default 값이 사용된다.
(정우성의 경우엔 정의하지 않아서 아래에 추가를 한 것과 대비된다)

그러나 default 값이 정해진 default parameter(아이유같은)는 반드시 정의되지 않은(정우성같은) non-default parameter 보다 선위에 있으면 안된다.

def love_you(my_name = "정우성", your_name): <-- default parameter 정우성 먼저 선언
    print(f"{my_name} loves {your_name}") 
   
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

Assignment 참고링크보기

  1. 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다.
    왜 안돼야만 하는지 생각해보시고 블로깅 하여 채널에 공유해 주세요.

전 단원 함수 부분을 보면 아래 설명이 있는데 parameter 의 특성이 없을 수도 있다는 것 때문인 듯 하다(필수가 아닌 옵션)

  • parameter 와 return 은 optional 입니다. Input parameter가 없는 함수도 있을 수 있으며 리턴값이 없는 함수도 있을 수 있습니다.

이러한 이유로 값을 정해준 default가 non-default보다 먼저 선언되면 그 뒤의 값이 default의 값을 따르려고 하는 성질 때문인것 같다.
즉 값을 정해준 default parameter는 기본인수(호출시 반드시 넘기는 값이 있는것)인데
non default parameter는 선택적인수(호출시 넘기는 값이 없는것)이기 때문에 구문 오류.


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

<!-- 위의 오류내용 -->
Traceback (most recent call last): File "python", line 7, in <module>
TypeError: func_param_with_var_args() 
missing 1 required keyword-only argument: 'age'

오류를 보면 func_param_with_var_args() 어쩌고 나와있는데
age가 keyword-only에서 가져가야 할 값인데 missing 되어 오류난듯 하다
def 내의 parameter 를 보면 *args가 있는데


**kwargs = args와 비슷하나 키워드에 기반한 args

*args = 입력인수를 지정하지 않을때

쓰는 건데 이 *args 다음에 있는 age에 해당하는 값을 인식하여 가져가서 오류가 생긴것. (제공된 기본값 X)

<!--오류 수정 후 출력내용 -->
따라서 위의 오류를 위의 사진처럼 수정했다. 
*args를 맨 마지막에 배치함으로써 다른 파라미터들이 값에 맞는 리턴값을
먼저 다 가진 후 나머지를 차지하는 식. 그리고 출력도 바뀌었다.

Python 3.8.2 (default, Feb 26 2020, 02:56:10)
   
name=정우성
args=('01012341234', 'seoul')
age=20
=> None


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

<!-- 위의 오류내용 -->
Traceback (most recent call last):
  File "python", line 1
  def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                 ^
SyntaxError: invalid syntax

오류를 보면 invalid syntax라고 하여 구문오류가 난다.
주소의 경우 키워드 가변인수가 아니기 때문에 parameter에서 address 위치를 아래처럼 바꿔준다

<!--오류 수정 결과 -->
실행 결과 잘 나오게 된다.
Python 3.8.2 (default, Feb 26 2020, 02:56:10)
   
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

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

<!--위의 오류내용 -->
   
Traceback (most recent call last):
  File "python", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax

위의 오류 역시 invalid syntax 이다. 각각의 인수 종류에 따라 우선순위가 다르다.
우선적으로 age > name=아이유 > *args > address > **kwargs로 바꿔주었다

<!-- 오류 수정 결과 -->
Python 3.8.2 (default, Feb 26 2020, 02:56:10)
   
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

0개의 댓글