21.2.18

<파이썬 어려웠던 개념 정리 : 조건문 ~ 함수(15~28)>

  1. The meaning of an AssertionError is that something happened that the developer thought was impossible to happen.(by stackoverflower)
  • 즉 이 에러는 어떤 것이 일어나서는 안 되는 일이 일어났다는 뜻.
    문제에서는 단순히 if문을 물어보는 것 같았지만 사실 진짜 문제는 함수가 return을 통해 완성되어야 하는 것으로 판단.(ok가 나왔음.) 고로 print를 무조건 쓸 것이 아니라 return해서 함수를 끝내기.
  1. (조건문) 문제 중 홀수이면서 20 초과의 수를 return하는 - 문제 및 고민 : 한 조건만 두고 나머지를 else 처리할 경우 함수가 이를 해결하지 못 한다.
  • 해결 : 고로 모든 조건을 다 첨부해주는 것이 옳다. -> else 가 만능이 아니다.
  1. (조건문) 문제 중 월, 일 Input값으로 "다음 날의 날짜를 구하는 문제"
  • 고민한 것 : if, elif, else, and, or만으로 (따로 모듈 사용하지 않고) 문제 해결. 또한 말일이 28일이나 29일(2월), 30일, 31일에 끝나는 것을 모두 구분을 했었어야 함. 단순히 or 만 쓰는 것이 아니라 변수를 함께 선언했어야 함.
  • 중첩 if문 사용
  • 결과
if month == 1 or month == 3 or month ==  5 or month == 7 or month == 8 or month == 10:
  if day == 31:
    month += 1
    day = 1
  else:
    day += 1
elif month == 4 or month == 6 or month == 9 or month == 11:
  if day == 30:
    month += 1
    day = 1
  else:
    day += 1    
elif month == 2:
  if day == 28 or day == 29:
    month += 1
    day = 1
  else:
    day += 1    
elif month == 12:
  if day == 31:
    month = 1
    day = 1
  else:
    day += 1
print(month)
print(day)

월에 따른 분류(크게 4개) + 내부 if는 말일의 덧셈, else는일반 날짜의 덧셈

아쉬운 점 : 깔끔한 코드는 아니다. 코드가 케이스에 따라 조금 길어졌다.

  • 다음 파트도 비슷한 문제였다.(Nested If문)
    즉 같은 조건이면 맨 위에 조건으로 묶고 중첩하는 방식인데 되도록 1차 중첩 그 이상은 하지 않는 것을 권장한다고 한다.(중첩이 2회 이상 발생 시 코드 자체에 문제가 있을 것으로 판단. 만일의 만일의 만일의...??-> 이상하다.)
  1. 주석 issue :
  • 너무 많은 주석은 지양. 최소한 하고 가독성 높은 코드를 작성하기
  1. Function : 일정한 작업을 수행하는 코드블럭.
  • 쓰는 이유 : 반복을 줄일 수 있는 효용, 가독성.
  • input -> 함수 -> output
def 함수명(parameter):
    문장1
    문장2
    ...
    문장N
    [return 리턴값]

<Checkpoint 과제>

  1. keyword arguments
  • 순서 대신 parameter에 이름을 지어줘서 값을 전달. 순서에 상관 없다. 또한 가독성도 높아진다.
  1. positional argument와의 혼합 : 되도록 뒤에 붙여 함께 쓰는 것이 좋다. ;

관점 : default 값이 정의 되지 않은 인자보다 먼저 위치해서는 syntax오류가 난다.

SyntaxError: non-default argument follows default argument ; 기본 인수가 아닌 인수가 기본 인수를 따른다.

왜? : (문법적으로) mix상황에서는 인터프리터가 어떤 값과 어떤 인수를 일치시키는지 결정할 수 없기 때문에(값 계산 과정에서 이해하지 못하는 현상이 발생.) 순서대로 해줘야 한다.

참고 블로그 및 사이트 : 위코드 6기 블로그 ; 블로그 속 공식 문서 포함

  1. 위치 인수와 가변 인수의 위치를 통한 에러 수정하기 :
  • 문제점 :
    keyword 인자가 필요한 자리에 단순한 위치 인자가 들어와 있다.
    가변 인자 뒤에 포지셔널 인자가 있었다.

  • 해결 : 먼저 return할 값을 조정해서 age를 키워드 인자화 시키고 순서를 그대로 조정하였더니 해결되었다.

def func_param_with_var_args(name, *args, age=20):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", "01012341234", "seoul")
  1. 가변 키워드 인수의 위치 통한 함수 에러 수정 :
  • 문제점 : 가변 키워드 인수의 위치가 default값보다 먼저 와 있었고 뿐 만 아니라 ** 를 통해 풀어지지 않았다.
  • ? : 언패킹이라고 함. 키워드 인자는 약간 딕셔너리의 성격을 지니고 있어 키, 값을 따로 언패킹 해줘야 하는데 그래서 가변 포지셔널 인자와 달리 를 두 번 사용한다.
    참고링크 : 코딩도장

위치에서의 중요성 : 여기서 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다

  • 해결 :
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")
  1. 가변 키워드 인수의 위치 참고하여 에러 고치기(종합) :
  • 문제 :
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")
  • 첫번째 문제 : syntax error
  • 해결 : parameter 전체 조정.
 def mixed_params(age, name, *args, **kwargs):
  • 두 번째 문제 : address 정의
    현재 address는 define이 이매한 상황. 하지만 들어가는 인자가 딕셔너리 형태.(키워드 인자 형태로 들어가야 함.) 하지만 위의 kwargs에 의해 겹치는 현상 발생
  • 해결 : 가변 포지셔널 인자 + default 인자(address) + 가변 키워드 인자 통한 해결.
def mixed_params(age, name, *args, address = 0,**kwargs):

결과
>>>name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
  • 순서 꼭 확인하자.(이번 블로그 핵심)

    가변 포지셔널 인자 + default 인자(address) + 가변 키워드 인자

좋은 웹페이지 즐겨찾기