파이썬 기초¶
이 장에서는 주석, 리터럴 상수, 숫자 numbers, 문자열 string, 변수 variables, 수식 expressions, 들여쓰기 indentation, 연산자 operators, 연산 우선순위 (operator precedence) 등에 대해서 알아봅니다.
주석¶
주석이란 소스 코드에서 프로그램을 설명하는 용도로 사용되며 해시문자 #
를 사용합니다. 해시문자(#
)가 붙은 줄에서 #
뒤로 적힌 모든 내용들은 명령어로 인식하지 않습니다. 예를 들면, 아래 코드에서 #
뒤에 적힌 문장 여기에 적힌 내용들은 명령어로 인식하지 않고 무시합니다.
은 프로그램에 아무런 영향을 끼치지 않습니다. 이 문장은 단지 코드를 읽는 사람에게 정보를 주기 위한 용도입니다.
print("hello") # 여기에 적힌 내용들은 명령어로 인식하지 않고 무시합니다.
hello
주석은 코드를 작성하면서 그 코드의 설명을 붙이기 위해서 사용되기도 합니다.
def fibonacci(n):
# 피보나치 수열을 함수로 만들어 본 것입니다.
if not isinstance(n, int):
raise Exception("정수를 입력하시오.")
if n > 2:
return fibonacci(n-1) + fibonacci(n-2)
elif n < 1:
raise Exception("0보다 큰수를 입력하세요.")
else: # n = 1, 2일 떄 1을 반환합니다.
return 1
fibonacci(1)
1
또는 코드를 실행시키지 않고 싶을 때 사용하기도 합니다.
리터럴 상수¶
리터럴(literal)은 ‘글자 그대로’란 의미이므로 리터럴 상수란 ‘보이는 그대로 객체로 인식합니다’는 뜻입니다. 예를 들면 파이썬에서 숫자 100
은 정수형(int
) 숫자 100
으로 인식하고 1.234
는 부동소수형(float
) 숫자로 인식합니다. 리터럴 상수형으로는 문자열, 정수, 부동소수점, 복소수, 바이트형이 있습니다.
리터럴 정수¶
리터럴 정수형 예제로
7 2147483647 0o177 0b100110111
3 79228162514264337593543950336 0o377 0xdeadbeef
여기서 0o177
표현식은 첫번째 문자는 숫자 0
이고 두번째 문자 o
는 영어 소문자입니다. 마찬가지로 0b100110111
, 0xdeadbeef
에서도 각각 첫번째 문자는 숫자이고 두번째는 영어 소문자입니다. 0o(8진수)
형식은 8진수를 나타내는 것이고 0b(2진수)
, 0x(16진수)
는 각각 2진수, 16진수를 나타내는 것입니다.
리터럴 부동소수점¶
리터럴 부동소수점은 숫자에 소수점을 붙여 사용합니다. 다음은 여러 가지 부동소수점을 표현하는 방법입니다.
3.14 10. .001 1e100 3.14e-10 0e0 -1E-100
여기서 3.14e-10
는 3.14 * 10 ** (-10)
을 의미하는 것입니다. 즉 \(3.14 \times 10^{-10}\)을 의미합니다.
리터럴 문자열¶
"hello"
, '안녕'
과 같이 큰 따옴표 "
또는 작은 따옴표 '
로 둘러싸인 문자열은 파이썬 문자열형(str
)로 인식합니다. 여기서 주의할 것은 따옴표로 둘러싸인 숫자 "100"
은 숫자가 아니라 문자열로 인식합니다는 것입니다. 뿐만아니라 작은 따옴표 또는 큰 따옴표를 연속으로 3개를 사용하여 문자열을 만들 수 있습니다. 예를 들면
""" 이것은 문자열입니다 """
'''이것도 문자열입니다.'''
특히 """
또는 '''
을 사용하면 엔터를 쳐서 여러 줄에 걸쳐서 문자열을 만들 수 있습니다.
"""
여러 줄에
걸쳐서 문자열을 만들어 냅니다.
"""
리터럴 허수¶
리터럴 허수는 부동소수점에 j
또는 J
를 붙여서 만든다.
3.14j 10.j 10j .001j 1e100j 3.14e-10j
리터럴 바이트형은 파이썬 사이트를 참조합니다.
type(100)
int
type(1.234)
float
type("hello")
str
type('안녕')
str
type("100")
str
type(x)
함수는 x
가 어떤 유형의 객체인지를 알려준다.
숫자¶
파이썬 숫자형은 정수형(int
), 부동소숫점형(float
) 및
복소수형(complex
) 세 가지가 있습니다.
모든 숫자형은 다음과 같은 연산자를 공통으로 갖고 있습니다.
연산 |
결과 |
참고 |
참조 |
|
---|---|---|---|---|
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
(3)(6) |
||
|
|
(4)(6) |
||
|
실수부분 |
|||
|
|
|||
|
순서쌍 |
|||
|
|
|||
|
|
참고:
x / y
해서 나온 값보다 작거나 같은 정수 중 최대 정수를 반환합니다. 예를 들면1//2
은0
,(-1)//2
은-1
,1//(-2)
은-1
, 그리고(-1)//(-2)
은0
입니다.복소수인 경우는
abs()
를 이용해서 부동소수점으로 바꾼다.13 % 3
은1
을 반환합니다.-25.5 % 2.25
는1.5
를 반환합니다. 나머지의 부호는 두 번째 피연산자의 부호를 따른다. 항상x == (x//y)*y + (x%y)
의 관계식을 만족합니다.부동소수점형에서 정수형으로 변환될 때 어림 또는 절단이 발생할 수 있습니다. 자세한 것은 math.floor() 와 math.ceil()를 참조하자.
float()
는+-
부호와 함께 문자열'nan'
과'inf'
을 인자로 받아서 각각nan(Not a Number)
및+-inf
를 나타낼 수 있습니다.파이썬은
pow(0, 0)
과0 ** 0
을1
로 정의합니다.숫자형 리터럴 상수도 가능합니다.
정수형¶
정수형 숫자의 크기는
무제한입니다.
정수형을 만드는 방법은 리터럴 정수에서 본 것과
같이 리터럴
정수를
사용하는 방법과 정수형
객체를
만드는 함수 int(x)
를 사용하는 방법이 있습니다.
print(int(100), int(1.56), int(-1.56), sep=', ')
print(int('1234'))
100, 1, -1
1234
int(100)
은 정수형 100을 의미하고 int(1.56)
및 int(-1.56)
은 정수 1
과 -1
을 각각 반환합니다. 즉, x
부터 0쪽 방향으로
정수들 중 x
에 가장 가까운 정수를 반환합니다. 또한 숫자 대신 문자열을
사용할 수 있습니다. 즉, int('1234')
은 정수 1234
을 의미합니다. 이
때 문자열은 정수 문자열만 가능합니다.
int(x, base=10)
을 이용하여 정수형을 만들 수 있습니다. x
는 숫자가
아니면 문자열,
bytes, 또는
bytearray
객체이어야만 합니다. x
가 문자열이면 진법(base
)에 맞는 문자열이
와야 합니다.
int('a1', base=16)
과 같이 사용하면 16진수 a1
을 나타내는
것으로 10진수로 161
을 나타냅니다.
int('A1', base=16)
161
진법에 맞지 않는 문자열이 나오면 에러가 납니다.
int('1201', base=2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-d5c5cea53d05> in <module>()
----> 1 int('1201', base=2)
ValueError: invalid literal for int() with base 2: '1201'
2진법 문자열 중에 2
가 나왔으므로 오류가 발생됩니다. 2진법은 0
또는 1
로만 구성되어 있어야 합니다.
0b
, 0o
, 0x
로 시작해서 이진수, 8진수, 16진수로 사용할 수
있습니다.
int(0xFA10)
64016
직접하기
이진수
1001001
을 정수로 나타내시오.8진수
70372
를 정수로 나타내시오.16진수
1A3FE5
를 정수로 나타내시오.위의 각각의 정수를 거꾸로 2진수, 8진수, 16진수로 바꾸어 보시오.(
bin()
,oct()
,hex()
를 사용하시오.)
부동소수점형¶
부동소수점형의 크기는 시스템에 따라 달라질 수 있고 sys.float_info을 통해서 값을 알 수 있습니다.
import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
파이썬 부동소수점형으로 표현할 수 있는 가장 큰 수(max), 가장 작은 수(min), 2의 최대 거듭제곱(max_exp - 1), 10의 최대 거듭제곱(max_10_exp), 신뢰할 수 있는 최대 숫자길이(dig), 2진법으로 나타냈을 때 최대 숫자 표현 길이(mant_dig), 1과 1보다 큰 바로 윗 수와의 차(epsilon) 등을 나타냅니다.
정수형과 마찬가지로 리터럴 상수형 형식 1.234
와 같이 소숫점을
이용한 숫자로 만들 수도 있고 float(x)
와 같이 부동소수점형 함수를
이용해서 만들 수 있습니다. x
는 리터럴 부동소수점형 및 문자열이 될 수
있습니다.
float(1.234)
1.234
float('-1.23e4')
-12300.0
거듭제곱을 나타내는 문자 e
또는 E
를 사용할 때는 반드시 숫자가
앞에 나와야 합니다.
float('E3')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-7-dfee201f09ad> in <module>()
----> 1 float('E3')
ValueError: could not convert string to float: 'E3'
직접하기
\(10^{308}\)을
float
를 이용해서 표시하시오.\(2^{1024}\), \(1.99^{1024}\)를 float를 이용해서 나타내보시오.
inf
,-inf
가 무엇인지 이야기해 보시오.
복소수형¶
복소수형은 리터럴 복소수형 또는 complex(re, im)
함수를 통해 만들 수
있습니다. 여기서 re
는 실수부분, im
은 허수부분의 부동소수점형을
넣으면 됩니다. 예를 들면 1 + 2j
복소수를 만들고 싶으면 다음과 같이
합니다.
complex(1, 2)
(1+2j)
여기서 j
는 허수부분을 나타내는 표시입니다. 수학 서적에서는 i
로
표시하기도 합니다. 또는 간단히 1 + 2j
와 같이 써도 됩니다. 그런데 2
와 j
는 반드시 붙여 써야 합니다.
(1 + 2j) + complex(2, 3)
(3+5j)
복소수 객체의 imag
, real
속성을 이용해서 실수부분과 허수부분에
접근할 수 있습니다.
직접하기
\(z_1 = -1 + 3i\), \(z_2 = 2 - 5i\)에 대해서 사칙연산을 수행해 보시오.
복소수
-3 + 5j
의 실수 및 허수부분을 각각 출력하는 코드를 작성하시오.
변수¶
변수는 어떤 값을 담는 바구니라고 생각할 수 있습니다. 파이썬에서 변수는
객체를 가리키는 이름으로 사용됩니다. 변수 이름을 만드는 규칙은 첫문자는
반드시 알파벳 또는 밑줄(_
)을 사용해야하고, 두번째 문자부터는
알파벳, 숫자 또는 밑줄이 나올 수 있습니다. 변수 이름으로 공백문자는 포함할
수 없으며, 첫 문자로 숫자가 나오면 안됩니다. 또한 대문자, 소문자를 다르게
인식을 하기 때문에 School
과 school
은 다른 변수 이름이 됩니다.
알파벳 대신에 유니코드도 가능합니다. 즉 한글 변수도 사용할 수 있습니다.
한글 = 1234
_x1 = "첫문자 밑줄 가능"
School = "학교"
school = "대문자 School과 다른 변수"
my_name = "문자 사이에 밑줄 가능"
print(한글 * 10 + 5, _x1, School, school, my_name, sep='\n')
12345
첫문자 밑줄 가능
학교
대문자 School과 다른 변수
문자 사이에 밑줄 가능
다음은 모두 잘못된 변수 이름입니다.
35name = '첫문자로 숫자가 올 수 없습니다'
File "<ipython-input-19-9d7f89eb01fd>", line 1
35name = '첫문자로 숫자가 올 수 없습니다'
^
SyntaxError: invalid syntax
여기서 첫 문자로 숫자 3
을 변수이름으로 사용할 수 없습니다. 첫 문자는
반드시 알파벳 또는 밑줄이 와야 합니다.
m$ = 100
File "<ipython-input-20-8234573aaed3>", line 1
m$ = 100
^
SyntaxError: invalid syntax
특수 문자 $
를 변수에 사용할 수 없습니다.
class = '키워드'
File "<ipython-input-21-c0af7fbbd350>", line 1
class = '키워드'
^
SyntaxError: invalid syntax
파이썬 키워드 즉, 파이썬이 미리 예약해둔 문자열은 변수로 사용할 수 없습니다. 다음은 파이썬 키워드들입니다.
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
식(expression)¶
식이란 함수 호출, 변수, 연산자와 상수들의 조합입니다. 파이썬 인터프리터는 식을 평가해서 결과값을 얻고 표시합니다.
다음은 상수와 상수의 연산으로 이루어진 식입니다.
2 + 3
다음은 변수 x
와 상수의 연산으로 이루어진 식입니다.
x + 2
sin
함수와 변수 x
, 상수의 연산으로 이루어진 식입니다.
import math
math.sin(2) + x ** 2
들여쓰기¶
다른 언어(C, C++, Java
등)와 다르게 파이썬은 들여쓰기를 특별하게
인식합니다. 들여쓰기를 통해서 같은 블록안에 있다는 것을 표시합니다. 다음과
같이 들여쓰기를 하면 에러가 납니다.
print('same block?')
print('no!') # 에러
File "<ipython-input-22-b3cf98a014a3>", line 2
print('no!') # 에러
^
IndentationError: unexpected indent
들여쓰기가 필요한 경우는 if
, while
또는 함수를 정의할 때와 같이
새로운 블록이 필요할 때입니다. 나중에 나오겠지만 if
문을 예를 들면
x = 5
if x > 2:
print('x = ', x) # -- (1)
print('x 는 2보다 크다.') # --(2)
else:
print('x = ', x) # --(3)
print('x 는 2보다 작거나 같습니다.') # --(4)
(1), (2)
는 같은 크기만큼 들여쓰기를 했으므로 같은 블록 안에 있는
걸로 인식합니다. (3), (4)
도 마찬가지로 같은 블록으로 인식합니다.
연산자¶
연산자(operator)란 계산을 하기 위해서 사용되는 특별한 문자열입니다. 예를 들어 2 + 3
에서 +
는 덧셈 연산자라고 부른다. 2
와 3
은 피연산자(operand)라고 합니다.
연산자 |
설명 |
---|---|
|
|
|
|
|
두 숫자의 곱 혹은 지정된 숫자만큼 반복된 문자열을 반환합니다. |
|
|
|
|
|
|
|
|
|
|
|
|
|
이진수 AND 연산이란 숫자를 이진수로 표현했을 때 같은 자리의 숫자가 동시에 |
|
이진수 OR 연산이란 숫자를 이진수로 표현했을 때 같은 자리의 숫자가 적어도 하나가 |
|
이진수 XOR 연산값을 반환합니다. |
|
숫자 |
|
|
|
|
|
|
|
|
|
두 객체가 같은지 여부를 반환합니다. |
|
두 객체가 같지 않은지 여부를 반환합니다. |
|
|
|
|
|
|
참고:
직접하기
7
을3
으로 나눈 몫과 나머지를 구하시오.
수식 연산자 단축¶
변수에 숫자를 연산하여 다시 같은 변수에 넣는 것은 많이 사용됩니다.
a = 2
a = a * 3
이러한 연산을 단축하여 계산할 수 있도록 다음과 같이 사용할 수 있습니다.
a = 2
a *= 3
즉, 변수 연산자= 수식
와 같이 사용할 수 있습니다. 이것은
변수 = 변수 연산자 수식
의 연산을 수행하게 됩니다.
a = 2
b = 3
a /= b # a = a/b = 2/3 = 0.666666...
단축 연산을 할 때는 오른쪽 수식이 먼저 계산되고 그 계산된 값과 단축 연산을 합니다.
x = 6
x /= 3 * 2
print('x = ', x)
x = 1.0
위에서 x = x / 3 * 2
와 같이 계산하는 것이 아니라, 오른쪽 수식을
먼저 계산하고 다음에 단축 연산 =/
을 합니다. 즉
x = x / (3 * 2)
와 같이 계산합니다.
연산자 |
예제 |
설명 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
연산자 우선순위¶
여러 연산자가 함께 있을 때 어떤 연산이 먼저 수행될 것인지를 순위를 정해 놓았다. 아래 표는 우선순위가 가장 높은 것부터 낮은 것 순서로 되있습니다. 순서가 명확하지 않을 때는 괄호를 사용하여 순서를 명확하게 하도록 합니다.
연산자 |
설명 |
---|---|
(수식…), [수식…], {키: 값…}, {수식…} |
괄호 또는 튜플(tuple), 리스트(list), 사전(dictionary), 집합(set) 표시 |
x[인덱스], x[인덱스:인덱스], x(인수…), x.속성(attribute) |
원소 접근, 슬라이스, 함수 호출, 속성 참조 |
|
비동기(async) 함수식에서 사용 |
|
거듭제곱 |
|
양수, 음수, 논리 NOT 연산 |
|
곱셈, 행렬 곱셈, 나눗셈, 정수 나눗셈, 나머지 연산 |
|
덧셈, 뺄셈 |
|
시프트 연산 |
|
이진수 AND |
|
이진수 XOR |
| |
이진수 OR |
|
포함 관계, 항등, 비교 연산 |
|
논리 NOT |
|
논리 AND |
|
논리 OR |
|
조건 수식 |
|
람다 수식 |
괄호가 최우선 순위를 갖기 때문에
2 * (3-1)
은4
이고(1+1) ** (5-2)
은8
입니다.다음으로 거듭제곱이 우선 순위를 갖기 때문에
2 ** 1+1
은4
가 아니고3
입니다. 또한3 * 1 ** 3
은27
이 아니고3
입니다.곱셈/나눗셈 같은 우선 순위를 가지며, 덧셈/뺄셈보다 우선 순위를 갖습니다. 따라서
2 * 3-1
은4
가 아니라5
이고,5-2 * 2
은6
이 아니라1
입니다.음수, 양수의 부호보다 거듭제곱 연산이 우선이기 때문에
-2 ** 2
는4
가 아니라-4
입니다.
같은 연산 순위일 경우¶
같은 연산 순서를 가질 경우에는 일반적으로 왼쪽에서 오른쪽으로 순서대로
계산됩니다. 위의 표에서 같은 행에 있는 연산들은 연산 순위가 같습니다. 예를
들어 2 - 3 + 4
는 2 - 3 = -1
이 먼저 계산되고 -1 + 4 = 3
과 같이 계산됩니다. 다만 할당 연산자 =
은 오른쪽에서 왼쪽으로 계산이
됩니다. 예를 들면 a = b = 3
은 a = (b = 3)
과 같이 b
에
3
이 할당되고 a = b
가 계산됩니다.
문자열 연산¶
다음과 같이 문자열과 숫자는 수식 연산이 불가능합니다.
>>> message = "msg" # message는 문자열
>>> message - 1 # 에러
>>> "Hello" / 123 # 에러
>>> message * "Hello" # 에러
>>> "15" + 2 # 에러
그렇지만 문자열과 문자열 사이에 덧셈 연산자 +
를 사용할 수 있습니다.
여기서 덧셈은 당연히 수식 더하기가 아니라 두 문자열을 결합하는 연산을
수행하게 됩니다. 예를 들면
fruit = "바나나"
baked_good = " 호두과자"
print(fruit + baked_good)
바나나 호두과자
문자열 * 양의 정수
형태로 곱셈 연산자를 사용할 수도 있습니다. 이것은
문자열
을 양의 정수
갯수만큼 반복해서 새로운 문자열을 반환합니다.
'호두' * 3
'호두호두호두'
사용자 입력¶
input()
함수를 이용하여 키보드로부터 입력을 받을 수 있습니다.
input()
함수는 받아들인 값을 모두 문자열로 반환하기 때문에 숫자로
변환하기 위해서는 int(), float()
와 같은 함수들을 이용하여 변환해야
합니다.
name = input("이름을 입력하시오: ")
age = int(input("나이를 입력하시오: "))
print("반갑습니다.", name, "님.", name,"님의 나이는", age, "세 입니다.", sep='')
위 프로그램을 파이참에서 실행하면 다음과 같습니다.
편집창 위에서 마우스 오른쪽 클릭을 하여
Run 파일이름
을 클릭합니다.파이참 아래 부분 실행창에
이름을 입력하시:
라는 문구가 나온다. 이 부분을 클릭한 후 이름을 입력하고 엔터를 치면나이를 입력하시오:
라는 문구가 이어서 나온다. 다시 나이를 입력하면반갑습니다. ...
이라는 결과를 볼 수 있을 것입니다.
직접 하기
직각 삼각형의 한 변의 길이를 입력받아 빗변의 길이를 출력하자.(
x
의 제곱근은x ** 0.5
을 이용하면 됩니다.)
연습¶
1 2
를 입력하고 엔터를 치고 결과에 대해서 이야기 하시오.프롬프트에서
apple
이라고 입력하고 엔터를 쳐보고 결과에 대해서 이야기 하시오.파이썬 프롬프트(Prompt)에서
2 + 3 * 4
를 입력하고 엔터를 쳐보고, 같은 식을 스크립트에 입력하고 실행시켜보고 다른 점을 이야기하시오.괄호를 이용하여
6 * 1 - 2
가-6
이 나오도록 하시오.파이썬 프롬프트에서
alice + 4
를 입력하고 엔터를 치면NameError: name 'alice' is not defined
라는 에러가 나온다.alice
변수를 만들어alice + 4
가10
이 되도록 하시오.사용자한테 이름과 나이를 입력하게 하여 그 사람의 나이가 99세가 되는 년도를 출력하는 프로그램을 작성하시오.
사용자로부터 3개의 숫자를 입력받아 합과 평균을 출력하는 코드를 작성하시오.
사용자로부터 원의 반지름을 입력받아 원의 면적을 계산하는 코드를 작성하시오.
지금 시각이 오후 2시입니다. 51시간 후에 알람이 울리도록 맞췄다. 알람은 몇 시에 울리는가?
위의 문제를 사용자로부터 지금 시각과 몇 시간 후에 알람이 울리도록 할 것인가를 입력받아 알람이 울리는 시각을 계산하는 프로그램을 작성하시오.