parameter & list(len, if)

제갈창민·2021년 11월 5일
0

learningbook

목록 보기
14/32

a. Parameter; default, non-default

Q. default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유는?


A.

-> parameter 로 값을 받아 오는데에는 지정된 형식에 따라 순서대로 받아옴.
순서없이 무작위로 parameter 를 설정하면 "어떤 parameter 에 어떤 값을 받아와야하는지" 컴퓨터는 판단할 수 없기때문.

  • a,b        : positional parameter
  • c=none : optional parameter
  • r="w"    : keyword parameter
  • d = [  ]   : list parameter
  • *ae        : keyword-only
  • **ab      : var-keyword parameter

--> 당연한 얘기지만 순서가 꼬이면 TypeError 가 발생함

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)

-> positional 과 keyword-only 의 순서가 잘못된 오류
--> age*args 앞으로 옮겨도 되고(20 도 010 앞으로 옮겨야 함)
---> ageage="20" 이라는 keyword 속성으로 변경해도 됨(이 경우는 아래의 input값을 수정해야 하기때문에 상황에 맞는 방법을 택하자) (두번째 방법에서 input 값을 지우지 않아서 args 값에 20이 출력되었다)

b. args & kwargs

  • args는 정해지지 않은 수의 tuple 자료형 (일반)파라미터를 받는다.
    (Variable Length Positional Arguments)

  • kwargs는 정해지지 않은 수의 dict 자료형 keyword parameter를 받는다.
    (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")

-> 이번엔 var-keyword 가 keyword 보다 앞에온 상태
--> "address=0""**kwargs" 앞으로 놓으면 해결(당연히 아래의 input 값 위치도 변경)

c. Mixed_parameter

  • 위에서 계속 보아왔듯, 다양한 parameter 들을 순서에 맞게 섞어 사용하는 것도 가능하다. 단, 계속 강조되는 위치를 제대로 잡아주지 않으면 아래와 같은 에러가 발생한다.
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")

-> Keyword-Only 인자가 Var Length Keyword 보다 뒤에 있는 상태
-> Position 인자인 "age" 역시 Keyword와 Keyword-Only 뒤에 있는 상태
--> 올바른 위치를 잡아줌으로써 에러없는 결과를 도출




Q. 주어진 list 의 첫번째와 마지막 element를 더한 값을 리턴하라

  • list가 비었다면 0 을 리턴

  • list의 총 길이는 len() 로 알아낼 수 있음

A.

def add_first_and_last_elements(my_list):
    # 이 함수를 구현해주세요.
  if len(my_list) == 0:
    return (0)
  else: 
    return (my_list[0]) + (my_list[-1])
    
    

a. 오류 (1)

  return (my_list[0]) + (my_list[-1])
  if len(my_list) == 0:
    return (0)

-> 일단 지문을 읽는대로 code를 써내려 가면서 생긴 오류
-> list index out of range Error 출력
--> 3시간 고민하다가 첫번째 문장을 if에 넣어볼까라는 생각에 도달함

b. 오류 (2)

  return (add_first_and_last_elements[0]) + (add_first_and_last_elements[-1])
  if len(add_first_and_last_elements) == 0:
    return (0)

-> 최초의 노답 코드 상태. 이건 인수, 인자, 변수들의 위치적 의미와 위치에 따른 역할에 대한 기본 개념이 모호했기에 발생한 오류.
-> 개념자체가 모호하니까 질문도 애매모호 해짐.
(Q. add_는 왜 return 으로 발동하지 않는가? add_(my_list) 에서 my_list 는 무슨 역할을 하고 후속 코드의 어느 위치에서 사용할 수 있는가?)

profile
자기계발 중인 신입 개발자

0개의 댓글