1. 제어문(control statement)
■ 프로그램을 작성할 때, 3가지 제어 구조가 있다. 어떤 프로그램이라도 이 3가지 구조를 조합하여 만들어 진다.
1) 순차 구조 - 명령들을 순차적으로 실행
2) 선택 구조 - 둘 중 하나의 명령을 선택하여 실행 ex) 조건문
3) 반복 구조 - 동일한 명령이 반복되어 실행 ex) 반복문
■ 문장들이 실행되는 순서를 제어하는 문장을 제어문이라고 하며, 제어문에는 조건문과 반복문으로 나누어진다.
2. 관계(=비교) 연산자, 멤버 연산자
■ 관계 연산자(관계형 연산자)는 두 값이 같거나 다르거나 어느 쪽이 크거나 작은지 등을 판단할 때 사용하는 연산자이다. 연산 결과로 True/False를 반환하기 때문에 조건문에서 '조건식'을 구성할 때 자주 사용된다.
■ 멤버 연산자는 in, not in 연산자이다. in 앞에 있는 값이 in 뒤에 있는 반복 가능한 객체(iterable)에 있는지 확인하기 위해 사용하는 연산자로 True/False를 반환한다.
■ 이러한 관계형 연산자는 숫자, 문자열, 다른 객체에 적용할 수 있다. 관계형 연산자를 숫자, 문자열에 사용할 경우 그 의미는 각각 다음과 같다.
관계형 연산자 표기 | 숫자 의미 | 문자열 의미 |
== | 같은 | 동일한 |
!= | 같지 않은 | 다른 |
< | 선형값보다 작은 | 사전 편찬 기준 앞에 있는 |
> | 후속 값보다 큰 | 사전 편찬 기준 뒤에 있는 |
<= | 작거나 같음 | 사전 편찬 기준 앞에 있거나 동일한 |
>= | 크거나 같음 | 사전 편찬 기준 뒤에 있거나 동일한 |
in | 서브스트링(부분문자열) | |
not in | 서브스트링이 아님 |
2.1 ==, !=
■ 파이썬에서 '같다'는 것은 ==로 표현하며, '같지 않다'는 !=로 표현한다.
1 == 1
```#결과#```
True
````````````
1 != 1
```#결과#```
False
````````````
■ 문자열을 ==나 !=로 비교할 경우, 문자열들이 완벽하게 일치하면 True, 문자열 안의 문자가 하나라도 다르면 False가 된다.
'boolean value' == 'boolean value'
```#결과#```
True
````````````
'boolean value' != 'booleanvalue'
```#결과#```
True
````````````
'boolean value' == 'boolean value' == 'booleanvalue'
```#결과#```
False
````````````
참고) 실수와 실수의 비교
■ 예를 들어, \( \sqrt{2.0} \times \sqrt{2.0} \)의 결과는 \( 2.0 \)이 되어야 한다. 하지만 파이썬에서는 다음과 같이 \( \sqrt{2.0} \times \sqrt{2.0} \)의 값과 \( 2.0 \)은 다르다는 결과가 나온다.
from math import sqrt
f = sqrt(2)
f2 = 2.0
f*f == f2
```#결과#```
False
````````````
■ 그 이유는 컴퓨터에서 비트의 수가 제한되어 있으므로, 무리수 \( \sqrt(2.0) \)같은 복잡합 값은 부동소수점으로 정확히 표현할 수 없기 때문이다.
■ f*f 연산에서 \( \sqrt(2.0) \) 값 두 개를 곱한 뒤, 부동소수점으로 반올림을 하게 된다. 수학적으로 \( \sqrt{2.0} \times \sqrt{2.0} = 2.0 \)이지만, 부동소수점 근사 연살을 거치면서 실제 계산 결과가 파이썬에서는 다음과 같이 2.0000000000000004로 출력된다.
f*f
```#결과#```
2.0000000000000004
````````````
■ 그러므로 실수값 2개의 값을 비교할 때는 허용 오차를 두고 비교해야 한다. 허용 오차를 설정하기 위해 특정 모듈을 사용할 수도 있고, 다음과 같이 조건문을 사용할 수도 있다.
flag = False
if abs(f*f - f2) < 0.0001: ## f*f - 2.0의 절댓값이 허용 오차 0.0001보다 작으면
flag = True
print(flag)
```#결과#```
True
````````````
2.2 >, <, >=, <=
■ 관계 연산자 >, <, >=, <= 으로 문자의 순서를 매기기 위해 다음과 같은 아스키(ASCII)코드 표를 사용할 때,
■ a가 b보다 먼저 위치하는 경우 a는 b보다 작다고 간주한다.
■ 그리고 대문자는 소문자 앞에 위치하며, 숫자는 대문자 앞에 위치하는 것을 볼 수 있다.
■ 문자열을 비교할 때는, 두 문자열 중 어떤 것이 앞에 위치하는지(어떤 문자열이 앞에 오는지를) 결정하기 위해 각 문자열의 '문자' 단위로 비교하게 된다.
■ 따라서
- 'cat' < 'dog'
- 'cart' < 'cat'
-- 'cart'의 첫 번째 문자는 'c', 'cat'의 첫 번째 문자는 'c', 두 문자가 같으므로 다음 문자로 넘어간다.
-- 'cart'의 두 번째 문자는 'a', 'cat'의 두 번째 문자는 'a', 두 문자가 같으므로 다음 문자로 넘어간다.
-- 'cart'의 세 번째 문자는 'r', 'cat'의 세 번째 문자는 't', 이때, 두 문자가 다르다. 여기서 비교가 결정된다.
-- 'r'은 't'보다 앞에 위치하므로 'r' < 't'가 성립한다.
-- 즉, 'r'이 사전 편찬 기준 상 't' 앞에 있다는 것을 의미하는 비교(관계) 연산자 <을 사용해야 참(True)이다.
- 'cat' < 'catalog'
-- 세 번째 문자 'c', 'a', 't'까지는 완전히 동일하다.
-- 그 뒤 'cat'은 더 이상 문자가 없으므로 'catalog'보다 'cat'이 더 앞에 위치하게 된다.
- '2W' < 'bat'
-- '2W'의 첫 번째 문자는 숫자 2, 'bat'의 첫 번째 문자는 소문자 'b'이다. 앞에 위치하는 순서는 숫자, 대문자, 소문자이므로 첫 번째 문자에서 비교가 결정된다.
-- '2'는 'b'보다 앞에 위치하므로 '2' < 'b'가 성립한다. 이로 인해 '2W' < 'bat'이 성립하는 것이다.
- 'Dog' < 'cat'
-- 대문자는 소문자 앞에 위치한다. 'Dog'의 첫 번째 문자는 대문자 'D', 'cat'의 첫 번째 문자는 소문자 'c'이다.
-- 'D' < 'c'이므로 'Dog' < 'cat'이 성립하는 것이다.
- 'dog_10' < 'dog_cat'
이다.
■ 이러한 유형의 순서를 사전 편찬 순서(lexicographical ordering)라고 한다.
1 <= 1
```#결과#```
True
````````````
1 < 1
```#결과#```
False
````````````
'car' < 'cat'
```#결과#```
True
````````````
'Dog' < 'dog'
```#결과#```
True
````````````
'1' < 'cat'
```#결과#```
True
````````````
'1' < 'C'
```#결과#```
True
````````````
'dog_10' < 'dog_cat'
```#결과#```
True
````````````
'cat' <= 'catalog'
```#결과#```
True
````````````
■ 관계 연산자의 우선순위는 산술 연산자보다 낮다. 예를 들어, 'number - 1> 10'이라는 문장이 있을 때, 'number - 1'이 먼저 수행된 다음, 'numer - 1'과 ' > 10' 연산이 수행된다.
2.3 in, not in
■ 멤버 연산자인 in은 앞에 전달되는 값이 뒤에 전달되는 시퀀스 자료형(리스트, 튜플, 문자열 등)에 포함되는지 여부를 True/False로 반환한다.
■ in, not in 연산자의 경우 아래 예시처럼 부분 문자열이면 True, 그렇지 않으면 False를 반환하는 것을 확인할 수 있다.
## 리스트
1 in [1, 2, 3]
```#결과#```
True
````````````
## 튜플
2 in (3, 4, 5)
```#결과#```
False
````````````
## 문자열
'boolean' in 'boolean value'
```#결과#```
True
````````````
'dog' in 'boolean value'
```#결과#```
False
````````````
3. 논리 연산자
■ 조건이 하나라면 관계연산자 하나만으로 표현할 수 있지만, 조건이 여러 개인 복잡한 조건은 하나의 관계 연사자만으로 조건을 나타낼 수 없다. 복잡한 조건을 표현할 때 사용하는 것이 논리 연산자이다.
■ 논리 연산자는 and, or, not이 있으며, 여러 조건을 조합해 참인지 거짓인지 판별할 때 유용하다.
연산 | 의미 |
x and y | x와 y가 모두 참이면 참, 그렇지 않으면 거짓 |
x or y | x나 y중에서 하나만 참이면 참, 모두 거짓이면 거짓 |
not x | x가 참이면 거짓, x가 거짓이면 참 |
■ 논리 연산자 and, or, not을 사용하는 조건을 복합 조건이라고 한다. 예를 들어 x와 y가 조건이라면 다음 복합 조건은 두 조건이 모두 참일 때 True를 반환한다. 그렇지 않으면 이 복합 조건은 거짓(False)이 된다.
int1 = 10
chr1 = 'A'
int1 == 10 and chr1 == 'A'
```#결과#```
True
````````````
■ x or y라는 복합 조건은 다음과 같이 두 조건 중 하나만 참이거나 모두 참일 경우 True를, 그렇지 않으면 False를 반환한다.
int1 == 10 or chr1 == 'a'
```#결과#```
True
````````````
int1 == 9 or chr1 == 'a'
```#결과#```
False
````````````
■ not x라는 복합 조건은 해당 조건이 거짓일 때 참이 되며, 해당 조건이 참이면 거짓이 된다.
int1 = 10
not int1
```#결과#```
False
````````````
int2 = 0
not int2
```#결과#```
True
````````````
■ 논리 연산자는 관계 연산자보다 우선순위가 낮다. 예를 들어, 'number - 1> 10 and number == 11'이라는 문장이 있을 때,
- 산술 연산 'number - 1'이 먼저 수행된 다음,
- 관계 연산 'numer - 1'과 ' > 10' 이 수행된다.
- 마지막으로 논리 연산 'number - 1 > 10'과 'number == 11'이 수행된다.
참고) 단락 연산
■ x와 y가 조건이라고 했을 때, 파이썬은 복합 조건 ( x and y )를 실행할 때 우선 조건 x에 대해서만 연산한다. 조건 x가 거짓이면, ( x and y )는 거짓이므로 조건 y에 대해서는 연산하지 않는다.
■ 이와 유사하게 복합 조건 ( x or y )를 실행할 때, 먼저 조건 x에 대해서만 연산한 다음, 조건 x가 참이면 ( x or y )는 참이므로 조건 y에 대해서는 연산하지 않는다.
■ 이러한 과정을 단락 연산(short-circuit)이라고 한다. 이러한 단락 연산은 프로그램 성능 개선에 도움이 된다. 예를 들어 조건 y의 계산 시간이 오래 걸린다면, 위와 같은 단락 연산을 통해 불필요한 계산을 건너뛰어 시간을 단축할 수 있다.
4. if 문
■ 프로그래밍에서 조건을 판단하고, 그 조건에 맞는 동작을 수행시키기 위해 사용하는 것이 바로 if 문이다.
4.1 if - else 문
■ 그 중에서 가장 기본적인 문장이 바로 if - else 문이다.
if 조건식:
A
else:
B
Ex)
price = 50000
if price >= 10000:
print('만원 초과')
else:
print('만원 이하')
■ if - else문은 조건식이 참(True)이면 A를 실행하고, 조건식이 거짓(False)이면 B를 실행한다.
■ 위의 예시처럼 '가지고 있는 돈이 만원이거나 만원보다 많다.'라는 '조건식'이 있을 때, 가격이 5만원이라면 조건식은 참이 되어 'print('만원 초과')'라는 문장을 실행한다. 만약 참이 아니라면 'print('만원 이하')'라는 문장이 실행된다.
■ 즉, if - else 문은 조건식이 참이면 if 문의 바로 다음 문장인 if 블록을 실행하고 거짓이면 else 문의 다음 문장인 else 블록을 실행한다. 그러므로 else 문은 if 문 없이 독립적으로 사용할 수 없다.
■ 이러한 점을 이용하여 조건식을 계속 참으로 설정해서 다음과 같이 반드시 if 문의 문장이 실행되는 구조를 만들 수도 있다.
A = True
if A:
print('참')
else:
print('거짓')
- A = True처럼 부울(bool) 값을 저장하는 A와 같은 변수를 부울 변수라고 한다.
cf) 조건문의 콜론(:)
- 조건문 뿐만 아니라 반복문, 함수, 클래스 등을 정의할 때 문장 끝에 콜론(:)을 붙이는 경우가 있다. 콜론은 들여쓰기를 통해 종속되는 코드 블록이 있음을 나타내기 위해 사용된다.
참고) pass
■ pass를 사용하면, 함수나 조건문의 참, 거짓에 따라 실행할 블록을 정의할 때, 아무런 일도 하지 않도록 설정할 수 있다.
fruits = ['apple', 'banana', 'grape']
if 'apple' in fruits:
pass
else:
print(fruits[1:])
■ fruits라는 리스트 안에 'apple'이라는 문자열이 있기 때문에 if 블록 문장이 실행된다. 이때, if 블록 문장은 pass이므로 아무런 동작도 수행하지 않는다. 그래서 결과가 나타나지 않는 것이다.
4.2 조건 연산자
■ 파이썬에는 다음과 같은 형식의 조건 연산자가 있다. if 문의 조건식이 참이면 x가 수식의 결과값이 되고, 거짓이면 y가 수식의 결과값이 된다.
( x if 조건식: else y )
price = 50000
cost = (0 if price >= 10000 else 2000)
cost
```#결과#```
0
````````````
■ 조건 연산자를 감싸는 괄호 ()가 있어야 한다. 괄호로 우선순위를 지정하지 않으면 할당 연산자가 먼저 수행될 수 있다.
■ 이러한 조건 연산자를 이용한 대표적인 예시는 절댓값, 최댓값, 최솟값 계산 등이 있다.
x, y = -10, 10
abs_value = (x if x > 0 else -x) # 절댓값 계산
max_value = (x if x > y else y) # 최댓값 계산
min_value = (x if x < y else y) # 최솟값 계산
print(abs_value, max_value, min_value)
```#결과#```
10 10 -10
````````````
4.3 중첩 if 문
■ if 문 안에 또 다른 if 문이 들어간 형태를 중첩 if 문이라 한다.
■ 중첩 if 문은 조건식이 참인 경우, 다른 if 문이 실행된다. 조건문이 거짓인 경우에도 다른 if 문이 실행될 수 있다.
■ 중첩 if 문은 다음과 같은 구조를 가진다.
if 조건식1:
if 조건식2:
A
else:
B
else:
if 조건식3:
C
else:
D
■ 조건식 1이 참이면 그 안에 있는 if 문의 조건식 2가 실행되고, 조건식 2가 참이면 A, 그렇지 않으면 B가 실행된다.
■ 만약, 조건식 1이 거짓이면 조건식 3이 실행되고, 조건식 3이 참이면 C, 그렇지 않으면 D가 실행되는 구조이다.
name = 'python'
price = 10000
if name == 'python':
if price >=10000:
discount = 100
else:
discount = 0
else:
if price < 10000:
discount = 0
else:
discount = 1000
print(discount)
■ 위의 예시에서 name == 'python'이 True이므로 다음 if 문이 실행된다. pirce >= 10000도 True이므로 discount를 출력했을 때 결과값으로 100이 출력된다.
4.4 연속 if 문 - elif
■ 조건에 따라 다중으로 분기되는 결정을 내려야 하는 경우 if와 else 만으로 다양한 조건을 판단하기 어렵다. 파이썬에서는 다중 조건 판단을 하기 위해 elif(= else if)를 사용해아 하며, elif문은 이전 조건문이 False일 경우 실행된다.
if 조건식1:
A
elif 조건식2:
B
elif 조건식3:
C
else:
D
■ 연속 if 문에서는 순서가 매우 중요하다. 예를 들어 다음과 같은 경우
score = 90
if score >= 60:
print('D')
elif score >= 70:
print('C')
elif score >= 80:
print('B')
elif score >= 90:
print('A')
else:
print('E')
■ score가 90이면 A, B, C, D, E 중 어디에 해당되는지 확인하는 if 문이다. 이와 같이 조건식을 만들면 score >= 60, 70, 80일 때에도 조건식이 True가 되기 때문에 D가 출력될 수 있다. 따라서 score >= 90 조건을 먼저 판단해야 한다.
'파이썬' 카테고리의 다른 글
파일 읽고 쓰기 (0) | 2024.09.03 |
---|---|
제어문(control statement) (2) - 반복문 for, while (0) | 2024.09.02 |
자료형(Data Type) (4) - 세트(집합), 딕셔너리 (0) | 2024.08.24 |
자료형(Data Type) (3) - 튜플, 불(bool) (0) | 2024.08.23 |
자료형(Data Type) (2) - 리스트 (0) | 2024.08.22 |