본문 바로가기

Programming/#Python

[Python] 변수와 연산자 (fin) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 

 

 


이전 게시글

두근두근 파이썬 Chapter 2 변수와 연산자 (2)

2021/01/08 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 2 변수와 연산자 (2) (실습 결과 포함)

[Python] 두근두근 파이썬 Chapter 2 변수와 연산자 (2) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 이전 게시글 두근두근 파이썬 Chapter 2 변수와 연산자 (2) 2021/01/07 - [Programming/#Python] - [Python] 두근두근 파이썬 Chap..

jiwon-lee-it.tistory.com


0. 들어가며

이전 포스팅에서는 다양한 연산자들과 자료형에 대해 알아보았다. 이번 포스팅에서는 다루지 못한 수치 자료형과 복소수 자료형, 그리고 할당 연산자와 더불어 비교, 논리, 비트 연산자에 대해 다뤄볼 것이다. 더불어, 효율적인 협업 등에 중요하게 사용되는 주석문과 사용자로부터 입력받은 값을 토대로 처리하는 input() 함수에 대해서도 다뤄보겠다. 

 

1. 수치 자료형

수치 자료형에는 정수(int)형, 실수(float)형, 부울(bool)형, 문자열(string)형이 있다. 

>>> print(1 + 2) # int
3

>>> print(1.0 + 2.0) # float
3.0

>>> print(1 + 2.0) # float
3.0 # 데이터가 큰 수의 자료형을 따름 (정수형 < 실수형)

>>> print(1 / 2) # float
0.5

>>> print(5.0 == 5.00) # bool
True

 

부동소수점수 (floating point number)

부동소수점수란 컴퓨터가 실수를 표현하는 체계로 불가피한 수치 오류를 동반한다. 가령, 아래와 같이 부호, 지수부, 가수부로 수를 표현할 수 있는데, 이때 실수를 근사치로 표현하기 때문에 정밀도에 한계가 존재한다.

 

 

>>> print(0.1 + 0.1 == 0.2)
True

>>> print(0.1 + 0.1 + 0.1 == 0.3)
False

>>> 0.1 + 0.1 + 0.1 
0.3000000004 # 예상 출력인 0.3과 다름 

>>> 0.1 + 0.1 + 0.1 + 0.1
0.4

>>> 0.1 * 8
0.8

>>> 0.1 * 19.0
1.90000000000001

 

위의 결과를 통해 컴퓨터에서 실수 값은 저장 시 미세한 수치 오류를 포함한다는 것을 알 수 있다. 반면, 파이썬은 아주 큰 정수도 잘 표현한다. 

>>> 10 ** 100 # 거듭제곱 연산
10000000000000000000000000000000000000000000000000000000000000000000000000000000
000000
000000000000000

 

2. 복소수 자료형

파이썬에서는 실수 뿐 아니라 허수 값의 표현도 가능하다. 이때 허수는 다음과 같이 기하학적으로도 표현할 수 있다.

 

허수의 기하학적 표현

 

파이썬에서 복소수를 표현할 때, 수학적 기호 i 대신 j를 사용해야 한다. 이는 i가 파이썬의 키워드로 사용되기 때문이다. 또한, 복소수의 실수부, 허수부에 각각 접근하기 위해서는 real, image 멤버변수를 사용한다. 

# 복소수 표현 실습
>>> c1 = 2 + 3i
SyntaxError: invalid syntax

>>> c1 = 2 + 3j
>>> c1.real # 실수부 출력
2.0

>>> c1.imag # 허수부 출력
3.0

 

실수와 마찬가지로 복소수 간 연산도 가능하다. 이때 복소수의 연산에서는 실수부와 허수부를 각각 계산하는 것이 원칙이다.

# 복소수 간의 연산
>>> c2 = 5 + 6j
>>> c3 = c1 + c2
>>> c3
7 + 9j

>>> c2 = complex(5, 6)
>>> c3 = c1 + c2 
>>> c3
7 + 9j

 

켤레 복소수 (complex conjugate)

켤레 복소수란 복소수의 허수부에 덧셈 역원을 취해 얻을 수 있는 복소수이다. 이는 파이썬의 conjugate() 함수를 통해 구할 수 있고, 해당 복소수의 크기를 알고 싶을 땐 abs() 메소드를 사용할 수 있다. 

# 켤레 복소수의 표현
>>> c1 = 2 + 3j
>>> c2 = c1.conjugate()
>>> c2
2 - 3j

>>> abs(c1)
3.605551275463989

 

켤레 복소수가 유용하게 사용되는 경우는, 원래의 복소수와 곱해주어 허수부를 상쇄시키는 경우이다. 

>>> c3 = c1 * c2
>>> c3
(13 + 0j)

>>> abs(c1) * avs(c1)
12.999999999 # 실수부 13과 유사

 

LAB 2-8: 복소수의 연산
# a = 8 + 2j, b = 4 + 3j
>>> a + b
12 + 5j

>>> a - b
4 - j

>>> a * b
26 + 32j

>>> a / b
(1.52-0.64j)

 

3. 할당 연산자

변수 파트에서도 다뤘던 할당 연산자는 좌변의 변수에 우변의 데이터 값을 할당(assign)하는 기능을 한다. 이때, 다음 스크립트와 같이 하나의 데이터 값에 대해 여러 변수에 한 번에 할당하는 '다중 할당(multiple assignment)'와 변수 각각에 대해 개별 데이터의 값을 동시에 할당하는 '동시 할당'도 가능하다. 

>>> num1 = num2 = num3 = 200 # 다중 할당문
>>> print(num1, num2, num3)
200 200 200

>>> num4, num5 = 300, 400 # 동시 할당문
>>> print(num4, num5)
300 400

 

이외에도 할당 연산자의 몇 가지 성질을 다음 코드를 통해 알아보자.

>>> result1 = 10 * 20
>>> result1
200

>>> result2 = (2 * 3) - (4 ** 2) / 2
-2.0

>>> 300 = 300 # 할당 연산자는 두 값이 동일하다는 의미로 사용되지 않음
...
SyntaxError: can't assign to literal # 리터럴에는 값을 할당할 수 없음'''

>>> str = 'world'
>>> 'hello' = str # 변수와 리터럴의 순서가 바뀜
...
SyntaxError: can't assign to literal

 

다음으로 연산자 파트에서 다루었던 연산자를 활용하여 변수에 값이 할당되는 과정을 알아보자. 아래의 예시에서는 덧셈 연산을 활용해 200 + 100의 결과를 num이라는 변수에 재할당해주었다. 

>>> num = 200
>>> num = num + 100
>>> num
300

 

이러한 할당 과정을 확장하면 다음과 같다.

>>> num = 200
>>> num = num + 100 # 200 + 100의 결과를 num에 할당
>>> num
300

>>> num = num - 100 # 300 - 100의 결과를 num에 할당
>>> num
200

>>> num = num * 20
>>> num
4000

>>> num = num / 2
>>> num
2000.0 # 나머지 연산 적용 시 실수(float)형으로 변형

 

복합 할당 연산자

복합 할당 연산자는 자기 자신에 특정 연산의 결과를 할당하는 기능을 하며, 그 종류와 의미는 다음 표와 같다. 

 

 

>>> num = 200
>>> num += 100
>>> num
300

>>> num -= 100
>>> num
200

>>> num *= 20
>>> num
4000

>>> num /= 2
>>> num 
2000.0

 

4. 비교 연산자

비교 연산자는 두 피연산자의 값을 비교하여 조건에 부합하면 True, 부합하지 않으면 False라는 bool 자료형을 반환하는 연산자이다. 해당 연산자의 종류는 다음과 같다. 

 

 

 

위의 비교 연산자를 응용해보면 다음과 같다. 이때, 주의할 점은 비교연산자 사이에 공백을 삽입하거나, '>=' 연산자에 대해 '=>' 처럼 연산자의 순서를 바꾸면 에러가 뜬다는 것이다.

>>> a, b = 100, 200 # 동시 할당
>>> a == b
False

>>> a != b
True

>>> a > b
False

>>> a < b
True

>>> a >= b
False

 

5. 논리 연산자 (logical operator)

논리 연산자는 and, or, not이 있으며, 비교 연산자와 마찬가지로 그 결과 값으로서 True, False 중 하나의 값을 가지는 부울(bool) 값을 반환한다. 다음은 부울(bool) 값을 가질 수 있는 다양한 경우이다. 이때, bool() 메서드는 값이 없는 인자를 받는 경우에만 False를 반환하기 때문에 데이터 전처리에 유용하게 사용될 수 있다. 

>>> 10 > 20
False

>>> 10 < 20
True

>>> bool(9)
True

>>> bool(-1)
True

>>> bool(0)
False

>>> bool(None)
False

>>> bool("")
False

>>> bool('hello')
True

>>> bool([])
False

>>> bool([10, 20])
True

 

논리 연산은 위와같은 부울(bool) 타입의 데이터를 조합하여 새로운 부울 값을 만드는 기능을 한다. 각각의 논리 연산을 회로로 표현하면 다음과 같다.

 

 

>>> x = True
>>> y = False
>>> x and y
False

>>> x or y
True

>>> not x
False

 

6. 비트 연산자

비트 연산자(bit operator)는 정수형 데이터에 대해 비트 단위로 조작하는 역할을 한다. 유의할 점은 다른 데이터형 (문자열, 리스트, 실수형)에는 적용되지 않고 오로지 정수형(int) 피연산자에 대해서만 연산이 가능하다는 것이다. 이때, 비트 단위 연산자의 종류는 다음과 같다.

 

 

 

이와 같은 비트 연산자를 활용하여 비트 단위 값을 비교해주기 위해서는 다음과 같이 정수형 데이터 값을 비트로 표현되는 2진수 값으로 바꿔주어야 한다. 

# 정수 값의 2진수 출력
>>> bin(9)
'0b1001'

>>> bin(10)
'0b1010'

 

비트 단위 AND 연산

아래와 같이 정수형 데이터 9와 10을 AND 연산자로 연산해주었더니 8이라는 결과가 나왔다. 이는 정수형 9의 2진수 '00001001'와 정수형 10의 2진수 '00001010' 를 비교해 준 결과이다. 즉, 정수형 8은 '00001000'이라는 비트를 갖는다.

>>> 9 & 10
8

>>> bin(8)
'0b1000'

 

비트 단위 OR 연산

마찬가지로 OR 연산에 대해서는 두 자리 중 하나만 1의 비트를 가지고 있어도 1을 반환하기 때문에 '00001011'의 비트를 갖는 11이 출력된다. 

>>> 9 | 10
11

>>> bin(11)
'0b1011'

 

비트 단위 XOR 연산

다음으로 XOR 연산의 경우 자리 수가 같으면 0을, 다르면 1을 반환해주기 때문에 9와 10의 비트 단위 XOR 연산은 '00000011'의 비트를 갖는 3을 반환한다.

>>> 9 ^ 10
3

>>> bin(3)
'0b11'

 

비트 단위 NOT 연산

같은 매커니즘으로 NOT 연산은 비트 1은 0으로, 비트 0은 1로 바꿔 반환해주기에, 다음과 같이 9의 비트 단위 not 연산은 '-0b1010'의 비트를 갖는 -10이 된다. 여기서 최상위 비트는 수의 부호를 결정해주는 역할이기에 (1일 때는 음수 취급) 비트 단위 부정의 결과는 10의 보수 (complement) 값인 -10을 반환한다. (논리 연산자 not 과는 다른 결과)

>>> ~9
-10

>>> bin(-10)
'-0b1010'

 

비트 단위 이동 연산 (시프트 연산 shift operator)

시프트 연산의 경우 지정된 숫자만큼 비트를 이동시켜준다. 다음 예제에서는 4의 비트 '00100'에 대하여 각각 한 비트, 두 비트씩 왼쪽으로 이동시키는데 그 결과 값은 한 비트 이동할 때마다 정확히 2배가 됨을 알 수 있다. 

>>> 4 << 1 # 00100을 한 비트 왼쪽으로 이동
8 # 01000
>>> 4 << 2 # 00100을 두 비트 왼쪽으로 이동
16 # 10000

 

반대로, 같은 시프트 연산에 대하여 이번엔 비트를 오른쪽으로 이동시켜볼 수 있다. 이 경우, 아래와 같이 값이 정확히 1/2배 됨을 확인할 수 있다. 

>>> 4 >> 1 # '00100'을 한 비트 오른쪽으로 이동
2 # 00010

>>> 4 >> 2 # '00100'을 두 비트 오른쪽으로 이동
1 # 00001

 

비트 단위 복합 할당 연산자

비트 단위 연산에 대해서도 산술 연산과 마찬가지로 복합 할당 연산자가 존재한다. 그 종류는 다음과 같다.

 

 

 

LAB 2-9: 비트 연산 활용
# 정수 값의 1/2배 연산
>>> a = 1024
>>> a >> 1
512

>>> a >> 2
256

>>> a = a >> 1
>>> a
512

>>> a = a >> 1
>>> a
256 # 변수 할당으로 이전의 값이 기억된 결과

# 정수 값의 2배 연산
>>> a = 1
>>> a << 1
2

>>> a = a << 1
>>> a
2

>>> a = a << 1
>>> a
4

>>> a = a << 1
>>> a
8

>>> a = a << 1
>>> a
16

 

7. 주석문

주석문은 프로그램 내에서 코드의 기능을 설명하는 용도로 사용하는 문장을 의미한다. 해당 문장에 대해서는 인터프리터가 별도의 해석을 하지 않고 건너 뛴다. 이러한 주석문을 사용하기 위해서는 가장 보편적으로 '#' 기호를 활용한다. '#'기호로 시작하는 문장에 대해서는 전체 줄에 대해 주석문으로 간주된다.

# 원의 반지름을 radius라는 변수로 정의함
radius = 4.0
# 원의 반지름과 면적, 둘레를 각각 출력함
print('원의 반지름', radius)
print('원의 면적', 3.14 * radius *radius) # pi * r^2
print('원의 둘레', 2.0 * 3.14 * radius) # 2 * pi * r

 

위와 같이 코드에 주석을 추가하는 경우 코드의 이해가 훨씬 쉬워지며, 타인과 협업함에 있어서도 코드의 의미를 이해하는데 도움을 줄 수 있다. 마찬가지로 주석은 인터프리터가 해석을 하지 않기 때문에 별도로 실행되지 않는다.

 

여러 줄 주석 처리하기

다음은 여러 줄에 걸친 문장을 주석처리하는 방법이다. 이때 주의할 점은 작은 따옴표(')와 큰 따옴표(")를 혼용해 사용하면 안 된다는 것이다. 

'''
작은 따옴표를 이용하여 여러 줄 주석을 만들 수 있다.
이 방식으로 주석을 달면
여러 줄에 걸친 주석을 남길 수 있다.
'''

"""
큰 따옴표도 이용할 수 있다.
작은 따옴표를 사용하는 것과 동일하다.
"""

 

8. input() 문

사용자로부터 입력받은 값을 활용하기 위해서는 input() 메소드를 사용할 수 있다. 이 함수는 사용자가 입력한 값에 대해 기본적으로 문자형(string)으로 받아들인다. 따라서 정수형 등 입력 값의 형태를 재정의하고 싶을 때는 int(input())과 같이 형태를 변형해주어야 한다.

>>> name = input('이름을 입력하세요: ') 
이름을 입력하세요: 홍길동 # 문자열로 인식

>>> print('이름: ', name)
이름: 홍길동

>>> age = int(input('나이를 입력하세요: '))
나이를 입력하세요: 24 # 문자열로 입력받아 int 형으로 변환

>>> print('10년 후의 나이: ', age + 10) # int형이므로 덧셈 연산이 가능
10년 후의 나이: 34 

 

LAB 2-10: 사용자 입력 받기
# 문항 2
>>> name = input('이름을 입력하세요: ')
이름을 입력하세요: 김유신

>>> print(name, '님이 입장하셨습니다.')
김유신 님이 입장하셨습니다.

>>> m = int(input('숫자 m을 입력하세요: '))
숫자 m을 입력하세요: 30

>>> n = int(input('숫자 n을 입력하세요: '))
숫자 n을 입력하세요: 50

>>> print('m + n =', m + n)
m + n = 80

>>> print('m - n =', m - n)
m - n = -20

# 문항 3
>>> radius = int(input('원의 반지름을 입력하세요: '))
원의 반지름을 입력하세요: 3

>>> print('원의 반지름:', 3.14 * radius * radius)
원의 반지름: 28.259999999999998

 


다음 게시글

두근두근 파이썬 Chapter 3 제어문 (1)

2021/01/10 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 3 제어문 (1) (실습 결과 포함)

[Python] 두근두근 파이썬 Chapter 3 제어문 (1) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 이전 게시글 두근두근 파이썬 Chapter 2 변수와 연산자 (fin) 2021/01/09 - [Programming/#Python] - [Python] 두근두근 파이썬 Ch..

jiwon-lee-it.tistory.com

 


 

 

 

 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)