프로그래밍언어의 핵심 기능 중의 하나가 바로 컴퓨터에 저장된 값을 조작하는 일이다. 이번 장에서는 가장 많이 활용되는 값의 종류를 소개하고, 새로운 값을 생성하는 다양한 연산자를 소개한다.
값의 종류¶
변수에 할당해서 저장할 수 있는 대상이 값values이다. 파이썬의 대표적인 값은 정수, 부동소수점, 문자열, 부울값, 리스트 등이다. 이외에 튜플, 사전, 파일 등 다양한 값들이 존재하며, 앞으로 다양한 값들을 살펴볼 것이다.
정수
-13798, -7, 0, 17, 41, 87356112 등 일상적으로 사용되는 정수를 가리킨다.
부동소수점
1.0, -9.74, 3.141592, 0.0000072172765 등 유한소수를 프로그래밍 분야에서는
부동소수점이라 부른다.
유한한 것만 다룰 수 있는 컴퓨터 자체의 한계로 인해 컴퓨터는 유리수와 무리수를 포함한 모든 실수를 불완전하게 다룰 수밖에 없다. 따라서 파이썬을 포함하여 모든 프로그래밍 언어는 모두 소수점 이하 적당한 자리까지만 계산된 유한소수만 다룬다.
소수점 이하 몇 자리까지 계산될 것인가는 컴퓨터와 프로그램 환경에 따라 달라진다.
예를 들어, 1/3이 0.333333, 0.333333333, 0.333333333333 중에 어떤 값으로 계산될 것인가는 상황에 따라 달라진다.
이런 의미에서 유한소수를
부동소수점floating points,
즉 고정되지 않은 유한소수라 부른다.
문자열
'파이썬 좋아요;-)', "Hello, World!" 등과 같이
컴퓨터 키보드를 이용하여 입력할 수 있는 임의의 문자, 숫자, 기호의 조합으로 구성된 값이 문자열이다.
모든 문자열을 작은따옴표 또는 큰따옴표로 감싸여야 한다.
예를 들어, 정수 17과 문자열 '17'은 서로 다른 종류의 값이며, 따라서 두 값은 서로 동일하지 않다.
정수 17은 더 이상 쪼갤 수 없는 하나의 값인 반면에,
문자열 '17'는 '1'과 '7' 두 개의 정수 문자를 항목으로 갖는 값이다.
부울값
참과 거짓을 의미하는 True와 False를
부울값Boolean value
또는 진릿값이라 한다.
리스트
리스트는 여러 개의 값으로 구성된 목록을 가리키는 값이다.
리스트에 포함된 각각의 값은 항목item이라 부른다.
리스트는 대괄호 [] 로 항목들의 목록을 감싸고, 각각의 항목은 쉼표 기호 , 로 구분한다.
예를 들어, 1부터 5까지의 정수로 구성된 리스트를 가리키는 변수
one2five를 다음과 같이 정의한다.
one2five = [1, 2, 3, 4, 5]반면 아래 name_list 변수는 6명의 이름, 즉 6개의 문자열로 구성된 리스트를 가리킨다.
name_list = ['김강현', '황현', '남세원', '최흥선', '김현선', '함중아']리스트에 포함된 항목들이 반드시 동일한 종류일 필요는 없다.
예를 들어, 아래 리스트는 김강현의 이름, 전화번호, 나이, 키, 출생지로 구성된
리스트를 가리키는 kgh 변수를 정의한다.
항목중에 이름, 전화번호, 출생지는 문자열, 나이는 정수, 키는 부동소수점이다.
kgh = ['김강현', '010-1234-5678', 20, 172.3, '제주']연산, 연산자, 값¶
연산
연산operation은 일반적으로 정수, 유리수, 실수 등을 대상으로 하는 사칙연산, 크기 비교 연산 등을 의미한다. 반면에 컴퓨터 프로그래밍에서는 정수, 부동소수점 이외에 문자열, 리스트 등 보다 다양한 종류의 값들에 대해서도 고유의 연산이 지원된다.
연산자
연산자operator는 연산을 위해 사용되는 기호를 가리킨다.
예를 들어, 2에 3을 더하는 연산은 2 + 3으로, 3.14에서 2.3을 빼는 연산은 3.14 - 2.3 으로 표현한다.
연산 표현식에 사용되는 +, - 등이 연산자이다.
프로그래밍에서 가장 많이 사용되는 연산자는 다음과 같다.
사칙 연산자:
+,-,*,/동치 여부 판단 연산자:
==,!=크기 비교 연산자:
<,<=,>,>=
언급된 연산자들이 정수와 부동소수점의 연산에 사용되면 일반적으로 사용되는 연산과 동일하다. 반면에 다른 종류의 값과 함께 사용될 수 있으며, 사용되는 값에 따라 연산이 작동하는 방식이 달라진다.
값
정수와 부동소수점을 이용한 사칙연산의 결과가 새로운 정수 또는 부동소수점이듯이
모든 연산의 결과 또한 하나의 값value이다.
따라서 연산의 결과값 또한 변수에 할당하여 필요에 따라 활용될 수 있다.
예를 들어, 아래 코드는 1에 2를 더한 값 3을 onePtwo 변수에 할당한 다음,
그 값에 7을 곱한 값인 21을 result 변수에 할당한다.
onePtwo = 1 + 2
result = onePtwo * 7
print(result)21
프로그래밍의 핵심은 주어진 값을 이용하여 원하는 새로운 값을 생성하는 다양한 방식과 절차를 묘사하는 과정이다. 여기서는 일반적으로 사용되는 숫자들의 사칙연산과는 다르게 작동하는 기초적이며 매우 중요한 연산 몇 가지를 살펴 본다.
비교 연산자¶
두 값의 비교 연산은 크게 동치 여부를 판단하는 연산과 크기를 비교하는 연산으로 나눌 수 있다. 먼저 동치 여부를 확인하는 연산자를 살펴본 뒤, 이어서 크기를 비교하는 연산자를 설명한다.
동치 여부 판단 연산자¶
동치 여부 판단 연산은 두 개의 값이 주어졌을 때 두 값이 동일한 값인지 아닌지 여부를 판단할 때 활용하며,
다음 두 가지 방식으로 표현된다.
아래 표에서 a와 b는 임의의 값을 가리킨다.
| 동치 여부 판단 연산 | 의미 |
|---|---|
| a == b | a와 b가 동일한 값일 때 True로, 서로 다른 값일 때 False로 계산 |
| a != b | a와 b가 서로 다른 값일 때 True로, 동일한 값일 때 False로 계산 |
예를 들어 아래 코드는 4를 4.0으로 나눈 값이 1과 동일한 값인지를 판단한다.
이유는 4/4.0이 1.0으로 계산되고, 1과 1.0을 파이썬은 동일하다고 취급하기 때문이다.
따라서 아래 코드는 최종적으로 True로 계산된다.
1 == 4/4.0True반면에 다음 동치 여부 판단 코드는 False로 계산된다.
이유는 1.1과 4/4.0이 의미하는 1.0은 동일한 값이 아니기 때문이다.
1.1 == 4/4.0False연산자 !=는 주어진 두 값이 서로 다른 값인지 여부를 판단한다.
따라서 두 값이 다르면 True로, 동일하면 False로 계산된다.
예를 들어, 1과 2는 서로 다른 값이기에 아래 코드는 True로 계산된다.
1 != 2True반면에 1과 4/4.0이 의미하는 1.0은 동일한 값이기에 아래 코드는 False로 계산된다.
1 != 4/4.0False크기 비교 연산자¶
크기 비교 연산은 두 개의 값이 주어졌을 때 어떤 값이 더 큰지, 작은지 등을 판단할 때 활용하며,
다음 네 가지 방식으로 표현된다.
아래 표에서 a와 b는 임의의 값을 가리킨다.
| 크기 비교 연산 | 의미 |
|---|---|
| a < b | a가 b보다 작을 때 True로, 아니면 False로 계산 |
| a <= b | a가 b보다 작거나 같을 때 True로, 아니면 False로 계산 |
| a > b | a가 b보다 클 때 True로, 아니면 False로 계산 |
| a >= b | a가 b보다 크거나 같을 때 True로, 아니면 False로 계산 |
숫자와 함께 사용되는 크기 비교연산은 일반적으로 알려진 방식과 동일하게 작동한다.
예를 들어 3이 4보다 크기 않기 때문에 아래 코드는 False로 계산된다.
3 > 4False반면에 아래 두 코드 모두 True로 계산됨을 바로 알 수 있다.
3 >= 4 - 1True3 >= 4 - 2True연산자 < 와 연산자 <= 또한 두 개의 숫자를 비교할 때 상식적으로 작동한다.
예를 들어 아래 코드는 False로 계산된다.
이유는 3/2 + 1.2는 2.7로 계산되고 3/2는 1.5로 계산되는데
2.7은 1.5보다 작지 않기 때문이다.
3/2 + 1.2 < 3/2False반면에 아래 두 코드는 True로 계산됨을 바로 알 수 있다.
2.3 < 1.8 + 3.2True2.3 <= 1.8 + 3.2True사전식 문자열 비교 연산
두 값의 비교 연산은 정수, 부동소수점 뿐만 아니라 문자열 등 일부 다른 종류의 값들에 대해서도 가능하다.
대표적으로 문자열의 크기 비교가 종종 활용되며, 두 문자열 중에 누가 더 큰지를 판단하는 기준으로 알파벳 순서를 활용한다.
예를 들어, ㄱ은 ㄴ보다, 가는 나보다, a는 b보다 작다.
'ㄱ' < 'ㄴ'True'가' < '나'True'a' < 'b'True그리고 가나다는 나다보다, 도장은 서명보다, apple은 banana보다, baseball은 basic보다 작다.
'가나다' < '나다'True'도장' < '서명'True'apple' < 'banana'True'baseball' < 'basic'True반면에 도장은 고무도장보다, nano banana는 banana보다 작지 않다.
'도장' < '고무도장'False'nano banana' < 'banana'False그리고 apple은 Apple보다 크다.
'apple' > 'Apple'True사실 영어 알파벳 소문자로 시작하는 문자열은 무조건 대문자 알파벳으로 시작하는 문자열보다 크다.
'a' > 'Hello'True'hello' > 'Hi'True사전식 문자열 크기 비교의 판단 기준을 정리하면 다음과 같다.
두 문자열을 첫 번째 문자부터 차례대로 비교
다른 문자를 발견하면 즉시 두 문자열의 크기 비교 판단
같은 위치에서 다른 문자가 나오면, 그 문자들의 크기에 따라 전체 문자열의 크기 비교 판단
각 문자의 크기는 유니코드 포인트 값으로 크기 비교.
예: ‘a’ < ‘b’, ‘A’ < ‘a’, ‘고무도장’ < ‘고무장갑’
한 문자열이 다른 문자열의 앞부분과 일치하면 짧은 문자열이 더 작다고 판단
예: ‘도장’ < ‘도장직인’, ‘apple’ < ‘apple파이’
유니코드¶
유니코드Unicode란 전 세계 모든 문자를 하나의 표준 체계로 정의해 각 문자에 고유한 번호를 부여하는 국제 문자 인코딩 표준이다. 각 문자에 부여된 고유 번호를 유니코드 코드 포인트Unicode code point 또는 단순히 코드 포인트라 부른다.
예를 들어, 한글 자음 ㄱ, ㄲ, ㅎ의 코드 포인트는 각각 12593, 12594, 12622다.
문자의 코드 포인트는 ord() 함수를 이용하여 확인할 수 있다.
ord('ㄱ')12593ord('ㄲ')12594ord('ㅎ')12622반면에 한글 모음 ㅏ와 ㅑ의 코드포인트는 다음과 같다.
ord('ㅏ')12623ord('ㅑ')12625영어 알파벳의 코드 포인트는 다음과 같다.
| 문자 | 코드 포인트 (Hex) | 코드 포인트 (Decimal) |
|---|---|---|
| a | U+0061 | 97 |
| ⋮ | ⋮ | ⋮ |
| z | U+007A | 122 |
| A | U+0041 | 65 |
| ⋮ | ⋮ | ⋮ |
| Z | U+005A | 90 |
문자열과 리스트 연산¶
사칙연산에 사용되는 기호 중에서 연산자 +와 *는 문자열과 리스트에 적용될 때 특별한 방식으로 동작한다.
+는 두 값을 이어붙이는 연산으로, *는 특정 횟수만큼 복제한 뒤 이어붙이는 연산으로 해석된다.
이 두 연산자 이외에 리스트와 문자열 고유의 연산 두 종류를 함께 소개한다.
이어붙이기¶
문자열 이어붙이기
문자열 두 개에 대해 + 연산자를 적용하면 단순히 두 문자열을 이어붙인 문자열이 계산된다.
아래 코드를 실행하면 '파이썬, '과 '안녕' 두 문자열을 이어붙이는 연산 결과가 확인된다.
'파이썬, ' + '안녕!''파이썬, 안녕!'아래 코드는 변수를 활용한 동일한 연산을 보여준다.
first = '파이썬, '
second = '안녕!'
greetings = first + second
greetings'파이썬, 안녕!'리스트 이어붙이기
리스트에 대해서도 유사하게 작동한다.
아래 코드는 리스트 이어붙이기 연산의 작동법을 보여주기 위해
먼저 다음과 같이 리스트를 가리키는 변수 first_languages와 second_languages를 정의한다.
first_languages = ['파이썬', 'C', '자바']
second_languages = ['C++', 'C#', '자바스크립트', 'Node.js']아래 코드는 first_languages와 second_languages가 가리키는 문자열에 대해 + 연산의 결과를
languages 변수에 할당한다.
languages = first_languages + second_languages
languages['파이썬', 'C', '자바', 'C++', 'C#', '자바스크립트', 'Node.js']변수를 이용하지 않고 두 리스트를 바로 이어붙여도 된다.
['파이썬', 'C', '자바'] + ['C++', 'C#', '자바스크립트', 'Node.js']['파이썬', 'C', '자바', 'C++', 'C#', '자바스크립트', 'Node.js']복제¶
문자열 또는 리스트를 정수와의 곱셈 형식으로 연산을 실행하면
주어진 문자열 또는 리스트를 지정된 정수만큼 복제해서 이어붙인 문자열 또는 리스트로 계산된다.
예를 들어, 아래 코드는 greetings 변수가 가리키는 문자열 '파이썬, 안녕!을 세 번 복제해서 단순히 이어붙인 문자열을 계산한다.
greetings * 3
greetings * 3'파이썬, 안녕!파이썬, 안녕!파이썬, 안녕!'리스트에 대해서도 유사하게 작동한다.
예를 들어, 아래 코드는 3개의 항목을 갖는 리스트를 가리키는 first_languages 변수와 2에 대해 * 연산자를 적용한 결과를 보여준다.
연산 결과는 first_languges 변수가 가리키는 리스트 ['파이썬', 'C', '자바']를 두 번 복제해서 이어붙인,
6개의 항목을 갖는 리스트이다.
first_languages * 2['파이썬', 'C', '자바', '파이썬', 'C', '자바']항목 확인¶
문자열과 리스트는 여러 항목으로 이루어진 값이다.
특정 값이 문자열이나 리스트에 포함되어 있는지 확인할 때는 in 연산자를 사용한다.
문자열 in 연산자
문자열에 특정 문자나 기호가 항목으로 포함되어 있는지 여부는 in 연산자를 이용하여 확인한다.
연산 결과는 포함되어 있는지 여부에 따라 True 또는 False 부울값이다.
아래 코드는 다양한 예제를 통해 greetings 변수가 가리키는 문자열에 포함된
지정된 기호와 문장의 포함여부를 판정해 준다.
'!' in greetingsTrue'?' in greetingsFalse'파' in greetingsTrue앞서 설명한 바대로 공백 문자 또한 포함되어 있다.
' ' in greetingsTrue문자열 in 연산자는 하나의 문자나 기호만이 아니라 부분 문자열 여부도 판단한다.
예를 들어, 아래 코드는 '파이썬'이 '파이썬, 안녕!'에 부분 문자열로 포함되어 있음을 확인해준다.
'파이썬' in greetingsTrue', ' in greetingsTrue문자나 기호가 연속적으로 이어진 경우에만 부분 문자열로 인정된다.
예를 들어, '파'와 '썬'이 모두 '파이썬, 안녕!'에 포함되어 있다 하더라도
'파썬'은 부분 문자열로 인정받지 못한다.
'파썬' in greetingsFalse'파이썬 안녕'도 마찬가지로 부분 문자열이 아니다.
'파이썬 안녕' in greetingsFalse리스트 in 연산자
리스트에 항목으로 포함되어 있는지 여부는 in 연산자를 이용하며 결과는
부울값으로 계산된다.
예를 들어 파이썬은 first_languages가 가리키는 리스트에 포함되어 있고,
자바는 second_languages가 가리키는 리스트에 포함되어 있지 않다.
'파이썬' in first_languagesTrue'자바' in second_languagesFalse리스트 in 연산자는 항목이 온전히 찾는 값과 일치할 때에만 True로 계산한다.
따라서, 항목이 문자열인 경우 부분 문자열로의 포함 여부는 모두 False로 간주한다.
'파이' in first_languagesFalse인덱싱¶
인덱스와 인덱싱
문자열은 여러 문자나 기호가 순서대로 나열된 값이며, 리스트는 여러 값이 모여 있는 자료형이다. 문자열의 각 문자와 리스트의 각 항목은 위치를 나타내는 번호를 통해 접근할 수 있다. 이 번호를 인덱스index 라고 부르며, 맨 왼쪽에 있는 항목부터 차례대로 0, 1, 2 … 와 같은 정수 번호가 부여된다.
예를 들어, "Python" 문자열에 포함된 각 문자의 인덱스는 다음과 같다.
| 항목 | P | y | t | h | o | n |
|---|---|---|---|---|---|---|
| 인덱스 | 0 | 1 | 2 | 3 | 4 | 5 |
리스트 [10, 20, 30, 40, 50]에 포함된 각 항목의 인덱스는 다음과 같다.
| 항목 | 10 | 20 | 30 | 40 | 50 |
|---|---|---|---|---|---|
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
음의 정수도 인덱스로 사용할 수 있다. 맨 오른쪽에 위치한 항목부터 왼쪽으로 이동하면서 차례대로 -1, -2, -3 등의 음의 인덱스를 갖는다.
문자열 "Python"에 포함된 각 문자에 대한 음수 인덱스는 다음과 같다.
| 항목 | P | y | t | h | o | n |
|---|---|---|---|---|---|---|
| 인덱스 | -6 | -5 | -4 | -3 | -2 | -1 |
반면에 리스트 [10, 20, 30, 40, 50]에 포함된 각 항목에 대한 음수 인덱스는 다음과 같다.
| 항목 | 10 | 20 | 30 | 40 | 50 |
|---|---|---|---|---|---|
| 인덱스 | -5 | -4 | -3 | -2 | -1 |
인덱스를 사용하면 문자열이나 리스트에서 원하는 위치의 항목을 확인하고 활용할 수 있다.
이러한 과정을 인덱싱indexing이라고 부른다.
인덱싱은 대괄호([]) 연산자를 이용하여 수행한다.
문자열 인덱싱
설명을 위해 문자열 김강현 을 변수 kgh에 할당해보자.
kgh = '김강현'
print(kgh)김강현
문자열 김강현에서 김은 0번 인덱스의 항목이다.
kgh[0]'김'반면에 현은 문자열 김강현의 2번 인덱스의 항목이다.
kgh[2]'현'리스트 인덱싱
리스트 인덱싱 또한 유사하게 작동한다.
설명을 위해 name_list가 가리키는 리스트를 활용한다.
print(name_list)['김강현', '황현', '남세원', '최흥선', '김현선', '함중아']
가장 왼쪽에 위치한 항목, 즉 0번 인덱스의 항목을 확인하는 방법은 다음과 같다.
print(name_list[0])김강현
왼쪽에서 세번째 항목은 인덱스가 2이기에 다음과 같이 확인한다.
print(name_list[2])남세원
음수 인덱스 활용
문자열이나 리스트에서 오른쪽 끝에 있는 항목을 양수 인덱스로 지정하려면 전체 항목의 개수를 알아야 한다.
그러나 음수 인덱스를 사용하면 항목의 개수를 알지 못해도 마지막 요소를 손쉽게 가져올 수 있다.
예를 들어 name_list가 가리키는 리스트의 가장 오른쪽에 위치한 항목은
음수 -1을 인덱스로 지정하여 확인한다.
print(name_list[-1])함중아
오른쪽 끝에서 두 번째 항목의 인덱스는 -2이며, name_list에 적용하면 '김현선'으로 확인된다.
print(name_list[-2])김현선
문자열에 대해서도 동일한 방식으로 음수 인덱스를 활용할 수 있다.
문자열 '김강현'의 마지막 문자는 음수 인덱스 -1로 확인된다.
print(kgh[-1])현
아래 코드는 문자열 '파이썬, 안녕!'에 포함된 마지막 문자인 느낌표라는 사실을 확인해준다.
print('파이썬, 안녕!'[-1])!
끝에서 3번째 문자는 '안'이다.
print('파이썬, 안녕!'[-3])안
연산자 우선순위¶
여러 종류의 연산자를 이용할 경우 연산자들 사이의 우선순위를 고려해야 의도한 대로 계산된다. 정수와 부동소수점 관련 연산자들의 우선순위는 수학에서 배운 것과 동일하다.
괄호 안에 있는 표현식을 가장 먼저 계산한다.
2 * (3 - 1) => 2 * 2 => 4
(1 + 1) ** (5 - 2) => 2 ** (5 - 2) => 2 ** 3 => 8곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다.
2 * 3 - 1 => (2 * 3) - 1 => 6 - 1 => 5
6 + 4 / 2 => 6 + (4 / 2) => 6 + 2.0 => 8.0곱셈과 나눗셈은 서로 우선순위가 같다. 덧셈과 뺄쎔도 서로 우선순위가 같다. 같은 우선순위를 갖는 사칙 연산자가 연속해서 사용되면 왼쪽에 위치한 연산부터 먼저 실행된다.
60 / 2 * 3 => (60 / 2) * 3 => 30.0 * 3 => 90.0만약에 오른쪽에 위치한 곱셈을 먼저 실행하면 다른 결과가 나온다.
60 / (2 * 3) => 60 / 6 => 10.0연산자 우선순위¶
여러 종류의 연산자를 이용하여 값을 계산하는 식을 표현할 경우 연산자들 사이의 우선순위를 고려해야 의도한 대로 계산된다. 파이썬의 연산자 우선순위는 수학의 사칙연산 규칙과 유사하며, 이는 문자열과 리스트 연산에도 적용된다.
사칙 연산 우선순위¶
수학에서와 마찬가지로 곱셈 *과 나눗셈 /이 덧셈 +과 뺄셈 -보다 우선순위가 높다.
아래 코드는 2와 3을 곱한 6에서 1을 뺀 값을 계산한다.
2 * 3 - 15연산자의 우선순위에 반하는 연산 순서를 지정하려면 괄호 ()를 사용해야 한다.
예를 들어, 아래 코드는 3에서 1를 먼저 뺀 값에 2를 곱한 값을 계산한다.
이전 코드와 결과가 다름에 주의한다.
2 * (3 - 1)4문자열과 리스트 연산 우선순위¶
문자열과 리스트를 조작할 때 사용하는 + (이어붙이기)와 * (복제) 연산자 사이에도 우선순위가 적용된다.
수학에서 곱셈이 덧셈보다 먼저 계산되는 것처럼, 복제(*)가 이어붙이기(+)보다 먼저 계산된다.
다음은 문자열에 대한 예시다. '안녕!' 문자열이 먼저 3번 복제된 후, '파이썬, ' 문자열과 합쳐진다.
'파이썬, ' + '안녕!' * 3'파이썬, 안녕!안녕!안녕!'아래 코드를 실행하면 '파이썬, '은 3번, '안녕!'은 2번 각각 먼저 복제된 후에 합쳐진다.
'파이썬, ' * 3 + '안녕!' * 2'파이썬, 파이썬, 파이썬, 안녕!안녕!'리스트에 대해서도 동일한 규칙이 적용된다.
아래 코드를 실행하면 [30, 40, 50] 리스트가 먼저 2번 복제된 뒤, [10, 20] 리스트와 합쳐진다.
[10, 20] + [30, 40, 50] * 2[10, 20, 30, 40, 50, 30, 40, 50]아래 코드를 실행하면 두 리스트가 각각 2번 복제된 뒤에 합쳐진다.
[10, 20] * 2 + [30, 40, 50] * 2[10, 20, 10, 20, 30, 40, 50, 30, 40, 50]비교 연산 우선순위¶
동치 여부나 크기를 비교하는 연산자는 산술 연산자보다 우선순위가 낮다. 따라서 수식이 포함된 비교문에서는 계산이 먼저 끝난 뒤에 동치 여부나 크기 비교가 이루어진다.
10 + 20 > 5 * 5True문자열 비교에서도 예를 들어 복제 연산이 동치 여부 판단 연산보다 먼저 수행된다.
'a' * 2 == 'aa'True인덱싱 우선순위¶
인덱싱은 사칙 연산이나 이어붙이기, 복제보다 우선순위가 더 높다.
즉, 지정된 위치의 항목을 가져오는 인덱싱이 가장 먼저 수행된다.
아래 예제에서 문자열 'Python'의 0번 인덱스인 'P'를 먼저 가져온 후, 이를 3번 복제한다.
'Python'[0] * 3'PPP'만약 문자열 전체를 먼저 복제한 다음에 인덱싱을 적용하고 싶다면 괄호를 사용해야 한다.
('Python' * 2)[0]'P'리스트의 경우도 항목을 먼저 가져온 후 산술 연산을 수행한다. 아래 코드는 [1, 2, 3]에서 2번 인덱스인 3을 먼저 가져온 뒤, 10을 더해 13이 된다.
[1, 2, 3][2] + 1013예제¶
예제 1
먼저 아래와 같이 변수를 정의한다.
number = 17언급된 값을 표현하는 수식을 number 변수를 이용하여 표현한 다음에 실행하여라.
(1) number 더하기 2
답:
number + 219(2) number 빼기 2.0
답:
number - 2.015.0(3) number 나누기 7
답:
number / 72.4285714285714284(4) number를 7로 나눴을 때의 몫
답:
number // 72(5) number를 7로 나눴을 때의 나머지
답:
number % 73(6) number의 세제곱을 (2 + 3)으로 나누기
답:
number**3 / (2 + 3)982.6그런데 아래와 같이 하면 다른, 따라서 틀린 값이 나온다.
number**3 / 2 + 32459.5이유는 나눗셈 연산자 /의 우선순위가 덧셈 연산자 + 보다 높아서 위 수식은 아래 수식처럼 계산되기 때문이다.
(number**3 / 2) + 32459.5예제 2
아래 코드를 실행했을 때 부동소수점 27.1이 어떻게 이해되는지를 설명하라.
if 27.1:
print("참인 경우라서 실행됨!")참인 경우라서 실행됨!
답:
파이썬에서 0은 False로, 다른 값은 True로 간주된다.
이런 의미로 if 27.1에 사용된 27.1은 부동소수점이면서 0이 아니기에
True로 간주되어 조건문의 본문에 포함된 print() 함수가 실행된다.
예제 3
아래 내용의 논리식을 할당받는 변수 p1을 정의한 후에 p1에 할당된 진리값을 확인한다.
3과 4가 다른지 여부 판단
답:
아래 코드는 두 값이 다른지 여부는 != 연산자를 이용하여 표현한다.
p1 = 3 != 4
print(p1)True
예제 4
아래 내용의 논리식을 할당받는 변수 p2를 정의한 후에 p2에 할당된 진리값을 확인한다.
"hello"와 "hi"가 같은지 여부 판단
답:
아래 코드는 두 값이 동일한지 여부는 == 연산자를 이용하여 표현한다.
p2 = "hello" == "hi"
print(p2)False
예제 5
15, 28이 각각 짝수인지 또는 홀수인지를 판별하는 코드를 작성한다. 출력된 결과는 아래와 같은 형식이어야 한다.
15는 짝수인가요? False
28은 짝수인가요? True
힌트: 짝수는 2로 나눴을 때 나머지가 0이다.
답:
15가 짝수인지 여부는 15 % 2 == 0 가 True로 계산되는지로 확인한다.
print("15는 짝수인가요?", 15 % 2 == 0)
print("28는 짝수인가요?", 28 % 2 == 0)15는 짝수인가요? False
28는 짝수인가요? True
변수를 사용하면 좀 더 편리할 수도 있다.
even15 = 15 % 2 == 0
even28 = 28 % 2 == 0
print("15는 짝수인가요?", even15)
print("28는 짝수인가요?", even28)15는 짝수인가요? False
28는 짝수인가요? True
예제 6
변수 second_languages는 아래 리스트를 가리킨다.
second_languages['C++', 'C#', '자바스크립트', 'Node.js']변수 lang가 가리키는 문자열이 second_languages가 가리키는
리스트 포함되어 있지 않은 경우에만 언급된 언어가
오른편 끝에 추가된 리스트를 화면에 출력하는 코드를 작성한다.
힌트: not in 연산자 활용
답:
if ... 명령문을 이용한다.
이때 if 다음에 오는 진리값을 표현하는 식으로 리스트를 대상으로 항목이 아닌경우에
True로 계산되는 not in 연산자를 이용한다.
또한 리스트의 + 연산을 이용한다.
예제: 새로운 언어를 사용하는 경우
lang = '파이썬'
if lang not in second_languages:
print(second_languages + [lang])['C++', 'C#', '자바스크립트', 'Node.js', '파이썬']
예제: 이미 포함된 언어를 사용하는 경우엔 아무 것도 하지 않음.
lang = 'Node.js'
if lang not in second_languages:
print(second_languages + [lang])예제 7
변수 greetings가 다음과 같이 정의된다.
greetings = '파이썬, 안녕!'(1) 문자열에 포함된 쉼표 기호 ,를 확인하는 인덱싱을 표현하는 수식을 정의하라.
답:
greetings[3]','(2) 문자열에 포함된 느낌표 기호 !을 확인하는 인덱싱을 표현하는 수식을 정의하라.
답:
greetings[-1]'!'인덱싱 활용법
본문에서 가져왔음. 확장 필요.
변수 one2five처럼 숫자로 구성된 리스트를 많이 활용한다.
예를 들어 변수 scores는 세 개의 시험점수로 구성된 리스트를 할당받는다.
scores = [92, 87, 100]변수 scores가 시험점수로 구성된 리스트를 가리키기에
아래 코드에서처럼 시험점수의 평균값을 인덱싱을 이용하여 계산할 수 있다.
참고로 정수의 나눗셈 결과는 항상 부동소수점으로 처리됨에 주의한다.
mean = (scores[0] + scores[1] + scores[2])/3
print(mean)93.0
예제 8
우유 가격은 820원이고, 아이스크림 가격은 1500원이다. 아이스크림은 3개 이상 구입하면 5% 할인해준다. 우유 2개와 아이스크림 3개를 구입할 때 지불해야 하는 가격을 다양한 변수를 활용하여 계산하는 코드를 작성한다.
힌트: 할인율이 5%이면 할인을 적용할 때 구입 가격에 (1 - 0.05)를 곱한다.
답:
우유 가격과 개수, 아이스크림 가격과 개수, 할인율을 변수로 활용해서 간단한 연산을 실행한다.
milk_price = 820
icecream_price = 1500
discount = 0.05 # 아이스크림 3개 이상 구입시 할인율
milk = 2
icecream = 3할인을 받을 수 있는 경우와 그렇지 않은 경우를
구분해서 코드를 실행할 수 있다.
이를 위해 if ... else ... 조건문을 이용한다.
최종 가격은 정수로 지정한다.
이유는 할인을 적용하면 즉, 할인율을 곱하면 부동소수점으로 계산되기 때문이다.
if icecream < 3:
total_price = milk_price * milk + icecream_price * icecream # 할인 없음
else:
total_price = milk_price * milk + icecream_price * icecream * (1-discount) # 할인 적용
print("우유", milk, "개", "아이스크림", icecream, "개", "가격:", int(total_price), "원")우유 2 개 아이스크림 3 개 가격: 5915 원
예제 9
연이자 5%인 정기예금에 1천만원을 10년간 은행에 맡겼을 때 10년 후에 수령할 금액을 계산하는 코드를 다양한 변수를 활용하여 구현한다. 단, 다음 형식으로 출력하라.
10년 후 받을 원금 + 이자는 OOO 원입니다.
원리합계 계산은 아래 식을 따른다.
원리합계 = 원금 * (1 + 연금리 * 기간)
힌트:
아래 변수를 활용해서 원리합계 수식을 간단하게 구현할 수 있다.
principal = 원금
rate = 연이자율
period = 저축기간(년)
savings = 원리합계
답:
principal = 10000000
rate = 0.05
period = 10
savings = principal * (1 + rate * period)
print("10년 후 받는 원금 + 이자는", savings, "원입니다.")10년 후 받는 원금 + 이자는 15000000.0 원입니다.
연습문제¶
(연습) 값과 연산에 포함된 문제들을 풀어보세요.