파이썬 기초

이 장에서는 주석, 리터럴 상수, 숫자 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-103.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) 세 가지가 있습니다.

모든 숫자형은 다음과 같은 연산자를 공통으로 갖고 있습니다.

수식 연산자

연산

결과

참고

참조

x + y

xy의 덧셈

x - y

xy의 뺄셈

x * y

xy의 곱셈

x / y

xy의 나눗셈

x // y

xy의 바닥화된 몫

x % y

x / y의 나머지

-x

x의 부호 변경

+x

x 자체

abs(x)

x의 절대값 또는 크기

abs()

int(x)

x를 정수형으로 변환

(3)(6)

int()

float(x)

x를 부동 소수점형으로 변환

(4)(6)

float()

complex(re, im)

실수부분 re, 허수부분 im, im은 기본값은 0입니다.

complex()

c.conjugate()

c의 켤레복소수

divmod(x, y)

순서쌍 (x // y, x % y)

divmod()

pow(x, y)

xy 거듭제곱

pow()

x ** y

xy 거듭제곱

참고:

  1. x / y해서 나온 값보다 작거나 같은 정수 중 최대 정수를 반환합니다. 예를 들면 1//20, (-1)//2-1, 1//(-2)-1, 그리고 (-1)//(-2)0입니다.

  2. 복소수인 경우는 abs()를 이용해서 부동소수점으로 바꾼다. 13 % 31을 반환합니다. -25.5 % 2.251.5 를 반환합니다. 나머지의 부호는 두 번째 피연산자의 부호를 따른다. 항상 x == (x//y)*y + (x%y)의 관계식을 만족합니다.

  3. 부동소수점형에서 정수형으로 변환될 때 어림 또는 절단이 발생할 수 있습니다. 자세한 것은 math.floor()math.ceil()를 참조하자.

  4. float()+-부호와 함께 문자열 'nan''inf'을 인자로 받아서 각각 nan(Not a Number)+-inf를 나타낼 수 있습니다.

  5. 파이썬은 pow(0, 0)0 ** 01로 정의합니다.

  6. 숫자형 리터럴 상수도 가능합니다.

정수형

정수형 숫자의 크기는 무제한입니다. 정수형을 만드는 방법은 리터럴 정수에서 본 것과 같이 리터럴 정수를 사용하는 방법과 정수형 객체를 만드는 함수 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와 같이 써도 됩니다. 그런데 2j반드시 붙여 써야 합니다.

(1 + 2j) + complex(2, 3)
(3+5j)

복소수 객체의 imag, real 속성을 이용해서 실수부분과 허수부분에 접근할 수 있습니다.

직접하기

  • \(z_1 = -1 + 3i\), \(z_2 = 2 - 5i\)에 대해서 사칙연산을 수행해 보시오.

  • 복소수 -3 + 5j의 실수 및 허수부분을 각각 출력하는 코드를 작성하시오.

변수

변수는 어떤 값을 담는 바구니라고 생각할 수 있습니다. 파이썬에서 변수는 객체를 가리키는 이름으로 사용됩니다. 변수 이름을 만드는 규칙은 첫문자는 반드시 알파벳 또는 밑줄(_)을 사용해야하고, 두번째 문자부터는 알파벳, 숫자 또는 밑줄이 나올 수 있습니다. 변수 이름으로 공백문자는 포함할 수 없으며, 첫 문자로 숫자가 나오면 안됩니다. 또한 대문자, 소문자를 다르게 인식을 하기 때문에 Schoolschool은 다른 변수 이름이 됩니다. 알파벳 대신에 유니코드도 가능합니다. 즉 한글 변수도 사용할 수 있습니다.

한글 = 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에서 +는 덧셈 연산자라고 부른다. 23은 피연산자(operand)라고 합니다.

연산자

설명

+ (덧셈 연산자)

x + yxy를 더합니다. 3 + 58 을 반환하고 'a' + 'b''ab' 를 반환합니다.

- (뺄셈 연산자)

x- yx에서 y를 뺀다. 첫 번째 피연산자가 주어지지 않으면 0으로 간주됩니다. -5.2 는 음수를 표현합니다. 50 - 2426 을 반환합니다.

* (곱셈 연산자)

두 숫자의 곱 혹은 지정된 숫자만큼 반복된 문자열을 반환합니다. 2 * 36 을 반환하고 'la' * 3lalala 를 반환합니다.

** (거듭제곱 연산자)

x ** y는 x 의 y제곱을 반환합니다. 3 ** 481 을 반환합니다 (이 값은 3 * 3 * 3 * 3 과 같습니다).

/ (나눗셈 연산자)

x / yxy로 나눈 부동소수점형 숫자를 반환합니다.

// (몫 연산자)

x // yx / y해서 나온 값보다 작거나 같은 정수 중 최대 정수를 반환합니다. 연산자와 수식 13 // 34 를 반환합니다. -13 // 3-13 / 3 = -4.333333 보다 작거나 같은 정수 중 최대정수인 -5를 반환합니다.

% (나머지 연산자)

xy로 나눈 나머지를 반환합니다. 13 % 31 을 반환합니다. -25.5 % 2.251.5 를 반환합니다. 나머지의 부호는 두 번째 피연산자의 부호를 따른다. 항상 x == (x//y)*y + (x%y)의 관계식을 만족합니다.

<< (왼쪽 시프트 연산자)

x << n 은 정수 x의 이진수 표현에서 n 비트 수 만큼 왼쪽으로 이동을 시키고 뒤의 공간은 0으로 채운다. n은 음이 아닌 정수입니다.(모든 숫자는 메모리상에서 0 또는 1 의 비트로 구성된 이진수로 표현됩니다). 2 << 2 는 8 을 반환합니다. 2 는 이진수로 10 으로 표현되고 이것을 왼쪽으로 2비트 시프트 연산하면 이진수 1000 이 되어 이것을 정수로 표현하면 8이 됩니다. x << nx * 2 ** n하는 것과 같습니다.

>> (오른쪽 시프트 연산자)

x >> n은 정수 x의 이진수 표현에서 n 비트 수 만큼 오른쪽으로 이동을 시키고 앞의 공간은 음수이면 1 양수이면 0비트로 채운다. 11 >> 15 를 반환합니다. 11 은 이진수로 1011 로 표현되고 이것을 오른쪽으로 1비트 시프트 연산하면 이진수 101 이 되고 이것을 정수로 표현하면 5 가 됩니다. x >> nx // 2 ** n과 같습니다.

& (이진수 AND 연산자)

이진수 AND 연산이란 숫자를 이진수로 표현했을 때 같은 자리의 숫자가 동시에 1일 때만 1이고 그렇지 않으면 0이 되는 것을 의미합니다. 따라서 5 & 31 을 반환합니다. 왜냐면 53은 이진수로 각각 101 011이므로 끝자리만 같은 1이고 나머지는 다른 숫자이므로 이진수 001 즉 십진수 1이 됩니다.

| (이진수 OR 연산자)

이진수 OR 연산이란 숫자를 이진수로 표현했을 때 같은 자리의 숫자가 적어도 하나가 1이면 1이고 둘 다 0이면 0이 되는 것을 의미합니다. 5 | 37 을 반환합니다. 왜냐면 53은 이진수로 각각 101 011이므로 같은 자리에 1이 적어도 하나씩 있으므로 이진수 111이 되고 십진수로는 7이 됩니다.

^ (이진수 XOR 연산자)

이진수 XOR 연산값을 반환합니다. x ^ yx y를 이진수로 표현했을 때 같은 자리의 수가 둘 다 0 또는 둘 다 1이면 결과값은 0이고 그렇지 않으면 1이 됩니다. 따라서 5 ^ 36 을 반환합니다.

~ (이진수 반전 연산자)

숫자 x의 이진수 반전 연산값 -(x+1) 을 반환합니다. ~5-6 을 반환합니다. 자세한 사항은 아래 2의 보수를 읽어 보기 바란다.

< (작음)

x < y는 x가 y보다 작은지 여부를 반환합니다. 모든 비교 연산자는 True (참) 또는 False (거짓)을 반환합니다. 각 반환값의 첫글자는 대문자라는 점에 유의하자. 5 < 3False 를 반환합니다. 3 < 5True 를 반환합니다. 다음과 같이 여러 숫자에 대해 한꺼번에 비교 연산을 수행할 수 있습니다. 3 < 5 < 7True 를 반환합니다.

> (큼)

xy 보다 큰지 여부를 반환합니다. 5 > 3True 를 반환합니다. 만약 두 피연산자가 모두 숫자라면 같은 숫자형으로 변환된 후 크기를 비교합니다. 피연산자가 숫자형이 아닐 경우 항상 False 를 반환합니다.

<= (작거나 같음)

xy 보다 작거나 같은지 여부를 반환합니다. x = 3; y = 6; x <= yTrue 를 반환합니다.

>= (크거나 같음)

xy 보다 크거나 같은지 여부를 반환합니다. x = 4; y = 3; x >= 3True 를 반환합니다.

== (같음)

두 객체가 같은지 여부를 반환합니다. x = 2; y = 2; x == yTrue 를 반환합니다. x = 'str'; y = 'stR'; x == yFalse 를 반환합니다. x = 'str'; y = 'str'; x == yTrue 를 반환합니다.

!= (같지 않음)

두 객체가 같지 않은지 여부를 반환합니다. x = 2; y = 3; x != yTrue 를 반환합니다.

not (논리부정 연산자)

xTrue 라면 False 를 반환합니다. xFalse 라면 True 를 반환합니다. x = True; not xFalse 를 반환합니다.

and (논리곱 연산자)

x and y를 계산할 경우 xFalse 이면 False를 반환하며 True 이면 y와의 and 연산값을 반환합니다. x = False; y = True; x and y를 계산할 경우 xFalse 이므로 y값에 관계없이 x and y 의 값은 False 임이 자명하므로 x의 값이 False임이 확인되는 즉시 곧바로 결과값 False 가 반환되며 이때 y의 값은 계산되지 않습니다. 이것을 단축 계산(short-circuit evalulation)이라고 부른다. 더 일반적으로 x and y 연산을 할 때 xFalse에 해당되는 객체면 x 객체를 반환하고 그렇지 않으면 y 객체를 반환합니다.

or (논리합 연산자)

xTrue 이면 True 가 반환되며 False이면 y 와의 or 연산값을 반환합니다. x = True; y = False; x or yTrue가 반환됩니다. 여기서도 위와 같이 단축 계산이 적용됩니다.

참고:

  • x == y__eq__() 메소드를 이용해서 비교합니다. __eq__() 메소드가 구현되어 있지 않으면 is 연산자를 사용하여 비교합니다.

직접하기

  • 73으로 나눈 몫과 나머지를 구하시오.

수식 연산자 단축

변수에 숫자를 연산하여 다시 같은 변수에 넣는 것은 많이 사용됩니다.

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)와 같이 계산합니다.

수식 단축 연산자

연산자

예제

설명

+=

x += y

x = x + y

-=

x -= y

x = x - y

*=

x *= y

x = x * y

/=

x /= y

x = x / y

%=

x %= y

x = x % y

**=

x **= y

x = x ** y

//=

x //= y

x = x // y

연산자 우선순위

여러 연산자가 함께 있을 때 어떤 연산이 먼저 수행될 것인지를 순위를 정해 놓았다. 아래 표는 우선순위가 가장 높은 것부터 낮은 것 순서로 되있습니다. 순서가 명확하지 않을 때는 괄호를 사용하여 순서를 명확하게 하도록 합니다.

연산자

설명

(수식…), [수식…], {키: 값…}, {수식…}

괄호 또는 튜플(tuple), 리스트(list), 사전(dictionary), 집합(set) 표시

x[인덱스], x[인덱스:인덱스], x(인수…), x.속성(attribute)

원소 접근, 슬라이스, 함수 호출, 속성 참조

await x

비동기(async) 함수식에서 사용

**

거듭제곱

+x, -x, ~x

양수, 음수, 논리 NOT 연산

*, @, /, //, %

곱셈, 행렬 곱셈, 나눗셈, 정수 나눗셈, 나머지 연산

+, -

덧셈, 뺄셈

<<, >>

시프트 연산

&

이진수 AND

^

이진수 XOR

|

이진수 OR

in, not in, is, is not, <, <=, >, >=, != , ==

포함 관계, 항등, 비교 연산

not x

논리 NOT

and

논리 AND

or

논리 OR

if else

조건 수식

lambda

람다 수식

  • 괄호가 최우선 순위를 갖기 때문에 2 * (3-1)4이고 (1+1) ** (5-2)8입니다.

  • 다음으로 거듭제곱이 우선 순위를 갖기 때문에 2 ** 1+14가 아니고 3입니다. 또한 3 * 1 ** 327이 아니고 3입니다.

  • 곱셈/나눗셈 같은 우선 순위를 가지며, 덧셈/뺄셈보다 우선 순위를 갖습니다. 따라서 2 * 3-14가 아니라 5이고, 5-2 * 26이 아니라 1입니다.

  • 음수, 양수의 부호보다 거듭제곱 연산이 우선이기 때문에 -2 ** 24가 아니라 -4입니다.

같은 연산 순위일 경우

같은 연산 순서를 가질 경우에는 일반적으로 왼쪽에서 오른쪽으로 순서대로 계산됩니다. 위의 표에서 같은 행에 있는 연산들은 연산 순위가 같습니다. 예를 들어 2 - 3 + 42 - 3 = -1이 먼저 계산되고 -1 + 4 = 3 과 같이 계산됩니다. 다만 할당 연산자 =은 오른쪽에서 왼쪽으로 계산이 됩니다. 예를 들면 a = b = 3a = (b = 3)과 같이 b3 이 할당되고 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='')

위 프로그램을 파이참에서 실행하면 다음과 같습니다.

  1. 편집창 위에서 마우스 오른쪽 클릭을 하여 Run 파일이름을 클릭합니다.

  2. 파이참 아래 부분 실행창에 이름을 입력하시:라는 문구가 나온다. 이 부분을 클릭한 후 이름을 입력하고 엔터를 치면

  3. 나이를 입력하시오:라는 문구가 이어서 나온다. 다시 나이를 입력하면

  4. 반갑습니다. ...이라는 결과를 볼 수 있을 것입니다.

직접 하기

  • 직각 삼각형의 한 변의 길이를 입력받아 빗변의 길이를 출력하자.(x의 제곱근은 x ** 0.5을 이용하면 됩니다.)

연습

  1. 1 2를 입력하고 엔터를 치고 결과에 대해서 이야기 하시오.

  2. 프롬프트에서 apple이라고 입력하고 엔터를 쳐보고 결과에 대해서 이야기 하시오.

  3. 파이썬 프롬프트(Prompt)에서 2 + 3 * 4를 입력하고 엔터를 쳐보고, 같은 식을 스크립트에 입력하고 실행시켜보고 다른 점을 이야기하시오.

  4. 괄호를 이용하여 6 * 1 - 2-6이 나오도록 하시오.

  5. 파이썬 프롬프트에서 alice + 4를 입력하고 엔터를 치면 NameError: name 'alice' is not defined라는 에러가 나온다. alice 변수를 만들어 alice + 410이 되도록 하시오.

  6. 사용자한테 이름과 나이를 입력하게 하여 그 사람의 나이가 99세가 되는 년도를 출력하는 프로그램을 작성하시오.

  7. 사용자로부터 3개의 숫자를 입력받아 합과 평균을 출력하는 코드를 작성하시오.

  8. 사용자로부터 원의 반지름을 입력받아 원의 면적을 계산하는 코드를 작성하시오.

  9. 지금 시각이 오후 2시입니다. 51시간 후에 알람이 울리도록 맞췄다. 알람은 몇 시에 울리는가?

  10. 위의 문제를 사용자로부터 지금 시각과 몇 시간 후에 알람이 울리도록 할 것인가를 입력받아 알람이 울리는 시각을 계산하는 프로그램을 작성하시오.