Skip to content

2.03. 내용정리: 3일차

흔한 찐따 edited this page Mar 15, 2022 · 1 revision

조건문

조건문이란 특정 조건을 만족시키는 경우를 나타낸 문법적인 요소이며, ifelif , else 로 표현한다.

예시

  • if 키워드를 단독으로 사용하는 경우
a = 1
b = 1

if a is b:
    print('a is same to b.')
  • ifelse 를 같이 사용하는 경우
a = 1
b = 1

if a is b:
    print('a is same to b.')
else:
    print('a is not same to b.')
  • ifelif , else 를 같이 사용하는 경우
    • if 문의 조건이 참일 경우에는 if 문만 실행된다.
    • if 문이 거짓일 경우에는 elif 문의 조건이 참인지 확인한다.
    • 만약 elif 문이 참일 경우, else 문은 실행되지 않는다.
    • if 문과 elif 문이 모두 거짓일 경우, 최종적으로 else 문이 실행된다.
    • elif 문은 여러 번 사용할 수 있다.
a = 1
b = 1
c = 2

if a is b:
    print('a is same to b.')
elif a is c:
    print('a is same to c.')
elif a is not b:
    print('a is not same to b.')
else:
    print('a is not same to b and c.')
  • 변수 선언시 조건식에 따라 값을 대입하는 경우
a = 1
b = 2 if a == 1 else 3

print('a:', a)
print('b:', b)

논리 연산자

키워드

정리표

키워드 설명
A is B A와 B의 메모리 주소값이 같다면 참(True), 아니면 거짓(False)
not A A의 부정 표현
A and B A와 B 모두 참이면 참, 아니면 거짓
A or B A와 B 둘 중 하나만 참이어도 참, 둘 다 거짓이면 거짓

주의사항

  • andor 키워드는 값이 없는 경우( None 타입일 경우 )에는 거짓이다.
    • 숫자 타입(정수, 실수, 복소수)은 값이 0 일 경우 거짓
    • 리스트 타입은 [] , 튜플 타입은 () , 집합 타입은 set() , 불변집합 타입은 frozenset() , 딕셔너리 타입은 {} 일 경우 거짓
  • is 키워드는 메모리 주소(memory address)를 비교하는 키워드이다.
    • 메모리는 컴퓨터 메모리 카드의 논리적 메모리(Logical memory)를 뜻하고 메모리 주소는 논리적 메모리의 고유 주소이다.
    • 잘 이해가 안 가서 더 찾아보니까 메모리 주소는 간단히 말해 변수가 가지는 고유한 번호라고 생각하면 된다고 한다.
    • 파이썬에서는 id 함수를 통해 메모리 주소를 확인할 수 있다.
    • 즉, is 키워드는 변수의 id 값이 같다면 참, 아니면 거짓이다.
    • 따라서 제대로 된 값을 비교하려면 아래의 연산자 기호 표에 나와있는 연산자 기호를 사용해서 비교해야 한다.
    • ex.
a = 1
b = 2

c = id(a)
d = id(b)

print('a memory address (id):', c)
print('b memory address (id):', d)

# a라는 변수의 주소값과 c라는 변수의 주소값을 비교하므로 이는 거짓
print('a is c:', a is c)

e = a
f = id(e)
print('e memory address:', f)

# e와 a의 주소값이 같으므로 이는 참
print('e is a:', e is a)

is 키워드 사용 시 이상한 방식으로 참과 거짓이 나오는 경우

아래의 코드를 실행하면 계속 참이 나왔다.

a = 1
b = 1
c = id(a)
d = id(b)

# 주소값이 같음
print('a memory address:', c)
print('b memory address:', d)
# 참
print(a is b)

분명히 위의 설명대로라면 ab 라는 변수는 다른 메모리 주소값을 가져야하지만 그렇지 않았다. 나는 왜 그런지 이유를 도저히 모르겠다. 그런데 밑의 코드는 또 결과가 다르게 나온다.

a = 1000
b = 1000
c = id(a)
d = id(b)

# 주소값이 다름
print('a memory address:', c)
print('b memory address:', d)
# 그래서 거짓이 나옴
print(a is b)

이게 왜 이러는 건지 몰라서 이 원인에 대해 구글링해서 찾아보았다. 컴퓨터 메모리는 구조가 굉장히 다양한데, 그 중 캐시 메모리(Cache memory)라는 것이 존재하며, 파이썬도 이 캐시 메모리라는 것을 사용한다. 파이썬에서는 -5 부터 256 까지의 정수는 캐시 메모리라는 것을 통해 메모리 주소를 공유하여 사용한다고 한다. 그래서 위의 주의사항 항목에서 비교 연산자를 사용해야 한다고 했던 것이었다.

비교 연산자 기호

정리표

기호 설명
A == B A와 B의 값이 같다면 참(True), 아니면 거짓(False)
A != B A와 B의 값이 다르다면 참, 아니면 거짓
A > B A가 B보다 값이 크다면 참, 아니면 거짓
A < B A가 B보다 값이 작다면 참, 아니면 거짓
A >= B A가 B보다 값이 같거나 크다면 참, 아니면 거짓
A <= B A가 B보다 값이 같거나 작다면 참, 아니면 거짓