2.1. 표현식과 변수#
2.1.1. 표현식#
파이썬 환경에서 표현식(expression)을 사용하는 것은 여러분이 휴대용 계산기를 사용하는 것과 매우 유사합니다. 파이썬 언어를 포함하는 프로그래밍 언어는 인간의 언어보다 휠씬 단순합니다.
파이썬 언어도 인간의 언어와 같이 정해진 문법이 있는데 표현식은 주어진 자료들를 어떻게 처리할 것인지 컴퓨터에게 전달하는 문장입니다. 프로그래밍 언어의 문장도 인간의 언어와 같이 정해진 규칙, 즉 문법에 맞추어 써야합니다.
예를 들어 1 + 2
은 수학적인 연산을 나타내는 표현식이며 이는 1에 2을 더해서 결과를 계산해 달라는 문장입니다.
만약 1 + * 2
라는 표현식을 사용하면 오류가 날 것입니다. 프로그래밍 언어의 표현식은 인간이 사용하는 언어와 유사한 문법을 사용하게 설계되었기 때문에 대부분의 경우 인간이 이해를 못하면 컴퓨터도 이해를 할 수 없습니다.
2.1.2. 수학 연산#
먼저 숫자를 이용하는 다양한 연산을 수행하는 표현식을 사용해 보자.
숫자 1을 입력하면 1을 출력해 준다.
1
1
사칙 연산은 표현식을 입력하면 수행해서 곧바로 결과를 보여 준다.
앞에서 언급했듯이 파이썬은 수식, 즉 표현식을 입력하면 결과를 보여주는 인터프리터 언어이며 대화형 방식으로 사용할 수 있다.
2+2
4
2-5
-3
2*3
6
5/2
2.5
파이썬은 사칙연산 뿐 아니라 제곱, 나눗셈을 할 때 몫(나머지) 등을 구할 수 있는 여러 가지 다양한 표현식이 가능하다. 아래는 숫자를 이용하는 표현식에 사용할 수 있는 연산자(operator)들이다.
연산자 |
의미 |
예시 |
값 |
---|---|---|---|
\(+\) |
덧셈 |
2+3 |
5 |
\(-\) |
뺄셈 |
2-1 |
1 |
\(*\) |
곱셈 |
2*3 |
5 |
\(/\) |
나눗셈 |
7/3 |
2.66667 |
\(\%\) |
나머지 |
7%3 |
1 |
\(//\) |
몫 |
10//3 |
3 |
\(**\) |
제곱 |
3**4 |
81 |
10//3
3
2**3
8
여러 개의 연산자가 나오는 경우 연산 순서는 수학에서의 연산 순서와 같다.
3 + 2 * 2
7
물론 괄호를 사용하여 연산의 순서를 조정할 수 있다.
(3 + 2) * 2
10
문법에 따르지 않은 잘못된 표현식을 사용하면 파이썬은 오류 메세지(error message)를 출력한다.
1+*2
File "<ipython-input-10-11310822abdb>", line 1
1+*2
^
SyntaxError: invalid syntax
2.1.3. 비교연산자와 논리연산자#
숫자들의 크기를 비교하는 표현식을 실행하면 참(True
)과 거짓(False
)이 생성된다. 여기서 유의할 점은 True
와 False
는 참과 거짓을 나타내는 예약어로서 변수의 이름으로 사용할 수 없다
비교연산자는 <
, <=
, >
, >=
, !=
, ==
가 있다.
1 < 2
True
1 >= 1
True
3 == 2
False
3 != 3
False
True = 123
File "<ipython-input-15-cc0f27f3a6b4>", line 1
True = 123
^
SyntaxError: cannot assign to True
논리연산자는 and
, or
, not
으로 구성되어 있으며 논리식을 표현한다. 논리연산자도 예약어로서 변수의 이름으로 사용할 수 없다
1 < 2 or 3 <= 1
True
1 < 2 and 3 <= 1
False
not 1 < 2
False
2.1.4. 변수#
여러분이 요리를 할 때 그릇을 준비하고 요리한 음식을 담는다. 그릇에 담는 음식은 여러분의 취향에 따라서 바뀔 수 있다. 프로그래밍 언어에 변수는 자료를 담는 그릇이다.
프로그램을 만들 때 변수는 표현식의 결과를 담는 그릇이라고 생각하자. 변수는 연산자 =
을 사용하여 선언할 수 있다. 연산자 =
의 오른쪽에는 변수에 저장할 자료를 계산하는 표현식이 나타난다. 표현식에는 앞에서 정의된 변수가 사용될 수 있다.
참고로 파이썬에서는 변수(variable) 를 이름(name) 이라고 부른다. 이 과목에서는 변수로 통일하여 사용한다.
a = 100
a
100
b = 200 + 300
a + b
600
다른 요리를 하면 그릇에 담는 음식이 바뀌듯이 변수에 저장된 자료를 바꿀 수 있다.
a = -200
a
-200
변수를 사용하는 이유는 일반적인 작업을 수행할 때 특정한 자료에 대한 처리를 편리하고 이해하기 쉽게 하기 위해서이다.
예를 들어 아르바이트 직원의 월급을 계산하는 일반적인 작업을 고려헤 보자. 먼저 시간당 임금(hour_rate
)이 정해지고 다음에 근로 일수 (month_working_days
) 그리고 일간 근로 시간(day_working_hours
)이 나오면 세 값을 곱하여 월급이 정해진다.
다음은 1월에 일한 철수의 월급을 계산하는 프로그램이다.
hour_rate = 10000
month_working_days = 20
day_working_hours = 4
month_pay = hour_rate * month_working_days * day_working_hours
month_pay
800000
아르바이트 직원마다 시간당 임금, 월간 근로 일수와 시간, 즉 자료가 달라지기 떄문에 월급이 수시로 변하지만 월급을 계산하는 작업의 절차는 동일하다. 변수를 이용하면 일반적인 작업의 절차를 쉽게 이해할 수 있는 프로그램으로 작성하여 반복적으로 이용할 수 있다.
다음은 2월에 일한 영이의 월급을 계산하는 프로그램이다.
hour_rate = 11000
month_working_days = 15
day_working_hours = 5
month_pay = hour_rate * month_working_days * day_working_hours
month_pay
825000
변수의 이름을 정할 때는 다음과 같은 규칙을 따른다.
대, 소문자를 구분한다(
myvar
과myVar
은 다른 변수)문자, 숫자, 언더바(
_
)를 포함할 수 있다. 하지만 숫자로 시작하면 안 된다.
파이썬의 변수에 저장할 수 있는 것은 숫자뿐만 아니라 문자도 저장할 수 있다.
파이썬의 문자열(string,str
)은 문자들(characters)의 조합이다.
문자열의 정의는 아래와 같이 ' '
와 " "
로 모두 정의할 수 있다.
name_1 = 'John Doe'
name_1
'John Doe'
name_2 = "이철수"
name_2
'이철수'
text_1 = "I can't go"
text_1
"I can't go"
문자열 안에 작은 따옴표 '
가 있는 경우 큰 따옴표 "
로 위와 같이 정의하면 문제가 없지만 작은 따옴표로 정의하는 경우 문자열의 시작과 끝이 구별이 되지 않기 때문에 역슬래쉬 \
로 아래와 같이 보호해준다.
text_2 ='you can\'t come'
text_2
"you can't come"
물론 큰 따옴표가 문자열에 있는 경우도 역슬래쉬 \
로 보호해주어야 한다..
text_3 = "He said \"yes\""
text_3
'He said "yes"'
주의할 점은 역슬래쉬로 시작하는 문자열은 특수한 기능을 가진다. 이러한 특수한 기능을 가진 특수 문자열(escape sequence)라고 부른다.
예를 들어 문자열 안에 \n
이 나타나면 줄을 바꾸는 기능(newline)한다. 따라서 다음과 같이 컴퓨터의 디렉토리를 지정하는 문자열은
\n
때문에 출력하면 다음 줄로 넘어가게 된다.
text_4 = 'C:\some\name'
print(text_4)
C:\some
ame
print("첫 번째 줄 \n두 번째 줄")
첫 번째 줄
두 번째 줄
특수 문자열이 주어진 기능을 하지 못하게 하는 방법은 문자열을 정의할 때 r
로 시작하면 된다.
text_5 = r'C:\some\name'
print(text_5)
C:\some\name
2.1.5. 라이브러리와 함수#
앞의 표현식에서 나타난 print()
는 함수(function)라고 부르며 괄호 안에 주어진 문자열이나 변수의 내용을 출력하는 기능을 가진다.
여러분이 수학시간에 배운 기본적인 수학적 도 파이썬에서 사용할 수 있다. 다른 프로그램이나 계산기에서 흔히 사용되는 사인함수 sin()
을 실행해 보자.
sin(2)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-34-ce9fefd90f64> in <module>
----> 1 sin(2)
NameError: name 'sin' is not defined
불행하게도 계산기에서도 쉽게 사용 가능한 사인함수 sin()
가 정의가 되어 있지 않은 것을 알 수 있다.
수학 함수를 사용하려면 추가 작업이 필요하다. 필요한 작업은 수학에 관련된 함수들을 모아 놓은 **라이브러리(library)**를 불러오는 것이다.
라이브러리는 특정한 주제에 관련된 함수들과 연관된 프로그램을 모아놓은 것이다. 예를 들어 삼각함수나 로그함수와 같은 수학 함수를 사용하기 위해서는
수학 라이브러리(math
library)를 불러와야 한다.
특정한 라이브러리를 불러오는 명령어는 import
를 사용한다.
import math
위와 같이 math
라이브러리를 불러오면 이제 사인함수 sin()
을 사용할 수 있을까?
sin(2)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-37-ce9fefd90f64> in <module>
----> 1 sin(2)
NameError: name 'sin' is not defined
아쉽게도 사인함수 sin()
가 아직도 작동하지 않는다.
특정 라이브러리를 불러오면 사용하고자 하는 함수가 그 라이브러리에 포함된 함수임을 알려주어야 한다. 아래와 같이 라이브러리 이름 뒤에 마침표 .
를 쓰고 그 다음에 함수 이름을 붙여야 사용할 수 있다. math.sin()
이라는 문장은 컴퓨터에게 math
라이브러리 안에 있는 sin()
함수를 이용하겠다고 알려주는 것이다.
math.sin(2)
0.9092974268256817
math.log(22)
3.091042453358316
참고로 라이브러리는 모듈(module)이라고도 불리며 기본적으로 같은 의미이다. math
라이브러리에서 정의된 다양한 수학함수들의 사용법은 파이썬 모듈 매뉴얼에 있다.
2.1.6. 리스트#
파이썬에서 리스트(list
)는 데이터를 모아놓은 순서가 있는 복합체 또는 집합이다.
리스트를 정의하는 방법은 중괄호 []
안에 데이터 또는 변수를 쉼표 ,
로 분리하여 놓는다. 리스트 안에 있는 원소(element)들은 아래에서 정의한 것처럼 정수, 실수, 문자열 등 그 성질이 같을 필요는 없다.
list_1 = [1, 2, 0.5, 'chair']
list_1
[1, 2, 0.5, 'chair']
심지어 리스트는 여러 개의 서로 다른 리스트를 원소로 가질 수 있다.
list_2 = [ list_1, "A", [1,2,3] ]
list_2
[[1, 2, 0.5, 'chair'], 'A', [1, 2, 3]]
리스트 안의 각 원소는 순서에 따라서 지정된 값이 있으며 이를 인덱스(index) 라고 한다.
인덱스를 이용하여 리스트의 원소를 꺼내 볼 수 있다. 이를 슬라이싱(slicing)이라고 한다. 인덱스를 이용한 슬라이싱은 리스트의 이름 뒤에 중괄호 []
안에 인덱스를 넣어서 수행한다.
!!!! 파이썬의 인덱스는 1이 아닌 0 부터 시작하므로 이를 언제나 유념해야 한다 !!!.
squares = [1, 4, 9, 16, 25]
squares[0]
1
squares[1]
4
squares[2]
9
squares[4]
25
위의 결과에서 보았듯이 5개의 원소를 가진 리스트의 인덱스는 0 으로 시작해서 4 로 끝난다. 민약 리스트의 인텍스 범위를 벗어나서 슬라이싱을 하면 오류가 발생한다.
list_3[5]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-47-f03c86e5c67e> in <module>
----> 1 list_3[5]
NameError: name 'list_3' is not defined
마지막으로 변수나 숫자가 리스트에 포함되는지 알려주는 포함연산자 in
이 유용하다.
1 in [1,2,3,4]
True
a = 5
a in [1,2,3,4]
False