wecode TIL day 4 (Oct 22)

Jae Hoon Shin, 신재훈, Noah·2020년 10월 23일
0

python 함수와 조건문의 시작...

If문

과제 1

[조건문] 1. is_okay_to_drive
is_okay_to_drive 함수를 작성하세요.
함수의 인자 who 가 "son" 이면 "Nope!" 리턴
함수의 인자 who 가 "dad" 이면 "Good!" 리턴
함수의 인자 who 가 "grand father" 이면 "Be careful!" 리턴
나머지의 경우 "Who are you?" 리턴

def is_okay_to_drive(who):
  if who == "son":
    return "Nope!"
  elif who == "dad":
    return "Good!"
  elif who == "grand father":
    return "Be careful!"
  else:
    return "Who are you?"
  
is_okay_to_drive("son")

문제는 쉬웠는데 문제를 잘못 읽어서 return 자리에 print를 넣어놓고 삽질만 20분가량 했다. 잘 읽는게 이렇게 어렵다.

과제 2

[조건문] 2. check_age
check_age 함수를 작성하세요.
이름(name)과 나이(age)를 입력받는 check_age라는 함수는 나이에 따라 다른 메시지를 리턴합니다.
만일 나이가 21살보다 적으면, "Go home, (name)!"
나이가 21살이거나 더 많으면, "Nice to meet You, (name)!" 을 리턴하세요.
쉼표와 공백, 느낌표까지 정확히 리턴해야 합니다.

def check_age(name, age):
  if age < 21:
    return f"Go home, {name}!"
  if age >= 21:
    return f"Nice to meet You, {name}!"

과제 3

[조건문] 3. equals_wecode
equals_wecode 함수를 작성하세요.
이 함수는 주어진 문자열이 "wecode"와 같은지의 여부에 따라 true 혹은 false를 반환합니다.

def equals_wecode(string):
  if string == "wecode":
    return True
  else:
    return False

과제 4

[조건문] 4. find_greater_num
find_greater_num 함수를 작성하세요.
두 숫자가 주어졌을 때 어느 숫자가 더 큰지의 여부에 따라 다른 메세지 값을 리턴합니다.
첫번째 숫자(num1)가 두번째 숫자(num2)보다 더 큰 경우
"First one is greater!" 리턴
두번째 숫자(num2)가 첫번째 숫자(num1)보다 더 큰 경우
"Second one is greater!" 리턴
첫번째 숫자(num1)와 두번째 숫자(num2)가 같은 경우
"Same!" 리턴

def find_greater_num(num1, num2):
  if num1 > num2 :
    return "First one is greater!"
  if num2 > num1 : 
    return "Second one is greater!"
  if num1 == num2 : 
    return "Same!"

과제 5

[조건문] 5. is_even
is_even 함수는 주어진 숫자가 짝수인지의 여부를 반환합니다.
output = is_even(11);
print(output); # --> false
힌트)
짝수는 어떤 특징을 가지고 있나요? 짝수와 숫자 2의 관계는 어떻게 되나요?
나머지 연산자 (%) 라는 것이 있습니다. 해당 내용을 python 공식 레퍼런스를 읽어보세요.
https://docs.python.org/ko/3/library/stdtypes.html#numeric-types-int-float-complex
다음을 IDLE에서 입력하면, 어떤 결과가 나올까요?

def is_even(num):
  if num % 2 == 0:
    return True
  if num % 2 == 1:
    return False

과제 6

[조건문] 6. is_odd_and_greater_than_twenty
is_odd_and_greater_than_twenty 함수를 작성하세요.
숫자가 주어졌을때 주어진 숫자가 홀수이고 20보다 큰 경우에만 True를 반환합니다.

def is_odd_and_greater_than_twenty(num):
  if num % 2 == 1 and num > 20:
    return True
  else:
    return False

위의 and 부분을 & 로 넣었는데 submit 이 안되서 멘붕이 왔는데 왜 안됬는지 모르겠다.




Comparison Operators

과제 :

만일 input 값이 3자리 수 이상의 수 이면 "YES" 를 출력하시고 아니면 "NO" 를 출력하세요.
Input 값은 자동으로 입력됩니다.

number = int(input())
  
if number > 99:
  print ("YES")
if number <= 99:
  print ("NO")

3자리수 이상이라고 해서 99 대신 999를 넣었었다.

Elif And Else

elif

elif 는 if 구문을 보조 하는 역할
elif == else if

elif 는 if 구문과 연결되어 사용되며 if 구문이 먼저 선행 되고 그 다음에 위치하게 됩니다.
1. elif 는 만일 if 구문이 False 이면 실행되며
2. if 구문이 False 일 경우 다른 condition을 테스트 한 후 실행됩니다.

Else

else는 if 구문 (그리고 elif 구문이 있다면 elif 구문) 의 condition이 False인 경우 default 로 실행됩니다.
else 는 if 구문과 elif 구문이 먼저 선행되고 마지막에 위치하게 되며 if / elif 구문의 코드가 실행 되지 않으면 마지막으로 default로 실행됩니다. 그럼으로 else 구문에는 테스트 해야 하는 condition이 없습니다.

과제:
좌우와 상하가 모두 1 부터 8까지의 칸으로 이루어져 구성 되어 있는 체스보드가 있습니다.
주어진 input 값 2개를 통해서 해당 칸의 색깔이 검은색이면 "YES"를, 아니면 "NO" 를 출력하세요.

Input 값은 2개가 주어집니다. 첫번째 input은 X 축이며 두번째 input은 Y 축입니다.

예를 들어, input 값이 2와 6 이면 검은색 box 입니다.

나에겐 너무 추상적이고 어려웠다. 접근하기도 어려웠고 상상이 안갔다. 처음에 홀수 짝수로 2줄이면 되는가 보다 했는데 그것도 아니였다.
그래서 손으로 그림 그리고 하나의 규칙을 찾았는데 한줄씩하면 가능했다. 그런데 이렇게 하면 코드가 너무 길어질 것 같아서 무언가 틀린 것 같은 느낌이 들었다. 그래도 긴 코드라도 일단 해보자 싶어서 시도했다.

x = int(input())
y = int(input())

if y == 1 and x % 2 == 1:
  print("YES")
elif y == 1 and x % 2 == 0:
  print("NO") 
if y == 2 and x % 2 == 0:
  print("YES")
elif y == 2 and x % 2 == 1:
  print("NO") 
if y == 3 and x % 2 == 1:
  print("YES")
elif y == 3 and x % 2 == 0:
  print("NO") 
if y == 4 and x % 2 == 0:
  print("YES")
elif y == 4 and x % 2 == 1:
  print("NO") 
if y == 5 and x % 2 == 1:
  print("YES")
elif y == 5 and x % 2 == 0:
  print("NO") 
if y == 6 and x % 2 == 0:
  print("YES")
elif y == 6 and x % 2 == 1:
  print("NO") 
if y == 7 and x % 2 == 1:
  print("YES")
elif y == 7 and x % 2 == 0:
  print("NO") 
if y == 8 and x % 2 == 0:
  print("YES")
elif y == 8 and x % 2 == 1:
  print("NO") 

코드설명: 1층부터 올라가자는 생각이였다, 그럴려면 무조건 y == 1으로 시작해서 한줄은 x가 홀수일 때 블랙(YES) 짝수일 때 화이트(NO) 이런식으로 두줄로 시작했고, 그 아래는 반복이였다.

분명히 더 짧고 간결하고 깨끗하게 하는 로직이 있을 것인데, 알고 싶은데, 일단 지금 내가 아는걸 할 수 있는걸 하자는 마인드로 넘어가겠다.

Testing Set Of Conditions

and

and 구문을 사용할 때 염두해야 할 점은 and 구문을 사용하여 테스트 하는 모든 조이 True 일때만 if 구문의 코드가 실행이 된다는 점입니다. 조건문들 중 하나라도 False 이면 실행이 안됩니다.

or

and 의 반대의 경우가 or 입니다. or 는 테스트 하는 조건들중 하나만 True 이여도 if 구문의 코드가 실행이 됩니다.

and 와 or

and or 두개를 같이 쓸수도 있는데 예시로
"30대 미만의 성인 청년이거나 1년 수입이 1억 미만인 신혼 기혼자"를 표현한 코드


가독성을 높이기 위해서 ( ) 괄호를 사용하는 것이 좋습니다

if 심화 과제

월(month)와 일(day), 이 2가지를 input 값으로 받았을때, 2019년의 해당 월과 일의 다음 날의 월과 일을 출력해주세요.

예를 들어, month 는 3이고 일은 31이면 2019년 3월 31일의 다음날은 4월 1일 임으로 다음과 같이 출력이 되면 됩니다 (월 과 일을 각각 다른 줄에 출력 해주세요).

month = int(input())
day = int(input())


if month == 2 :
  if day == 28 :
    day = 1
    month += 1
  else:
    day  += 1
      
elif month % 2 == 1 and ( month >= 1 and month <=7 ) :
  if day == 31 :
    day = 0
    day += 1
    month += 1
  else:    
    day += 1
 
      
elif month % 2 == 0 and ( month >= 1 and month <=7 and month != 2 ) :
  if day == 30 :
    day = 0
    day += 1
    month += 1
  else:    
    day += 1
 
      
elif month % 2 == 0 and ( month >= 8 and month <=12 ) :
  if day == 31 :
    day = 0
    day += 1
    month += 1
  else:    
    day += 1
      
else:
      
  if day == 30 :
    day = 0
    day += 1
    month += 1
  else:    
    day += 1
      
print(month)
print(day)

엄청 애 먹었던 과제..
위 코드에서 맨 처음 두문단으로 예로 가져왔다.
두번째 문단에 elif라고 되어있지만 전에 if 로 써서 if문이 계속 쭉쭉 내려가는 바람에 2,28 을 입력하면 3,1 이 아니라 아래 if문 까지 적용되서, 3,2가 나와 버렸다. 계속 고치고 고쳤지만 한시간이 넘어서 동기분에게 도움을 요청해서 겨우 해결했다.
배운 점: 같은 indent에 제발 if if if 여러번 쓰지말고 elif 쓰기,
안그러면 if 수행 하고, 바로 밑에 같은 indent if 로 내려가버린다.

그리고! else로 끝내기! 그리고 끝낼때 else: month % 2 == 0 and (mo) 이렇게 다 안써도 된다.

if month == 2 :
  if day == 28 :
    day = 1
    month += 1
  else:
    day  += 1
      
elif month % 2 == 1 and ( month >= 1 and month <=7 ) :
  if day == 31 :
    day = 0
    day += 1
    month += 1
  else:    
    day += 1

진짜 위에 체스보다 더 힘들었다. 첫단추부터 잘못 끼웠고, 그 첫단추 부분을 잘못됬다고 의심을 1도 못해본 경우였다.

Nested If Statements


첫 번째 사진은 status == 학생이 3번이나 반복된다. Nested if statement를 쓰면 가독성이 높아집니다. 그리고 여기서도 indentation이 중요합니다.
이론상으론 2단계 이상 중첩될 수 있지만 너무 많아지면 또 가독성이 떨어지기 때문에 일반적으로 2단계 이상은 잘 ==하지 않습니다.

🔥🔥

다음의 방정식을 해결하는 프로그램을 구현 하세요. x값을 구해야 합니다.

ax = b

결과 출력물은 다음과 같아야 합니다.

Input 으로 주어진 a 와 b 값으로 위의 방정식을 충족하는 단 하나의 정수가 존재한다면 해당 정수를 출력하면 됩니다
만일 a 와 b 값으로 위의 방정식을 충족하는 정수가 없다면 "No Solution"을 출력해주세요.
a 와 b 값으로 위의 방정식을 충족하는 정수가 많다면 "Many Solutions"을 출력해주세요.

Hint:
a 나 b 는 0이 될 수 있습니다.

Examples:

만일 a = 1, b = -2 라면 결과값으로 -2가 출력이 되어야 합니다.
만일 a = 2, b = -1 라면 결과값으로 "No Solution"이 출력이 되어야 합니다.

해석

애초에 x를 구하는 것이기 때문에 ax = bx = b/a 라고 생각하고 봤다.

a=0에서 (b가 0일 경우와 아닐 경우)
a!=0에서 (b가 0일 경우와 아닐경우)

a == 0 & b == 0 일때 무한대 => Many Solutions
a == 0 & b != 0 => No Solution
b % a != 0 => No Solution (정수가 아니니까)
b % a == 0 => 정수니까 print(int(b/a))

a = int(input())
b = int(input())
"""
if (a==0) and (b==0):
	print("Many Solution")
elif  a==0:
	print("No Solution")
elif b%a==0:
	print(int(b/a))
else:
	print("No Solution")
"""	
	
if a==0 :
	if b==0:
	  print("Many Solutions")
	else:
	  print("No Solution")

elif b%a==0:
	print(int(b/a))
else:
	print("No Solution")

처음에 raw하게 위에 주석처럼 했다가 이번 주제가 nested IF statements 여서 중복되는 a==0을 if중첩시켜서 사용했다.
It took about 1 hour and 45 mins...

Comments

#을 쓰면 inline Comment

''' 이렇게 작은 따옴표 3개씩
앞뒤로 쓰면 multiple line comment '''

주석을 많이 쓰면 설명이 많으니까 좋을 것 같지만 너무 많으면 안 읽게 되고 코드 업데이트는 되었는데 주석은 업데이트가 안되는 일이 빈번하게 실무에서 일어나서 많은 주석은 효과가 없다. 주석을 최소화 시키고 애초에 주석이 필요 없을 정도로 가독성이 높은 코드를 작성하는 것이 최고!!

Function

반복되어 계속 사용되는 코드들을 함수로 정의하여 효과적으로 사용하기 위해

가독성을 높이기 위해

파이썬 함수에서

Input은 parameter

output은 return값

def 키워드

중요! parameter 와 return은 optional

return값은 함수에서 해당 함수를 호출한 주체(invoker)에게 결과값(output)을 보내주는 것

Function Parameters

Keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 괜찮습니다.parameter 순서에 맞추어 값을 함수에 넘기는 경우, 실수로 값이 바뀌어도 알기가 힘들다는 단점이 있습니다.

그에 비해 keyword arguments는 parameter 이름에 맞추어서 값을 함수에 넘기기 때문에 실수로 값이 바뀔 확률이 상대적으로 적다고 할 수 있습니다.

Mixing positional arguments and keyword arguments

이렇게 두 방법을 섞어도 되지만 순서를 꼭 지켜야하는 positional은 무조건 순서를 지켜야한다.
안 그러면 에러가 난다.

Parameter Default Value

Default 값이 정의된 paramter는 함수가 호출될때 값이 넘겨지 않아도default 값이 자동으로 넘겨지게 됩니다!!
다만 조심해야 할점은 default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다는 점입니다. 만일 default value parameter를 non-default value parameter 앞에 선언하면 syntax error가 납니다.

Assignment

리서치를 해보니까 순서가 바뀌면 컴퓨터가 무엇을 어디에 놓아야될지 몰라서 에러가 난다고 하는데
더 디테일한 이유: 바로 위 사진을 보면 my_name = "정우성"은 default 입니다. 그렇다면, default라면 love {your_name} 만 써도 문장이 완성 되어야하는데,

컴퓨터는 아이유를 기점으로 정우성 love를 앞에다 써야할지 뒤에다 써야할지 모르기 때문입니다.
or
love 아이유를 기점으로 정우성을 앞에다 써야할지 뒤에다 써야할지 모르기 때문입니다.

아래 코드가 에러가 나는 이유!

를 알기 전에 일단 arguments의 우선순위를 알아야 한다.
args의 우선순위

Regular positional args ->

Default args ->

Variable length positional args ->

Non-default args ->

Keyword-Only args with default ->

Variable length kwargs**

아래 코드는 에러가 난다.

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)

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
*args가 가변인수이기 때문에 순서상 뒤로 가야한다.
출력은 포지션인 정우성 , 01012341234 가 먼저 나오고 뒤에 가변인수 2개가 나온다.

아래 코드가 에러가 나는 이유!

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")

이것도 args의 우선순위를 먼저 잘 파악해야한다. address = 0 는 default position이기 때문에 **kwargs, address 의 순서를 바꿔주면 된다.

중요 ! args의 우선순위를 익히고 기억하고 개념을 이해하자
추가개념: 유튜브로 리서치해본 결과, parameter 와 argument는 기본적으로 같지만, parameter는 그것 대로 존재할 수 있지만, argument는 함수에서 데이터를 불러와야 결정되고 출력될수 있는? 데이터가 passed through 해야 된다 것이였다.

Parameters are inside functions or procedures, while arguments are used in procedure calls,
i.e. the values passed to the function at run-time.

profile
🇰🇷🇺🇸 #Back-End Engineer

0개의 댓글