[Python] 혼공단_2주차_Chapter 02(02-3)~03

Haeun Noh·2023년 1월 14일
0
post-thumbnail

0110


기본 미션 : p. 187 3번 문제 풀고 본인이 태어난 해와 띠를 출력하는 결과값 화면 인증하기

선택 미션 : else 구문과 elif 구문 정리한 내용 포스팅하기

이번주는 수련회를 가게 되어서 시간이 조금 촉박하다..
그래도 파이썬은 비교적 간단한 것 같아서 배움에 있어서 재미가 있기에 계속 열심히 하고자 하는 마음인 것 같다.



들어가며...

변수 : 값을 저장할 때 사용하는 식별자

변수는 숫자뿐만 아니라 모든 자료형을 저장할 수 있다.


변수 만들기/사용하기

간단하게 변수 만들기부터 해보도록 하자.

pi라는 이름의 저장 공간에 3.141592를 넣고 pi라는 이름을 호출해보자.

>>> pi = 3.141592
>>> pi
3.141592

pi 저장공간에 있는 값을 꺼내 출력이 된 모습을 볼 수 있다.


이제는 변수를 활용하는 방법에 대해 알아보도록 하자.

1. 변수를 선언하는 방법

변수를 생성하는 것을 의미한다. 어떠한 변수를 선언한다는 것은 사용하겠다라고 선언하는 것을 의미한다.


2. 변수에 값을 할당하는 방법

변수에 값을 넣는 것을 의미한다.

변수 =#값을 변수에 할당합니다.

이 때 = 기호는 같다라는 의미가 아니라 우변의 값을 좌변에 넣겠다, 할당하겠다라는 뜻이다.


3. 변수를 참조하는 방법

변수에서 값을 꺼내는 것을 의미한다.

>>> pi = 3.14

위처럼 pi라는 저장공간에 3.14가 들어있다면 pi라고 쓰면 이 안에 들어 있는 값을 쓰겠다는 의미가 된다.
이처럼 변수 안에 있는 값을 사용하는 것을 변수 참조라고 한다.

변수를 참조할 때는 참조할 위치에서 변수 이름을 아래와 같이 써주면 된다.

  • 변수에 저장된 값 출력
    변수
  • 변수에 저장된 값으로 연산
    변수 + 변수
  • 변수에 저장된 값 출력
    print(변수)

그렇다면 앞서 배운 내용을 이용해pi에 저장한 값을 이용해 원의 둘레와 넓이를 구해보자.


✏️ 직접 해보는 손코딩 _ 원의 둘레와 넓이 구하기

소스코드 varialbe.py

# 변수 선언과 할당
pi = 3.14159265
r = 10

# 변수 참조
print("원주율 =", pi)
print("반지름 =", r)
print("원의 둘레 =", 2 * pi * r)
print("원의 넓이 =", pi * r * r)


복합 대입 연산자

: 기존의 연산자와 조합해서 사용할 수 있는 연산자

복합 대입 연산자는 자료형에 적용하는 기본 연산자= 연산자를 함께 사용해 다음과 같이 구성하는 연산자이다.

a += 10

위와 같이 a += 10a = a + 10이라고 하는 것과 같은 결과를 낸다.

숫자에 적용할 수 있는 복합 대입 연산자

연산자 이름설명
+=숫자 덧셈 후 대입
-=숫자 뺄셈 후 대입
*=숫자 곱셈 후 대입
/=숫자 나눗셈 후 대입
%=숫자의 나머지를 구한 후 대입
**=숫자 제곱 후 대입

간단한 예제를 살펴보자.

>>> number = 100
>>> number += 10
>>> number += 20
>>> number += 30
>>> print("number :", number)
number : 160

문자열에 적용할 수 있는 복합 대입 연산자

연산자 이름설명
+=문자열 연결 후 대입
*=문자열 반복 후 대입

문자열 복합 대입 연산자를 활용한 예제도 살펴보자.

>>> string = "안녕하세요"
>>> string += "!"
>>> string += "!"
>>> print("string :", string)
string : 안녕하세요!!

사용자 입력: input()

파이썬은 명령 프롬프트에서 사용자로부터 데이터를 입력받을 때 input()함수를 사용한다.

input()함수로 사용자 입력받기

사용자로부터 데이터를 입력받을 때는 다음 코드를 입력한다.

>>> input("인사말을 입력하세요> ")

이때, input함수 괄호 안에 입력한 내용을 프롬프트 문자열이라고 하며, 사용자에게 입력을 요구하는 안내 내용을 의미한다.

실행하면 인사말을 입력하세요> 라는 문자열이 뜨고 프로그램이 실행 도중 잠시 멈추게 되는데 이것을 블록 block이라고 한다.

프롬프트 문자열 옆에 안녕하세요 등의 글자를 입력하고 Enter키를 누르면

인사말을 입력하세요> 안녕하세요 (Enter)
'안녕하세요'

이렇게 입력한 내용은 input()함수의 결과로 나오는데 이 값은 다른 변수에 대입해서 사용할 수도 있다. print()함수를 이용해 변수에 제대로 대입되었는지를 확인해보자.

>>> string = input("인사말 입력 :")
인사말 입력 : 안녕하세요 (Enter)
>>> print(string)
안녕하세요

위와 같이 input()함수의 결과로 나오는 값을 리턴값이라고 한다.


input() 함수의 입력 자료형

앞서 대입한 input()함수의 결과값의 자료형이 어떻게 되는지 살펴보자. 자료형은 type()함수로 알아볼 수 있다.

>>> print(type(string))
<class 'str'>

string변수에는 문자열을 입력해 대입했으니 당연히 자료형도 문자열이 나오는 모습이다.

하지만 유의할 점은 사용자가 입력한 정수불 boolean값도 type()함수를 사용하여 자료형을 확인하면 모두 무조건 문자열자료형이 나온다.
input() 함수는 사용자가 무엇을 입력해도 결과는 무조건 문자열 자료형이니 이 점을 유의하도록 하자.


✏️ 직접 해보는 손코딩_입력 자료형 확인하기

소스 코드 input.py

# 입력을 받습니다.
string = input("입력> ")

# 출력합니다.
print("자료:", string)
print("자료형:", type(string))

한 마디로 숫자를 입력해도 문자열로 들어온다는 의미이다.

✏️ 직접 해보는 손코딩_입력받고 더하기

소스 코드 input_error.py

# 입력
string = input("입력: ")

# 출력
print("입력 + 100:", string + 100)


따라서 입력받은 값과 숫자를 더하는 코드를 작성하고 싶다고 위와 같이 작성하면 다음과 같은 에러가 난다.
입력받은 문자열을 숫자로 변환해야 연산에 활용할 수 있다.


문자열을 숫자로 바꾸기

그렇다면 어떻게 문자열을 숫자로 바꿀 수 있을까?

자료형을 바꾸는 것은 영어로 캐스트 cast라고 부른다.

문자열 -> 숫자 변환할 때 사용하는 함수

문자열을 숫자로 변환할 때는 다음과 같은 함수를 사용한다.

  • int() 함수 : 문자열int(정수형) 자료형으로 변환한다.
  • float() 함수 : 문자열을 float(실수형 또는 부동 소수점) 자료형으로 변환한다.

간단한 예제를 살펴보자.


✏️ 직접 해보는 손코딩_int() 함수 활용하기

소스 코드 int_convert.py

string_a = input("입력A> ")
int_a = int(string_a)

string_b = input("입력B> ")
int_b = int(string_b)

print("문자열 자료:", string_a+string_b)
print("숫자 자료:", int_a+int_b)


이제는 이전 절에서 살펴보았던 input() 함수와 함께 조합하면 입력을 받아 숫자 연산을 하는 프로그램을 짤 수 있다.

✏️ 직접 해보는 손코딩_int() 함수와 float() 함수 조합하기

소스코드 int_float02.py

input_a = float(input("첫 번째 숫자> "))
input_b = float(input("두 번째 숫자> "))

print("덧셈 결과:", input_a + input_b)
print("뺄셈 결과:", input_a - input_b)
print("곱셈 결과:", input_a * input_b)
print("나눗셈 결과:", input_a / input_b)


덧셈, 뺄셈, 곱셈에서 의미 없는 소수점을 출력하고 싶지 않다면 관련된 내용은 뒤에서 다루도록 하자.


ValueError 예외

자료형을 변환할 때 변환할 수 없는 것을 변환하려고 하면 위와 같은 예외가 발생하게 된다.

1. 숫자가 아닌 것을 숫자로 변환하려고 할 때

int("안녕하세요")
float("안녕하세요")

문자열은 int() float()함수로 변환할 수 없는 값이기에 오류를 발생시킨다.


2. 소수점이 있는 숫자 형식의 문자열을 int() 함수로 변환하려고 할 때

int("52.273")

int정수형인데 부동 소수점이 있는 자료를 정수형으로 바꾸라고 하면 오류가 발생한다.

💡정수와 실수, 부동 소수점 구분이 어려워요.

만약 정수와 실수 구분이 힘들다면 float()함수를 일단 사용한다고 기억하자. int()는 실수를 정수로 변환할 수 없지만 float()함수가 의미하는 실수는 정수도 포함하고 있기 때문에 정수, 실수 구분없이 사용할 수 있다.


문자열로 바꾸기

문자열을 숫자로 변환하는 것처럼 숫자를 문자열로 변환하는 것도 가능하다.
문자열로 변환하는 방법은 매우 다양하나 여기서는 str() 함수와 뒤에서는 format() 함수를 활용하는 방법을 살펴보겠다.

str() 함수

str() 함수는 다른 자료형의 값을 str() 함수의 매개변수에 넣으면 문자열로 변환된다.

str(다른 자료형)

예제를 살펴보자.


✏️ 직접 해보는 손코딩_str() 함수를 사용해 숫자를 문자열로 변환하기

소스 코드 str.py

output_a = str(52)
output_b = str(52.345)

print(type(output_a), output_a)
print(type(output_b), output_b)


숫자 5252.345str()함수에 의해 문자열로 변환된 모습이다.


inch 단위를 cm 단위로 변경하기 (누적 예제)

지금까지 배운 내용을 활용해 첫 프로그램을 작성해보자.

  • 1 inch == 2.54cm

✏️ 직접 해보는 손코딩_inch 단위를 cm 단위로 변경하기

소스 코드 inch_to_cm.py

# 입력
raw_input = input("inch 단위의 숫자를 입력해주세요: ")

# 처리
inch = int(raw_input)
cm = inch * 2.54

# 출력
print(inch, "inch는 cm 단위로 ", cm,"cm입니다.")



마무리 정리

  • 변수 선언은 변수를 생성하는 것을 의미하고, 변수 할당은 변수에 값을 넣는 것을 의미한다.
  • 변수 참조는 변수에서 값을 꺼내는 것을 의미한다.
  • input() 함수는 명령 프롬프트에서 사용자로부터 데이터를 입력받을 때 사용한다.
  • int() 함수는 문자열을 int 자료형으로 변환하고 float() 함수는 문자열을 float 자료형으로 변환한다.
  • str() 함수는 숫자를 문자열로 변환한다.


문자열의 format() 함수

format() 함수로 숫자를 문자열로 변환하는 몇 가지 형태를 살펴보자.

format()함수는 문자열리 가지고 있는 함수이다. 중괄호 {}를 포함한 문자열 뒤에 마침표 .를 찍고 format() 함수를 사용하는데, 중괄호의 개수와 format() 함수 괄호 안 매개변수의 개수는 반드시 같아야 한다.

"{}".format(10)
"{} {}".format(10, 20)
"{} {} {} {} {}".format(101, 102, 103, 104, 105)

이렇게 함수를 사용하면 앞쪽의 문자열의 {}기호가 format() 함수 괄호 안에 있는 매개변수로 차례로 대치되며 숫자가 문자열이 되게 된다.


✏️ 직접 해보는 손코딩_format() 함수로 숫자를 문자열로 변환하기

소스코드 format_basic.py

# format() 함수로 숫자를 문자열로 변환하기
string_a = "{}".format(10)

# 출력하기
print(string_a)
print(type(string_a))


이제 한 단계 더 나아가 {} 기호 양쪽에 다른 문자열을 같이 넣은 형태, {} 기호와 매개변수를 여러 개 넣은 형태를 실행해보자.

✏️ 직접 해보는 손코딩_format() 함수의 다양한 형태

소스코드 format01.py

# format() 함수로 숫자를 문자열로 변환하기
format_a = "{}만원".format(5000)
format_b = "파이썬 열공하여 첫 연봉 {}만 원 만들기 ".format(5000)
format_c = "{} {} {}".format(3000, "문자열", True)

# 출력
print(format_a)
print(format_b)
print(format_c)


어디 부분이든 {}가 있는 곳에 문자열이 들어가는 모습이다.


IndexError 예외

{} 기호의 개수가 format() 함수의 매개변수 개수보다 많으면 IndexError 예외가 발생한다.

{} 기호의 개수가 format() 함수의 매개변수 개수보다 적으면 예외가 발생하지 않는다.


format() 함수의 다양한 기능

format() 함수는 숫자와 관련해서 다양한 기능을 가지고 있다.

정수 출력의 다양한 형태

format() 함수를 사용하면 출력할 정수에 기호를 넣어주거나, 숫자 형태를 다양하게 출력할 수 있다.

✏️ 직접 해보는 손코딩_정수를 특정 칸에 출력하기

소스코드 format02.py

# 정수
output_a = "{:d}".format(52)

# 특정 칸에 출력하기
output_b = "{:5d}".format(52) # 5칸
output_c = "{:10d}".format(52)# 10칸

# 빈칸을 0으로 채우기
output_d = "{:05d}".format(52) # 양수
output_e = "{:05d}".format(-52)# 음수

print("# 기본")
print(output_a)
print("# 특정 칸에 출력하기")
print(output_b)
print(output_c)
print("# 빈칸을 0으로 채우기")
print(output_d)
print(output_e)


{:d}int 자료형의 정수를 출력하겠다고 직접적으로 지정하는 것이다.

{:5d}라고 입력하면 5칸을 빈 칸으로 잡고 뒤에서부터 52라는 숫자를 채우게 된다. {:10d}도 마찬가지로 10칸을 빈칸으로 잡고 뒤에서부터 채운다.

{:05d}라고 지정하면 5칸을 잡고 뒤에서부터 52라는 숫자를 넣은 후 앞의 빈 곳을 0으로 채우겠다는 말이다. 만약 부호가 있을 경우 맨 앞자리를 부호로 채우고 나머지 빈 곳을 0으로 채운다.


기호와 관련된 예제를 살펴보자.

✏️ 직접 해보는 손코딩_기호 붙여 출력하기

소스코드 format03.py

# 기호와 함께 출력하기
output_f = "{:+d}".format(52) # 양수
output_g = "{:-d}".format(52) # 음수
output_h = "{: d}".format(52) # 양수
output_i = "{: d}".format(-52) # 음수

print("# 기호와 함께 출력하기")
print(output_f)
print(output_g)
print(output_h)
print(output_i)


{:+d}처럼 d앞에 기호를 붙이면 양수음수 기호를 표현할 수 있다.

{: d}처럼 d앞에 공백을 두어 기호 위치를 비우면 함수에 입력한 기호가 표현된다.


그럼 이와 같은 정수 출력을 조합해 확인해보자.

✏️ 직접 해보는 손코딩_조합해보기

소스코드 format04.py

# 조합하기
output_h = "{:+5d}".format(52)	# 기호를 뒤로 밀기: 양수
output_i = "{:+5d}".format(-52)	# 기호를 뒤로 밀기: 음수
output_j = "{:=+5d}".format(52)	# 기호를 앞으로 밀기: 양수
output_k = "{:=+5d}".format(-52)# 기호를 앞으로 밀기: 음수
output_l = "{:+05d}".format(52) # 0으로 채우기: 양수
output_m = "{:+5d}".format(-52) # 0으로 채우기: 음수

print("# 조합하기")
print(output_h)
print(output_i)
print(output_j)
print(output_k)
print(output_l)
print(output_m)


기호와 공백을 조합할 때는 =기호를 앞에 붙일 수 있다. 이는 5칸의 공간을 잡았을 때 기호를 빈칸 앞에 붙일 것인지, 숫자 앞에 붙일 것인지 지정하는 기호이다.


💡조합 순서가 중요해요.

조합순서가 달라지면 출력이 이상하게 된다. 예를 들어 {:=+05d}{:=0+5d}처럼 입력하면 전혀 다른 형태가 나오므로 주의하기 바란다.

# 조합하기
#output_n = "{:=+05d}".format(52)
output_o = "{:=0+5d}".format(52)

print("# 조합하기")
#print(output_n)
print(output_o)


부동 소수점 출력의 다양한 형태

이번에는 소수점이 들어가는 float 자료형의 숫자에 대해서 알아보도록 하자.
float 자료형 출력을 강제로 지정할 때에는 {:f}를 사용한다. 그리고 방금 배웠던 형태들을 적용할 수 있다.


✏️직접 해보는 손코딩_다양한 형태의 부동 소수점 출력하기

소스코드 format05.py

output_a = "{:f}".format(52.273)
output_b = "{:15f}".format(52.273)	# 15칸 만들기
output_c = "{:+15f}".format(52.273)	# 15칸에 부호 추가하기
output_d = "{:+015f}".format(52.273)	# 15칸에 부호 추가하고 0으로 채우기

print(output_a)
print(output_b)
print(output_c)
print(output_d)


추가로 부동 소수점의 경우는 소수점 아래 자릿수를 지정하는 기능이 있다. 다음 코드처럼 .을 입력하고 뒤에 몇 번째 자릿수까지 표시할지 지정하면 된다.

✏️직접 해보는 손코딩_소수점 아래 자릿수 지정하기

소스코드 format06.py

output_a = "{:15.3f}".format(52.273)
output_b = "{:15.2f}".format(52.273)
output_c = "{:15.1f}".format(52.273)

print(output_a)
print(output_b)
print(output_c)


이렇게 소수점을 각각 3 2 1자리로 출력한다. 이 때 자동으로 반올림이 일어난다.


의미없는 소수점 제거하기

의미없는 0을 제거하고 싶을 때는 {:g}를 사용한다.


✏️직접 해보는 손코딩_의미없는 소수점 제거하기

소스코드 format07.py

output_a = 52.0
output_b = "{:g}".format(output_a)
print(output_a)
print(output_b)


대소문자 바꾸기: upper()lower()

upper() 함수

: 소문자 -> 대문자

>>> a = "Hello Python Programming...!"
>>> a.upper()
'HELLO PYTHON PROGRAMMING...!'

변수 a에 저장된 문자열의 알파벳을 모두 대문자로 만든 모습이다.


lower() 함수

: 대문자 -> 소문자

>>> a.lower()
'hello python programming...!'

변수 a에 저장된 문자열의 알파벳이 모두 소문자로 변경된 모습이다.


💡여기서 잠깐_파괴적 함수와 비파괴적 함수

upper()함수와 lower()함수를 사용한다고 a문자열의 원본은 절대로 바뀌지 않는다. 이렇게 원본을 변화시키지 않는 함수를 비파괴적 함수라고 하고, 이와 반대되는 함수는 파괴적 함수라고 부른다. 후에 알아볼 것이다.


문자열 양옆의 공백 제거하기: strip()

  • strip()함수 : 문자열 양옆의 공백을 제거
  • lstrip()함수 : 왼쪽의 공백을 제거
  • rstrip() 함수 : 오른쪽의 공백을 제거

이 때 공백이란 띄어쓰기 줄바꿈 모두를 포함한다.

>>> input_a = """
	안녕하세요
문자열의 함수를 알아봅니다
"""
>>> print(input_a)

	안녕하세요
문자열의 함수를 알아봅니다

이렇게 의도하지 않은 줄바꿈 및 양옆의 공백을 strip()함수를 이용하면

>>> print(input_a.strip())
안녕하세요
문자열의 함수를 알아봅니다

이렇게 불필요한 공백이 제거된다.


문자열의 구성 파악하기: isOO()

문자열이 소문자, 알파벳, 숫자로만 구성되어 있는지 등을 확인할 때는 is로 시작하는 이름의 함수를 사용한다.

  • isalnum() : 문자열이 알파벳 또는 숫자로만 구성되어 있는가
  • isalpha() : 문자열이 알파벳으로만 구성되어 있는가
  • isidentifier() : 문자열이 식별자로 사용할 수 있는 것인가
  • isdecimal() : 문자열이 정수 형태인가
  • isdigit() : 문자열이 숫자로 인식될 수 있는가
  • isspace() : 문자열이 공백으로만 구성되어 있는가
  • islower() : 문자열이 소문자로만 구성되어 있는가
  • isupper() : 문자열이 대문자로만 구성되어 있는가

간단하게 몇 가지만 예시로 들어보자.

>>> print("TrainA10".isalnum()) # 알파벳 또는 숫자
True
>>> print("10".isdigit()) 		# 숫자로 인식
True

문자열 찾기: find()rfind()

문자열 내부에 특정 문자가 어디에 위치하는지 확인할 때 사용하는 함수이다.

  • find() : 왼쪽부터 찾아서 처음 등장하는 위치를 찾는다.
  • rfind() : 오른쪽부터 찾아서 처음 등장하는 위치를 찾는다.

예제를 살펴보자.

>>> output_a = "안녕안녕하세요".find("안녕")
>>> print(output_a)
0
>>> output_b = "안녕안녕하세요".rfind("안녕")
>>> print(output_b)
2

문자열은 가장 앞글자를 0번째로 센다는 사실을 잊지 말자.


문자열과 in연산자

  • in연산자 : 문자열 내부에 어떤 문자열이 있는지 확인한다.

출력은 True 또는 False라고 나온다.

예제를 살펴보자.

>>> print("안녕" in "안녕하세요")
True
>>> print("잘자" in "안녕하세요")
False

문자열 안녕하세요안에 안녕은 들어있으므로 True,
잘자는 들어있지 않으므로 False가 나온다.


문자열 자르기: split()

  • split() 함수 : 문자열을 특정한 문자로 자른다.

예제를 살펴보자.

>>> a = "10 20 30 40 50".split(" ")
>>> print(a)
['10', '20', '30', '40', '50']

split()함수를 이요해 괄호 안의 문자열인 공백을 기준으로 잘랐다.
실행 결과로는 리스트 list가 나온다. 일단은 split()함수로 문자열을 원하는 대로 자를 수 있다는 것을 기억해두자.



마무리 정리

  • format()함수를 이용하면 숫자와 문자열을 다양한 형태로 출력할 수 있다.
  • upper()lower()함수는 문자열의 알파벳을 대문자로 혹은 소문자로 변경한다.
  • strip() 함수는 문자열 양옆의 공백을 제거한다.
  • find() 함수는 문자열 내부에 특정 문자가 어디에 위치하는지 찾을 때 사용한다.
  • in연산자는 문자열 내부에 어떤 문자열이 있는지 확인할 때 사용한다.
  • split() 함수는 문자열을 특정한 문자로 자를 때 사용한다.
  • f-문자열을 사용하면 문자열 안에 값을 format() 함수보다 간단하게 삽입할 수 있다.


들어가며..

Boolean불린 또는 불리언 또는 이라는 발음으로 부른다.
은 오직 True(참)False(거짓) 값만 가질 수 있다.

하지만 참과 거짓은 그대로 입력하는 것보다 어떤 명제의 결과가 될 때 그 의미를 갖는다.


불 만들기: 비교 연산자

불은 비교 연산자를 통해 만들 수 있다. 파이썬에는 총 6개의 비교 연산자가 존재한다.

연산자설명
==같다
!=다르다
<작다
>크다
<=작거나 같다
>=크거나 같다

비교 연산자는 숫자 또는 문자열에 적용할 수 있다.

문자 비교 예시를 보도록 하자.

>>> print(10 == 100)
False
>>> print(10 != 100)
True
>>> print(10 <= 100)
True

파이썬은 문자열에도 비교 연산자를 적용할 수 있다. 이 때 한글사전 순서(가나다순)으로 앞에 있는 것이 작은 값을 갖는다.
예시를 보도록 하자.

>>> print("가방" == "가방")
True
>>> print("가방" < "하마")
True
>>> print("가방" > "하마")
False

가나다순이므로 보다 작으므로 "가방" < "하마"이 되고 그 반대는 거짓이 되는 것이다.


💡여기서 잠깐_범위 구하기

파이썬은 변수의 범위 등도 비교할 수 있다.

>>> x = 25
>>> print(10 < x < 30)
True
>>> print(40 < x < 60)
False

불 연산하기: 논리 연산자

불을 만들 때비교연산자를 사용한다고 했었다. 그리고 불끼지는 논리 연산자를 사용할 수 있다.
파이썬에는 총 3개의 논리 연산자가 존재한다.

연산자의미설명
not아니다불을 반대로 전환한다.
and그리고피연산자 두 개가 모두 참일 때 True를 출력하며, 그 외는 모두 False를 출력한다.
or또는피연산자 두 개 중에 하나만 참이라도 True를 출력하며, 두 개가 모두 거짓일 때에만 False를 출력한다.

💡여기서 잠깐_단항 연산자와 이항 연산자

  • 단항 연산자 : 피연산자가 한 개이다. ex) 부호 연산자
  • 이항 연산자 : 피연산자가 두 개이다. ex) 숫자 연산자 대부분

not연산자

  • 단항 연산자
  • 참과 거짓을 반대로 바꿀 때 사용

✏️직접 해보는 손코딩_not연산자 조합하기

소스코드 boolean.py

x = 10
under_20 = x < 20 # under_20 = (x < 20)
print("under_20:", under_20)
print("not under_20:", not under_20)

실행하면 단순히 TrueFalse로 바뀐다.


and 연산자와 or 연산자

and 연산자는 양쪽 변의 값이 모두 참일 때만 True를 결과로 낸다.

좌변우변결과
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

반면 or 연산자둘 중 하나만 참이어도 True를 결과로 낸다.

좌변우변결과
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

이를 기억하며 예제를 보도록 하자.

>>> print(True and False)
False
>>> print(True or False)
True

논리 연산자의 활용

and 연산자

유명한 연예인의 공연 티켓을 예매하는 경우

  • 티켓을 한 장만 구매하면서(그리고 and) 오후 3시 이후

or 연산자

카드를 선택하는 경우

  • 결제한 카드가 우리카드나(또한 or)신한카드라면 10% 할인해준다.


선택 미션 : else 구문과 elif 구문 정리한 내용 포스팅하기


if 조건문이란?

: 조건에 따라 코드를 실행하거나 실행하지 않게 만들고 싶을 때 사용하는 구문

이는 코드의 실행 흐름을 변경한다는 뜻이다.
이렇게 조건을 기반으로 실행의 흐름을 변경하는 것조건 분기라고 한다.


if 조건문의 기본적인 형태

if문의 기본적인 구조는 다음과 같다.

if 불 값이 나오는 표현식: # if 조건문 뒤에는 반드시 콜론(:)을 붙여야 한다.

# if문 다음 문장은 4칸 들여쓰기 후 입력한다. 안 하면 오류가 발생하니 주의할 것
????(불 값이 참일 때 실행할 문장)
????(불 값이 거짓일 때 실행할 문장)

다음은 if문을 사용하여 양수음수 여부를 알리는 예제이다.

✏️직접 해보는 손코딩_조건문의 기본 사용

소스코드 condition.py

# 입력을 받습니다.
number = input("정수 입력> ")
number = int(number)

# 양수 조건
if number > 0:
    print("양수입니다.")
    
# 음수 조건
if number < 0:
    print("음수입니다.")
    
# 0 조건
if number == 0:
    print("0입니다.")


날짜/시간 활용하기

여러 가지 조건문 중 몇 가지를 더 살펴보자.

먼저 시간을 조건으로 구분하여 오전인지 오후인지를 출력하는 프로그램을 짜보자.

✏️직접 해보는 손코딩_날짜/시간 출력하기

소스코드 date.py

# 날짜/시간과 관련된 기능을 가져온다.
import datetime

# 현재 날짜/시간을 구한다.
now = datetime.datetime.now()

# 출력
print(now.year, "년")
print(now.month, "월")
print(now.day, "일")
print(now.hour, "시")
print(now.minute, "분")
print(now.second, "초")


날짜를 한 눈에 알아보기 편하게 출력하기 위해서는 format()함수가 필요하다.

✏️직접 해보는 손코딩_날짜/시간을 한 줄로 출력하기

소스코드 date01.py

# 날짜/시간과 관련된 기능을 가져온다.
import datetime

# 현재 날짜/시간을 구한다.
now = datetime.datetime.now()

# 출력
print("{}년 {}월 {}일 {}시 {}분 {}초".format(
	now.year,
	now.month,
	now.day,
	now.hour,
	now.minute,
	now.second
))


✏️직접 해보는 손코딩_오전과 오후를 구분하는 프로그램

소스코드 date02.py

import datetime

now = datetime.datetime.now()

if now.hour < 12:
	print("현재 시각은 {}시로 오전입니다!".format(now.hour))
    
if now.hour >= 12:
	print("현재 시각은 {}시로 오후입니다!".format(now.hour))


다음과 같이 월을 사용하면 계절을 구분할 수도 있다.

✏️직접 해보는 손코딩_계절을 구분하는 프로그램

소스코드 date03.py

import datetime

now = datetime.datetime.now()

if 3 <= now.month <= 5:
    print("이번 달은 {}월로 봄입니다!".format(now.month))
if 6 <= now.month <= 8:
    print("이번 달은 {}월로 여름입니다!".format(now.month))
if 9 <= now.month <= 11:
    print("이번 달은 {}월로 가을입니다!".format(now.month))
if now.month == 12 or now.month <= 2:
    print("이번 달은 {}월로 겨울입니다!".format(now.month))

12 <= now.month <= 2라는 논리 오류를 발생시키지 않도록 주의하자.


짝수와 홀수 구분하기 (누적예제)

if문에서는 불 값이 나오는 조건문을 어떻게 만들 것인가 가 핵심이다. 따라서 여기서는 불 값에 어떤 조건식을 넣으면 좋을지에 대해 한 번 생각해 보는 시간을 가지도록 하자.


홀수와 짝수를 구분하는 예제를 통해 알아보도록 하자.

✏️직접 해보는 손코딩_끝자리로 짝수와 홀수 구분

소스코드 condition01.py

# 입력
number = input("정수 입력> ")

# 마지막 자리 숫자 추출
last_character = number[-1]

# 숫자로 변환
last_number = int(last_character)

# 짝수 확인
if last_number == 0 \
	or last_number == 2 \
    or last_number == 4 \
    or last_number == 6 \
    or last_number == 8:
    print("짝수입니다")
    
# 홀수 확인
if last_number == 1 \
	or last_number == 3 \
    or last_number == 5 \
    or last_number == 7 \
    or last_number == 9:
    print("홀수입니다")


인덱스에서는 -1이 뒤에서 첫 번째 숫자를 의미함을 잊지 말도록 하자.


결과는 잘 나왔지만 코드가 매우 길어진다. 따라서 위의 코드를 in 문자열 연산자를 이용해 간략히 수정해보자.

✏️직접 해보는 손코딩_in 문자열 연산자를 활용해서 짝수와 홀수 구분

소스코드 condition02.py

# 입력
number = input("정수 입력> ")

# 마지막 자리 숫자 추출
last_character = number[-1]

# 숫자로 변환
last_number = int(last_character)

# 짝수 확인
if last_character in "02468":
	print("짝수입니다")

# 홀수 확인
if last_character in "13579":
	print("홀수입니다")

last_character에 있는 문자열이 02468또는 13579에 포함되어 있는지를 확인해 코드가 훨씬 깔끔해졌다.


한 가지 더 살펴보면, 컴퓨터는 모든 것을 숫자로 계산한다. 따라서 문자열 연산보다는 숫자 연산이 조금 더 빠르다. 이번 예제에서는 숫자 연산을 통해 홀수와 짝수를 구분해보자.

✏️직접 해보는 손코딩_나머지 연산자를 활용해서 짝수와 홀수 구분

소스코드 condition03.py

# 입력
number = input("정수 입력> ")
number = int(number)

# 짝수 조건
if number % 2 == 0:
	print("짝수입니다")

# 홀수 조건
if number % 2 != 0:
	print("홀수입니다")

이렇듯 조건문을 만들 때는 어떤 것이 제일 빠를까? 를 고민해보아야 한다.



마무리 정리

  • 은 파이썬의 기본 자료형으로 TrueFalse를 나타내는 값이다.
  • 비교 연산자는 숫자 또는 문자열에 적용하며, 대소를 비교하는 연산자이다.
  • 논리 연산자not and or 연산자가 있으며, 불을 만들 때 사용한다.
  • if 조건문은 조건에 따라 코드를 실행하거나 실행하지 않게 만들고 싶을 때 사용하는 구문이다.


들어가며...

세상에는 두 가지로 구분되는 것들이 많은데 앞서 했던 짝수와 홀수도 마찬가지다.

# 입력
number = input("정수 입력> ")
number = int(number)

# 짝수 조건
if number % 2 == 0:
	print("짝수입니다")

# 홀수 조건
if number % 2 != 0:
	print("홀수입니다")

앞서 작성한 코드이다. 그런데 홀수와 짝수는 완전히 정반대되는 상황이다. 그러므로 정반대되는 상황에 두 번이나 조건을 비교해야 하는 것은 낭비라고 할 수 있다.
그렇다면 어떻게 이 문제를 해결할 수 있을까?


else 조건문의 활용

else 구문if 조건문 뒤에 사용하며,
if 조건문의 조건이 거짓일 때 실행되는 부분이다.

if 조건:
	조건이 참일 때 실행할 문장
else:
	조건이 거짓일 때 실행할 문장

앞 절의 condition03.py 예제에 else구문을 넣어 다시 코드를 짜보도록 하자.

✏️직접 해보는 손코딩_if 조건문에 else 구문을 추가해서 짝수와 홀수 구분

소스코드 condition04.py

# 입력
number = input("정수 입력> ")
number = int(number)

# 조건
if number % 2 == 0:
	print("짝수입니다")
else:
	print("홀수입니다")

조건문이 오로지 두 가지로만 구분될 때는 if else 구문을 사용하는 것이 훨씬 효율적이다.


elif 구문

그런데 딱 두 가지만으로 구분되지 않는 것도 있다.
따라서 세 개 이상의 조건을 연결해서 사용하는 방법이 필요한데 그것이 바로 elif 구문이다.

elif 구문은 다음과 같은 형태로 사용한다.

if 조건A:
	조건A가 참일 때 실행할 문장
elif 조건B:
	조건B가 참일 때 실행할 문장
elif 조건C:
	조건C가 참일 때 실행할 문장
...
else:
	모든 조건이 거짓일 때 실행할 문장

elif 구문을 이용해 현재 월을 구하고 이를 기반으로 계절을 구하는 코드를 작성해보자.

✏️직접 해보는 손코딩_계절 구하기

소스코드 condition05.py

# 날짜/시간과 관련된 기능을 가져온다.
import datetime

now = datetime.datetime.now()
month = now.month

# 조건문으로 계절 확인
if 3 <= month <= 5:
	print("현재는 봄입니다")
elif 6 <= month <= 8:
	print("현재는 여름입니다")
elif 9 <= month <= 11:
	print("현재는 가을입니다")
else:
	print("현재는 겨울입니다")


if 조건문을 효율적으로 사용하기 (누적 예제)

학점과 학점에 대한 학생 평가인데, 예제로 구현할 조건은 다음과 같다.

조건설명 (학생 평가)
4.5
4.2 ~ 4.5교수님의 사랑
3.5 ~ 4.2현 체제의 수호자
2.8 ~ 3.5일반인
2.3 ~ 2.8일탈을 꿈꾸는 소시민
1.75 ~ 2.3오락문화의 선구자
1.0 ~ 1.75불가촉천민
0.5 ~ 1.0자벌레
0 ~ 0.5플랑크톤
0시대를 앞서가는 혁명의 씨앗

소수점을 사용하므로 입력을 숫자로 변환할 때 float()함수를 사용한다는 것에 유의하며 코드를 작성해보자.

✏️직접 해보는 손코딩_유머를 조건문으로 구현하기(1)

소스코드 condition06.py

# 변수 선언
score = float(input("학점 입력> "))

# 조건문 작성
if score == 4.5:
	print("신")
elif 4.2 <= score < 4.5:
	print("교수님의 사랑")
elif 3.5 <= score < 4.2:
	print("현 체제의 수호자")
elif 2.8 <= score < 3.5:
	print("일반인")
elif 2.3 <= score < 2.8:
	print("일탈을 꿈꾸는 소시민")
elif 1.75 <= score < 2.3:
	print("오락문화의 선구자")
elif 1.0 <= score < 1.75:
	print("불가촉천민")
elif 0.5 <= score < 1.0:
	print("자벌레")
elif 0 < score < 0.5:
	print("플랑크폰")
elif score == 0:
	print("시대를 앞서가는 혁명의 씨앗")

이 코드는 초보자들일 때 가장 많이 하는 비효율적인 코드이다. else 구문과 elif 구문은 이전의 조건이 맞지 않을 때 넘어오는 부분이므로 한 번 제외된 조건을 한 번 더 검사할 필요는 없다.


앞의 코드를 좀 더 효율적으로 구성한 코드는 다음과 같다.

✏️직접 해보는 손코딩_유머를 조건문으로 구현하기(2)

소스코드 condition07.py

# 변수 선언
score = float(input("학점 입력> "))

# 조건문 작성
if score == 4.5:
	print("신")
elif 4.2 <= score:
	print("교수님의 사랑")
elif 3.5 <= score:
	print("현 체제의 수호자")
elif 2.8 <= score:
	print("일반인")
elif 2.3 <= score:
	print("일탈을 꿈꾸는 소시민")
elif 1.75 <= score:
	print("오락문화의 선구자")
elif 1.0 <= score:
	print("불가촉천민")
elif 0.5 <= score:
	print("자벌레")
elif 0 < score:
	print("플랑크폰")
else:
	print("시대를 앞서가는 혁명의 씨앗")

이미 한 번 비교한 것은 제외하고 작성하였다.
이렇게 되면 조건 비교를 반 밖에 하지 않고, 코드의 가독성도 높아지게 된다.


False로 변환되는 값

if 조건문의 매개변수에 다른 값이 올 때 어떤 값이 True이고 False로 변환되는지를 알고 있어야 코드를 이해할 수 있다.

False로 변환되는 값은 None, 숫자 0, 0.0, 빈 컨테이너(빈 문자열, 빈 바이트열, 빈 리스트, 빈 튜플, 빈 딕셔너리 등) 이다. 이외에는 모두 True로 변환된다.


다음 예제를 통해 0빈 문자열if else 조건문의 매개변수에 넣으면 무엇이 실행되는지를 살펴보자.

✏️직접 해보는 손코딩_False로 변환되는 값

소스코드 false_value.py

print("# if 조건문에 0 넣기")
if 0:
	print("0은 True로 변환됩니다.")
else:
	print("0은 False로 변환됩니다.")
    print()
    
print("# if 조건문에 빈 문자열 넣기")
if "":
	print("빈 문자열은 True로 변환됩니다")
else:
	print("빈 문자열은 False로 변환됩니다")

실행 결과에서도 알 수 있듯 0빈 문자열False로 변환된다.


pass 키워드

프로그래밍을 하다 보면 일단 프로그래밍의 전체 골격을 잡아 놓고 내부에서 처리할 내용은 차근차근 생각하며 만들겠다는 의도로 다음과 같이 코딩하는 경우가 많다.
이 때 골격은 일반적으로 조건문 반복문 함수 클래스 등의 기본 구문을 말한다.

if zero == 0
	빈 줄 삽입
else:
	빈 줄 삽입

다음 예제를 살펴보자.

✏️직접 해보는 손코딩_나중에 구현하려고 비워 둔 구문

소스코드 pass_keyword.py

# 입력
number = input("정수 입력> ")
number = int(number)

# 조건문 사용
if number > 0:
	# 양수일 때: 아직 미구현 상태입니다.
else:
	# 음수일 때: 아직 미구현 상태입니다.

파이썬의 경우에는 if 조건문 사이에는 무조건 들여쓰기 4칸을 넣어야만 구문이 성립되므로 위의 경우에는 IndentationError(들여쓰기가 잘못되어 있다)가 발생한다.

그래서 파이썬에서는 pass라는 키워드를 제공한다.
pass 키워드를 만나면 진짜로 아무것도 안 함 또는 곧 개발하겠음으로 해석하면 되겠다.

✏️직접 해보는 손코딩_pass 키워드를 사용한 미구현 부분 입력

소스코드 pass_keyword01.py

# 입력
number = input("정수 입력> ")
number = int(number)

# 조건문 사용
if number > 0:
	# 양수일 때: 아직 미구현 상태입니다.
    pass
else:
	# 음수일 때: 아직 미구현 상태입니다.
    pass

아직 아무것도 안했다라는 뜻의 pass만 들어가 있으므로 입력만 받고 프로그램이 종료된다.



마무리 정리

  • else 구문if 조건문 뒤에 사용하며, if 조건문의 조건이 거짓일 때 실행된다.
  • elif 구문if 조건문과 else 구문 사이에 입력하며, 세 개 이상의 조건을 연결해서 사용할 때 적절하다.
  • if 조건문의 조건식에서 False로 변환되는 값None 0 0.0 빈 문자열 빈 바이트열 빈 리스트 빈 튜플 빈 딕셔너리 등 이다.
  • pass 키워드는 프로그래밍의 전체 골격을 잡아놓고, 내부에 처리할 내용은 나중에 만들고자 할 때 pass라는 키워드를 입력해둔다.


기본 미션 : p. 187 3번 문제 풀고 본인이 태어난 해와 띠를 출력하는 결과값 화면 인증하기


03 사용자에게 태어난 연도를 입력받아 띠를 출력하는 프로그램을 작성해주세요

작성 시 입력 받은 연도를 12로 나눈 나머지를 사용합니다. 나머지가 0 1 2 3 4 5 6 7 8 9 10 11일 때 각각 원숭이 돼지 토끼 띠이다.

str_input = input("태어난 해를 입력해 주세요> ")
birth_year = int(str_input)%12

if birth_year == 0:
	print("원숭이 띠입니다.")
elif birth_year == 1:
	print("닭 띠입니다.")
elif birth_year == 2:
	print("개 띠입니다.")
elif birth_year == 3:
	print("돼지 띠입니다.")
elif birth_year == 4:
	print("쥐 띠입니다.")
elif birth_year == 5:
	print("소 띠입니다.")
elif birth_year == 6:
	print("범 띠입니다.")
elif birth_year == 7:
	print("토끼 띠입니다.")
elif birth_year == 8:
	print("용 띠입니다.")
elif birth_year == 9:
	print("뱀 띠입니다.")
elif birth_year == 10:
	print("말 띠입니다.")
elif birth_year == 11:
	print("양 띠입니다.")



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글