파이썬 기초(Basics)

이 장에서는 주석, 리터럴 상수, 숫자(numbers), 문자열(string), 변수(variables), 수식(expressions), 들여쓰기(indentation), 연산자(operators), 연산 우선순위(operator precedence)에 대해서 배운다.

주석

소스 코드에서 프로그램을 설명하는 용도로 사용되며 해시 문자 # 기호를 사용한다. #가 붙은 줄 안에서 # 뒤로 적힌 모든 내용들은 명령어로 인식하지 않는다. 다음 문장에서 # 뒤에 적힌 문장 # 여기에 적힌 내용들은 명령어로 인식하지 않고 무시한다.은 프로그램에 아무런 영향을 끼치지 않는다. 이 문장은 단지 코드를 읽는 사람에게 정보를 주기 위한 용도이다.

1
print("hello") # 여기에 적힌 내용들은 명령어로 인식하지 않고 무시한다.
hello

리터럴 상수

리터럴(literal)이란 "글자 그대로"란 의미로 리터럴 상수란 눈에 보이는 그대로 객체로 인식한다는 뜻이다. 예를 들면 숫자 100은 파이썬이 정수형(int) 숫자 100으로 인식하고 1.234는 부동소수형(float) 숫자로 인식한다. 리터럴 상수형으로는 문자열, 정수, 부동소수점, 복소수, 바이트형이 있다.

리터럴 정수

리터럴 정수형 예제로

1 2
7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef

여기서 0o177 표현식은 첫번째 문자는 숫자 0이고 두번째 문자 o는 영어 소문자이다. 마찬가지로 0b100110111, 0xdeadbeef에서도 각각 첫번째 문자는 숫자이고 두번째는 영어 소문자이다. 0o(8진수)형식은 8진수를 나타내는 것이고 0b(2진수), 0x(16진수)는 각각 2진수, 16진수를 나타내는 것이다.

리터럴 부동소수점

다음은 리터럴 부동소수점을 표현하는 방법이다.

1
3.14    10.    .001    1e100    3.14e-10    0e0

여기서 3.14e-103.14 * 10 ** (-10)을 의미하는 것이다. 즉 3.14×10103.14 \times 10^{-10}을 의미한다.

리터럴 문자열

"hello", '안녕'과 같이 큰 따옴표 " 또는 작은 따옴표 '로 둘러싸인 문자열은 파이썬 문자열형(str)로 인식한다. 여기서 주의할 것은 따옴표로 둘러싸인 숫자 "100"은 숫자가 아니라 문자열로 인식한다는 것이다. 뿐만아니라 작은 따옴표 또는 큰 따옴표를 연속으로 3개를 사용하여 문자열을 만들 수 있다. 예를 들면

1 2 3
""" 이것은 문자열이다 """

'''이것도 문자열이다.'''

특히 """ 또는 '''을 사용하면 엔터를 쳐서 여러 줄에 걸쳐서 문자열을 만들 수 있다.

1 2 3 4
"""
여러 줄에
걸쳐서 문자열을 만들어 낸다.
"""

리터럴 허수

리터럴 허수는 부동소수점에 j 또는 J를 붙여서 만든다.

1
3.14j   10.j    10j     .001j   1e100j   3.14e-10j

리터럴 바이트형은 사이트 https://docs.python.org/3.6/reference/lexical_analysis.html#string-and-bytes-literals를 참조한다.

1
type(100)
int
1
type(1.234)
float
1
type("hello")
str
1
type('안녕')
str
1
type("100")
str

type(x) 함수는 x가 어떤 유형의 객체인지를 알려준다.

숫자

파이썬 숫자형은 정수형(int), 부동소숫점형(float) 및 복소수형(complex) 세 가지가 있다.

정수형

정수형 숫자의 크기는 무제한이다.id1 정수형을 만드는 방법은 리터럴 상수형에서 본 것과 같이 리터럴 정수를 사용하는 방법과 정수형 객체를 만드는 int(x) 함수를 사용한 방법이 있다. int(100)은 정수형 100을 의미하고 int(1.56)int(-1.56) 은 정수 1-1을 각각 반환한다. 즉, x부터 0쪽 방향으로 정수들 중 x에 가장 가까운 정수를 반환한다. 또한 숫자 대신 문자열을 사용할 수 있다. 즉, int('1234')은 정수 1234을 의미한다. 이 때 문자열은 정수 문자열만 가능하다.

id1. https://docs.python.org/3.6/library/stdtypes.html#numeric-types-int-float-complex
1 2
print(int(100), int(1.56), int(-1.56), sep=', ')
print(int('1234'))
100, 1, -1
1234

int('a1', base=16)과 같이 사용하면 16진수 a1을 나타내는 것으로 10진수로 161을 나타낸다.

1
int('A1', base=16)
161

부동소수점형

부동소수점형의 크기는 시스템에 따라 달라질 수 있고 sys.float_info을 통해서 값을 알 수 있다. 정수형과 마찬가지로 리터럴 상수형 형식 1.234와 같이 소숫점을 이용한 숫자로 만들 수도 있고 float(x)와 같이 부동소수점형 함수를 이용해서 만들 수 있다. x는 리터럴 부동소수점형 및 문자열이 될 수 있다.

1
print(float(1.234), float('1.234'), sep=', ')
1.234, 1.234

복소수형

복소수형은 리터럴 복소수형 또는 complex(re, im) 함수를 통해 만들 수 있다. 여기서 re는 실수부분, im은 허수부분의 부동소수점형을 넣으면 된다. 예를 들면 1 + 2j복소수를 만들고 싶으면 complex(1, 2)라고 하면된다. 여기서 j는 허수부분을 나타내는 표시이다. 수학 서적에서는 i로 표시하기도 한다. 또는 간단히 1 + 2j와 같이 써도 된다. 그런데 2j반드시 붙여 써야 한다.

1 2
x = complex(1, 2)
print(x)
(1+2j)
1
x + complex(2, 3)
(3+5j)
1
x + 3j
(1+5j)

문자열

문자열은 리터럴 상수형에서 살펴본 바와 같이 작은 따옴표, 큰 따옴표로 둘러싸면 문자열이 된다. 또는 str(x) 함수를 이용해서 문자열을 만들 수 있다. str(x)x 객체의 __str()__함수가 구현되어 있으면 x.__str()__값이 반환되고 그렇지 않으면 repr(x)값이 반환된다.id_str

id_str. https://docs.python.org/3.6/library/stdtypes.html#str

포멧(format) 함수

문자열을 생성하려고 할 때, 종종 다른 정보들을 포함하여 생성하고 싶을 때가 있다. 이럴 때 format()함수를 이용해서 문자열을 편리하게 다룰 수 있다.

1 2 3 4
age = 20
name = '홍길동'
print('{0}의 나이는 {1}살 입니다.'.format(name, age))
print('{0}은 파이썬 프로그래밍을 좋아합니다.'.format(name))

괄호 { } 안의 숫자는 format()에 있는 인수의 인덱스를 나타낸다. 인덱스는 0부터 시작한다. { } 안의 숫자가 없으면 인자의 순서대로 들어가게 된다.

1 2 3 4
age = 20
name = '홍길동'
print('{}의 나이는 {}살 입니다.'.format(name, age))
print('{}은 파이썬 프로그래밍을 좋아합니다.'.format(name))

괄호 {}안에 공백이 있으면 안된다. 표시되는 형식을 더 세밀하게 조정할 수 있다.

1 2 3 4 5 6 7
# 소수점 3자리까지 표시
print('{0:.3f}'.format(1.0/3))
# 밑줄 문자 '_' 로 11칸을 채우고, 그 중간에 'hello' 문자열을 놓는다.
# (^) 은 문자열을 중앙에 위치시키고 (>)은 오른쪽, (<)은 왼쪽에 위치시킨다.
print('{0:_^11}'.format('hello'))
# 변수를 이용해서 표시할 수 있다.
print('{name}는 {book} 책을 만들고 있다.'.format(name='윤대기', book='"파이썬 한 입"'))
0.333
___hello___
윤대기는 "파이썬 한 입" 책을 만들고 있다.

탈출 문자열(escape sequence)

'What's your name?'과 같이 작은 따옴표 '로 만들어진 문자열 안에 작은 따옴표가 있으면 문자열이 어디서 끝나는지를 명확하게 알 수 없게 되므로 에러를 낸다.

1
'What's your name'
  File "<ipython-input-5-d10fcea8627e>", line 1
    'What's your name'
          ^
SyntaxError: invalid syntax

이 때는 "What's your name?"과 같이 큰 따옴표를 사용해도 되지만 탈출 문자 \를 이용해서 작은 따옴표를 사용하면서도 문자열 안에 작은 따옴표 '를 넣을 수 있다. 즉, \'와 같이 작은 따옴표 앞에 역슬래스 \를 붙임으로 작은 따옴표를 문자열을 만드는 문자가 아니라고 인식하게 한다. 마찬가지 방법으로 탈출문자와 큰 따옴표를 사용함으로 큰 따옴표를 문자열에 포함시킬 수 있다.

1
'What\'s your name'
"What's your name"

역슬래시 자체를 문자열에 포함시키려면 역슬래시를 두 번 \\ 사용하면된다. \n 문자열(new line)을 이용하면 이 문자열이 위치한 곳에서 엔터를 치는 효과를 얻을 수 있다. 즉 \n 뒷부분부터 새로운 줄에 표시되게 한다.

1
print("첫번째 줄입니다.\n여기부터는 두번째 줄입니다.")
첫번째 줄입니다.
여기부터는 두번째 줄입니다.

\t 문자열을 이용하면 키보드에서 탭(Tab) 키를 누른 효과를 낼 수 있다.

1
print("하나\t둘\t셋")
하나    둘    셋

문자열에 대한 자세한 사용법은 앞으로 나올 클래스 부분에서 다루게 될 것이다.

변수

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

1 2 3 4 5 6
 = 1234
_x1 = "첫문자 밑줄 가능"
School = "학교"
school = "대문자 School과 다른 변수"
my_name = "문자 사이에 밑줄 가능"
print( * 10 + 5, _x1, School, school, my_name, sep='\n')
12345
첫문자 밑줄 가능
학교
대문자 School과 다른 변수
문자 사이에 밑줄 가능

다음은 모두 잘못된 변수 이름이다.

1
35name = '첫문자로 숫자가 올 수 없다'
  File "<ipython-input-20-9d7f89eb01fd>", line 1
    35name = '첫문자로 숫자가 올 수 없다'
         ^
SyntaxError: invalid syntax

여기서 첫 문자로 숫자 3을 변수이름으로 사용할 수 없다. 첫 문자는 반드시 알파벳 또는 밑줄이 와야 한다.

1
m$ = 100
  File "<ipython-input-22-d62daef9b650>", line 1
    mor$ = 100
       ^
SyntaxError: invalid syntax

특수 문자 $를 변수에 사용할 수 없다.

1
class = '키워드'
  File "<ipython-input-23-c0af7fbbd350>", line 1
    class = '키워드'
          ^
SyntaxError: invalid syntax

파이썬 키워드id_keyword 즉, 파이썬이 미리 예약해둔 문자열은 변수로 사용할 수 없다. 다음은 파이썬 키워드들이다.

1 2 3 4 5 6 7
False      class      finally    is         return
None       continue   for        lambda     try
True       def        from       nonlocal   while
and        del        global     not        with
as         elif       if         or         yield
assert     else       import     pass
break      except     in         raise
id_keyword. https://docs.python.org/3.6/reference/lexical_analysis.html#keywords

수식(expression)

수식이란 함수 호출, 변수, 연산자와 상수들의 조합이다. 파이썬 인터프리터는 수식을 평가해서 결과값을 얻고 표시한다.

들여쓰기

다른 언어(C, C++, Java 등)와 다르게 파이썬은 들여쓰기를 특별하게 인식한다. 들여쓰기를 통해서 같은 블록안에 있다는 것을 표시한다. 다음과 같이 들여쓰기를 하면 에러가 난다.

1 2
print('same block?')
 print('no!') # 에러
  File "<ipython-input-14-b3cf98a014a3>", line 2
    print('no!') # 에러
    ^
IndentationError: unexpected indent

들여쓰기가 필요한 경우는 if, while 또는 함수를 정의할 때와 같이 새로운 블록이 필요할 때이다. 나중에 나오겠지만 if 문을 예를 들면

1 2 3 4 5 6 7
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.333333333333333보다 작거나 같은 정수 중 최대정수인 -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의 보수 또는 위키 백과: 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 (논리 NOT 연산자) xTrue 라면, False 를 반환한다. xFalse 라면, True 를 반환한다. x = True; not xFalse 를 반환한다.
and (논리 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)이라고 부른다.
or (논리 OR 연산자) xTrue 이면 True 가 반환되며, False이면 y 와의 or 연산값을 반환한다. x = True; y = False; x or yTrue가 반환된다. 여기서도 위와 같이 단축 계산이 적용된다.

수식 연산자 단축

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

1 2
a = 2
a = a * 3

이러한 연산을 단축하여 계산할 수 있도록 다음과 같이 사용할 수 있다.

1 2
a = 2
a *= 3

즉, 변수 연산자= 수식와 같이 사용할 수 있다. 이것은 변수 = 변수 연산자 수식의 연산을 수행하게 된다.

1 2 3
a = 2
b = 3
a /= b # a = a/b = 2/3 = 0.666666...

단축 연산을 할 때는 오른쪽 수식이 먼저 계산되고 그 계산된 값과 단축 연산을 한다.

1 2 3
x = 6
x /= 3 * 2
print('x = ', x)
x =  1.0

위에서 x = x / 3 * 2와 같이 계산하는 것이 아니라, 오른쪽 수식을 먼저 계산하고 다음에 단축 연산 =/을 한다. 즉 x = x / (3 * 2)와 같이 계산한다.

2의 보수

컴퓨터에서 음의 정수 x-x를 정의할 때 xx에 대한 2의 보수로 정의한다. 2의 보수란 어떤 정수 xx가 주어지고 nn이 충분히 클 때 x+y=2nx + y = 2^n 이 되도록하는 수 yyxx의 2의 보수라고 정의한다. 여기서 정수 xx를 8비트 이진수로 표현했을 때, n=8n=8이면 충분하다. 가령 8비트 x = 0000 0101 즉, 10진수 5일 때 x+y=28x + y = 2^8을 만족하는 수 yyx=5x=5의 2의 보수라고 한다. 8비트 연산에서 282^81 0000 0000으로 하위 8비트 0000 0000만 사용하고 상위 비트 1은 버린다. 그러므로 28=02^8 = 0으로 간주한다. 따라서 y=28xy = 2^8 - x해서 구할 수 있는 것이다. 그러므로 y = 1111 1011이 된다. 이것을 구하는 다른 방법으로, xx의 각 비트의 숫자에서 0은 1로, 1은 0으로 바꾸고, 바뀐 숫자에 1을 더하면 된다. 만일 1을 더해서 나온 숫자가 8비트를 넘어가면 하위 8비트만 사용한다. 즉, 이진수 반전연산 ~x로 표현하면 ~x + 1-x가 되는 것이다.

다음은 -5의 8비트 이진수 표현법을 나타낸 것이다. 먼저 5의 이진수 반전연산을 한다.

1
0000 0101 -> 1111 1010

다음으로 1을 더해서 -5의 이진수 표현법을 얻는다.

1 2 3 4
1111 1010
+       1
----------
1111 1011 # -5의 이진수 표현

이진수 반전 연산 ~x~x + x + 1 = 1 0000 0000(2진법) = 0이 되므로 ~x = -(x+1)이 되는 것이다. 또는 x 대신에 x-1을 넣으면 -x = ~(x-1)이 된다. -5 = ~4이므로 4 = 0000 0010이고 ~4 = 1111 1101이 된다. 따라서 -5의 이진 표현법은 1111 1101가 되는 것이다. 파이썬 2의 보수 위키를 참조한다.

연산자 우선순위

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

연산자 설명
(수식...), [수식...], {키: 값...}, {수식...} 괄호 또는 튜플(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가 계산된다.

문자열 연산

다음과 같이 문자열과 숫자는 수식 연산이 불가능하다.

1 2 3 4 5
>>> message = "msg" # message는 문자열
>>> message - 1 # 에러
>>> "Hello" / 123 # 에러
>>> message * "Hello" # 에러
>>> "15" + 2 # 에러

그렇지만 문자열과 문자열 사이에 덧셈 연산자 +를 사용할 수 있다. 여기서 덧셈은 당연히 수식 더하기가 아니라 두 문자열을 결합하는 연산을 수행하게 된다. 예를 들면

1 2 3
fruit = "바나나"
baked_good = " 호두과자"
print(fruit + baked_good)
바나나 호두과자

문자열 * 양의 정수 형태로 곱셈 연산자를 사용할 수도 있다. 이것은 문자열양의 정수 갯수만큼 반복해서 새로운 문자열을 반환한다.

1
'호두' * 3
'호두호두호두'

사용자 입력

input() 함수를 이용하여 키보드로부터 입력을 받을 수 있다. input() 함수는 받아들인 값을 모두 문자열로 반환하기 때문에 숫자로 변환하기 위해서는 int(), float()와 같은 함수들을 이용하여 변환해야 한다.

1 2
name = input("이름을 입력하시오: ")
age = int(input("나이를 입력하시오: "))

연습

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

results matching ""

    No results matching ""