21.2.18
<파이썬 어려웠던 개념 정리 : 조건문 ~ 함수(15~28)>
- The meaning of an AssertionError is that something happened that the developer thought was impossible to happen.(by stackoverflower)
- 즉 이 에러는 어떤 것이 일어나서는 안 되는 일이 일어났다는 뜻.
문제에서는 단순히 if문을 물어보는 것 같았지만 사실 진짜 문제는 함수가 return을 통해 완성되어야 하는 것으로 판단.(ok가 나왔음.) 고로 print를 무조건 쓸 것이 아니라 return해서 함수를 끝내기.
- (조건문) 문제 중 홀수이면서 20 초과의 수를 return하는 - 문제 및 고민 : 한 조건만 두고 나머지를 else 처리할 경우 함수가 이를 해결하지 못 한다.
- 해결 : 고로 모든 조건을 다 첨부해주는 것이 옳다. -> else 가 만능이 아니다.
- (조건문) 문제 중 월, 일 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회 이상 발생 시 코드 자체에 문제가 있을 것으로 판단. 만일의 만일의 만일의...??-> 이상하다.)
- 주석 issue :
- 너무 많은 주석은 지양. 최소한 하고 가독성 높은 코드를 작성하기
- Function : 일정한 작업을 수행하는 코드블럭.
- 쓰는 이유 : 반복을 줄일 수 있는 효용, 가독성.
- input -> 함수 -> output
def 함수명(parameter):
문장1
문장2
...
문장N
[return 리턴값]
<Checkpoint 과제>
- keyword arguments
- 순서 대신 parameter에 이름을 지어줘서 값을 전달. 순서에 상관 없다. 또한 가독성도 높아진다.
- positional argument와의 혼합 : 되도록 뒤에 붙여 함께 쓰는 것이 좋다. ;
관점 : default 값이 정의 되지 않은 인자보다 먼저 위치해서는 syntax오류가 난다.
SyntaxError: non-default argument follows default argument ; 기본 인수가 아닌 인수가 기본 인수를 따른다.
왜? : (문법적으로) mix상황에서는 인터프리터가 어떤 값과 어떤 인수를 일치시키는지 결정할 수 없기 때문에(값 계산 과정에서 이해하지 못하는 현상이 발생.) 순서대로 해줘야 한다.
참고 블로그 및 사이트 : 위코드 6기 블로그 ; 블로그 속 공식 문서 포함
- 위치 인수와 가변 인수의 위치를 통한 에러 수정하기 :
-
문제점 :
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")
- 가변 키워드 인수의 위치 통한 함수 에러 수정 :
- 문제점 : 가변 키워드 인수의 위치가 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")
- 가변 키워드 인수의 위치 참고하여 에러 고치기(종합) :
- 문제 :
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) + 가변 키워드 인자
Author And Source
이 문제에 관하여(21.2.18), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sinichy7/21.2.18저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)