파이썬 기초

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

주석

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

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

주석은 코드를 작성하면서 그 코드의 설명을 붙이기 위해서 사용되기도 한다.

In [17]:
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)
Out[17]:
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

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

In [2]:
type(100)
Out[2]:
int
In [3]:
type(1.234)
Out[3]:
float
In [4]:
type("hello")
Out[4]:
str
In [5]:
type('안녕')
Out[5]:
str
In [6]:
type("100")
Out[6]:
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)를 사용하는 방법이 있다.

In [7]:
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을 나타낸다.

In [8]:
int('A1', base=16)
Out[8]:
161

진법에 맞지 않는 문자열이 나오면 에러가 난다.

In [1]:
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진수로 사용할 수 있다.

In [2]:
int(0xFA10)
Out[2]:
64016

직접하기

  • 이진수 1001001을 정수로 나타내시오.
  • 8진수 70372를 정수로 나타내시오.
  • 16진수 1A3FE5를 정수로 나타내시오.
  • 위의 각각의 정수를 거꾸로 2진수, 8진수, 16진수로 바꾸어 보시오.(bin(), oct(), hex()를 사용하시오.)

부동소수점형

부동소수점형의 크기는 시스템에 따라 달라질 수 있고 sys.float_info을 통해서 값을 알 수 있다.

In [3]:
import sys

sys.float_info
Out[3]:
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는 리터럴 부동소수점형 및 문자열이 될 수 있다.

In [5]:
float(1.234)
Out[5]:
1.234
In [6]:
float('-1.23e4')
Out[6]:
-12300.0

거듭제곱을 나타내는 문자 e 또는 E를 사용할 때는 반드시 숫자가 앞에 나와야 한다.

In [7]:
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복소수를 만들고 싶으면 다음과 같이 한다.

In [8]:
complex(1, 2)
Out[8]:
(1+2j)

여기서 j는 허수부분을 나타내는 표시이다. 수학 서적에서는 i로 표시하기도 한다. 또는 간단히 1 + 2j와 같이 써도 된다. 그런데 2j반드시 붙여 써야 한다.

In [9]:
(1 + 2j) + complex(2, 3)
Out[9]:
(3+5j)

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

직접하기

  • \(z_1 = -1 + 3i\), \(z_2 = 2 - 5i\)에 대해서 사칙연산을 수행해 보시오.
  • 복소수 -3 + 5j의 실수 및 허수부분을 각각 출력하는 코드를 작성하시오.

문자열

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

In [1]:
문자열 = str(123.12)
type(문자열)
Out[1]:
str

문자열 접근

문자열열거형의 일종이기 때문에 문자열에 있는 하나 하나의 문자들을 인덱스를 통해 접근할 수 있다. 파이썬에서 인덱스란 열거형 안에 있는 항목들의 순서를 나타내는 0부터 시작하는 양의 정수를 말한다.

In [68]:
문자열 = "문자열은 열거형이라서 인덱스를 통해서 성분들을 접근할 수 있다."

print("인덱스 0인 문자:", 문자열[0])
인덱스 0인 문자: 문

열거형은 슬라이싱도 가능하다. 즉, 원하는 부분만 추려낼 수 있다.

In [69]:
문자열 = "문자열은 열거형이라서 인덱스를 통해서 성분들을 접근할 수 있다."

print("0부터 10까지 성분들:", 문자열[0:11])
0부터 10까지 성분들: 문자열은 열거형이라서

열거형의 성분들의 갯수를 알 수 있는 len() 함수를 이용할 수 있다.

In [70]:
문자열 = "문자열 성분의 갯수를 알수 있다."

len(문자열)
Out[70]:
18

문자열의 마지막 문자를 알아보기 위해서 다음과 같이 문자열의 크기로 접근하면 에러가 난다.

In [71]:
문자열 = "문자열 성분의 갯수를 알수 있다!"
문자열크기 = len(문자열)
문자열[문자열크기]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-71-db68cc434fbd> in <module>()
      1 문자열 = "문자열 성분의 갯수를 알수 있다!"
      2 문자열크기 = len(문자열)
----> 3 문자열[문자열크기]

IndexError: string index out of range

왜냐하면 문자열의 인덱스는 0부터 시작하기 때문에 문자열의 마지막 인덱스는 len(문자열)-1이 된다.

In [72]:
문자열 = "문자열 성분의 갯수를 알수 있다!"
문자열크기 = len(문자열)
문자열[문자열크기 - 1]
Out[72]:
'!'

+ 연산자를 이용해서 2개의 문자열을 붙일 수 있다.

In [73]:
"앞 문자열" + "뒷 문자열"
Out[73]:
'앞 문자열뒷 문자열'

그런데 숫자와 문자열을 붙일려고 + 연산자를 사용하면 다음과 같은 에러가 난다.

In [74]:
"문자열" + 100
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-74-a8d3652033c4> in <module>()
----> 1 "문자열" + 100

TypeError: must be str, not int

100은 숫자형이라서 문자열과 + 덧셈이 정의되지 않아서 에러를 내는 것이다. 이럴때는 숫자형을 문자형으로 변형하는 str() 메소드를 사용하면된다.

In [75]:
"문자열" + str(100)
Out[75]:
'문자열100'

비교 연산

비교 연산자 <, >, ==를 이용하여 두 문자열을 비교할 수 있다. 두 문자열은 사전식 배열의 순서를 가지고 앞, 뒤를 비교한다. 문자열은 사전식 배열에서 뒤에 있을 수록 커진다.

In [76]:
"나는" < "너는"
Out[76]:
True
In [77]:
단어 = "한글"

if 단어 == "한글":
    print(단어+"을 사랑합시다.")
한글을 사랑합시다.

모든 영문 대문자는 소문자보다 앞에 있다.

In [78]:
'Z' < 'a'
Out[78]:
True

innot in 연산

문자열 안에 부분 문자열이 있는지를 확인할 수 있는 연산자 in 또는 not in을 사용할 수 있다.

In [79]:
"사" in "사과"
Out[79]:
True
In [80]:
"소" in "사과"
Out[80]:
False
In [81]:
"붕어" in "붕어빵에 붕어가 있다?"
Out[81]:
True
In [82]:
"호두알" not in "호두과자"
Out[82]:
True

for문 이용 문자열 순회

In [83]:
 = "윤김이정강박"
이름 = "예은"

for 문자 in :
    print(문자+이름)
윤예은
김예은
이예은
정예은
강예은
박예은

불변(immutable)

문자열은 불변이라서 한 번 만들어진 문자열 객체의 내용을 변경할 수 없다. 아래와 같이 문자열의 일부를 변경하려고 하면 에러를 발생시킨다.

In [84]:
문자열 = "문자열의 내용은 변경할 수 없다."

문자열[0] = '글'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-84-b66cd0a0738b> in <module>()
      1 문자열 = "문자열의 내용은 변경할 수 없다."
      2
----> 3 문자열[0] = '글'

TypeError: 'str' object does not support item assignment

그렇지만 새로운 객체를 기존의 변수에 대입하는 것은 아무 문제가 되질 않는다.

In [85]:
문자열 = "문자열의 내용은 변경할 수 없다."

문자열 = "새로운 문자열 객체를 대입한다."

print(문자열)
새로운 문자열 객체를 대입한다.

format

형식 문자열(format string)에 대해서 format() 메소드를 사용할 수 있다. 형식 문자열이란 중괄호 { }를 포함하는 문자열을 말한다. 형식 문자열은 중괄호 기호를 제외한 모든 문자열을 리터럴 문자열로 간주한다. 형식 문자열 안에 중괄호를 표시하려면 중괄호를 두 번 {{ 또는 }}를 사용하면 된다.

In [86]:
 = "format 메소드에서는 중괄호 {}를 제외한 모든 문자열은 리터럴 문자열로 간주한다!. 중괄호를 표시하고 싶으면 {{ 와 같이 두 번 }} 쓴다."

.format("(이곳이 중괄호가 있던 곳이다)")
Out[86]:
'format 메소드에서는 중괄호 (이곳이 중괄호가 있던 곳이다)를 제외한 모든 문자열은 리터럴 문자열로 간주한다!. 중괄호를 표시하고 싶으면 { 와 같이 두 번 } 쓴다.'

변수 에 대입되는 문자열 안에 중괄호가 포함되어 있기 때문에 형식 문자열이 된다. 형식 문자열 안의 중괄호에는 format(인자) 메소드에 인자를 넣어서 중괄호를 대체할 수 있다. 여기서는 "(이곳이 중괄호가 있던 곳이다)" 문자열 인자를 넣었다. 중괄호 안에 공백 문자가 있으면 format() 메소드 사용시 다음과 같은 에러가 나므로 중괄호 안에는 형식에 맞도록 사용해야 한다.

In [87]:
"중괄호 { } 안에 공백 문자가 있으면 에러가 난다".format("에러") # 중괄호 사이에 공백문자(스페이스)가 있어 에러
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-87-6cc1067c8bc1> in <module>()
----> 1 "중괄호 { } 안에 공백 문자가 있으면 에러가 난다".format("에러") # 중괄호 사이에 공백문자(스페이스)가 있어 에러

KeyError: ' '

예제

예제를 통해서 익혀보자. 중괄호 안에 인자의 순서에 해당하는 인덱스를 넣어서 원하는 위치에 인자값을 표시할 수 있다.

In [88]:
"{0}번째, {1}번째, {2}번째".format("첫", "두", 3)
Out[88]:
'첫번째, 두번째, 3번째'

인자의 인덱스를 바꾸어 출력되는 값을 변경할 수 있다.

In [89]:
"순서를 바꿀 수 있다. {1}번째, {2}번째, {0}번째".format("첫", "두", 3)
Out[89]:
'순서를 바꿀 수 있다. 두번째, 3번째, 첫번째'

중괄호 안을 비워두면 인자가 순서대로 대입된다. 중괄호 안에 인덱스가 부분적으로 들어가면 에러가 난다. 인자의 인덱스는 모두 들어가든지 아니면 모두 비워 두어야 한다. 단 키워드 인자의 이름은 어느 곳에 위치해도 상관없다.

In [90]:
"{}번째, {}번째, {}번째".format("첫", "두", 3)
Out[90]:
'첫번째, 두번째, 3번째'

함수 단원에서 배웠던 * 연산자를 통해서 리스트 또는 튜플을 인자에서 풀어서 사용할 수 있다.

In [91]:
풀리는인자 = ("첫", "두", "3")

"{}번째, {}번째, {}번째".format(*풀리는인자)
Out[91]:
'첫번째, 두번째, 3번째'

인자의 인덱스를 중복해서 사용할 수 있고 사용하지 않아되 된다.

In [92]:
"{0}번째, {2}번째, {0}번째".format("첫", "두", 3)
Out[92]:
'첫번째, 3번째, 첫번째'

format() 메소드 인자로 키워드 인자가 들어갈 수 있다. 키워드 인자의 이름 중괄호 안에 대입하여 원하는 결과를 만들어 낸다.

In [93]:
"우리가 사용하는 {언어}{만든이}과 여러 학자들이 만들었다.".format(언어="한글", 만든이="세종대왕")
Out[93]:
'우리가 사용하는 한글은 세종대왕과 여러 학자들이 만들었다.'

객체의 속성을 표시할 수 있다. 복소수는 실수부분과 허수부분의 속성을 갖고 있다. 이 속성을 키워드와 인덱스를 이용하여 접근하여 표시할 수 있다.

In [94]:
복소수 = 2 - 5j

print("복소수의 실수부분은 {수.real}이고 허수부분은 {수.imag}이다.".format(=복소수)) # 키워드 이용
print("복소수의 실수부분은 {0.real}이고 허수부분은 {0.imag}이다.".format(복소수)) # 인덱스 이용
복소수의 실수부분은 2.0이고 허수부분은 -5.0이다.
복소수의 실수부분은 2.0이고 허수부분은 -5.0이다.

중괄호 안에 콜론 : 뒤에 삽입될 문자열에 대한 세부 형식을 지정할 수 있다. 즉 {인자이름:형식} 과 같이 사용할 수있다. 형식은 다음과 같다.

[[채울문자]정렬기호][부호][#][0][길이][그룹옵션][.소숫점길이][타입]

길이란 출력될 문자열의 크기이다. 채울문자는 문자열이 삽입되고 지정된 길이의 남는 공간을 채울 문자이다. 정렬기호란 삽입될 문자열이 배치될 위치를 나타내는 문자이다.

정렬기호 의미
< 삽입될 문자열을 왼쪽에 위치
> 삽입될 문자열을 오른쪽에 위치
^ 삽입될 문자열을 가운데 위치
In [95]:
 = "삽입 문자열"

print("{:#^20}".format())
#######삽입 문자열#######

채울문자를 지정했으면 반드시 정렬기호가 함께 입력되어야 한다.

In [96]:
 = "삽입 문자열"

print("{:*20}".format())
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-96-1227b77267ec> in <module>()
      1= "삽입 문자열"
      2
----> 3 print("{:*20}".format())

ValueError: Invalid format specifier

채울 문자 *이 있는데 뒤에 정렬 기호가 없기 때문에 오류가 발생한다.

부호는 삽입될 인자가 숫자일 때 사용하는 것으로 +, -, 스페이스(공백)가 입력가능하다.

부호 옵션 의미
+ 양수, 음수 모두 부호 표시
- 음수일 때만 부호 표시
스페이스 양수일 때는 부호가 스페이스(공백)이고 음수일 때는 - 기호 표시
In [97]:
print("{:#^+10}".format(1.234))
print("{:#^ 10}".format(1.234))
##+1.234##
## 1.234##

# 문자는 삽입 인자가 숫자형일 때 사용되는 것으로 타입에 따라서 이진법은 0b, 8진법은 0o, 16진법은 0x가 숫자 앞에 표시된다.

In [98]:
print("정수: {0:#d}, 2진수: {0:#b}, 8진수: {0:#o}, 16진수: {0:#x}".format(23))
정수: 23, 2진수: 0b10111, 8진수: 0o27, 16진수: 0x17

더 자세한 형식 문자열은 https://docs.python.org/3/library/string.html#formatstrings 을 참조하자.

replace

replace(찾을, 바뀔) 찾을 문자열을 바뀔 문자열로 모두 바꾸어 새로운 문자열을 반환한다.

In [99]:
문자열 = "아찔아찔 현기증이 난다."
새문자열 = 문자열.replace("아", "어")
print("새문자열:", 새문자열)
새문자열: 어찔어찔 현기증이 난다.

startswith, endswith

startswith(시작문자열) 시작문자열로 시작하면 True를 반환하고 그렇지 않으면 False를 반환한다. 마찬가지로 endswith(끝나는문자열) 끝나는문자열로 끝나면 True 그렇지 않으면 False를 반환한다.

In [100]:
문자열 = "반짝 반짝 작은 별"
print(문자열.startswith("반짝"))
print(문자열.endswith("별"))
print(문자열.startswith("번쩍"))
print(문자열.endswith("벌"))
print(문자열.startswith(("번쩍", "반짝"))) # 문자열 튜플이 올 수 있다.
True
True
False
False
True

count

count(찾을문자열) 찾을문자열의 갯수를 반환한다.

In [101]:
문자열 = "반짝 반짝 작은 별"
문자열.count("반짝")
Out[101]:
2

find

문자열.find(찾을문자열) 문자열 안에 찾을문자열이 처음으로 발견되는 인덱스를 반환한다. 찾는 문자열이 없으면 -1을 반환한다.

In [102]:
문자열 = "반짝 반짝 작은 별"
문자열.find("짝")
Out[102]:
1

참고: 문자열 안에 찾을 문자열이 있는 지 없는 지를 알고 싶으면 in을 사용한다.

In [103]:
문자열 = "반짝 반짝 작은 별"
"짝" in 문자열
Out[103]:
True

split

문자열 메소드 중에서 많이 사용되는 메소드 중의 하나가 split이다. 여러 단어로 이루어진 문자열을 여백을 기준으로 단어들을 분리해서 리스트를 만들어 반환한다. 리스트를 만들어 반환할 때 여백은 포함시키지 않는다. 여백(whitespace)이란 탭(tab), 새 줄(new line), 공백(space) 문자들을 의미한다.

In [104]:
문자열 = "너의 마음은 나의 마음\n 나의 마음은 너의 마음"
문자열.split()
Out[104]:
['너의', '마음은', '나의', '마음', '나의', '마음은', '너의', '마음']

문자열.split(구분문자열)을 이용하면 구분문자열을 기준으로 문자열을 분리한다.

In [105]:
문자열 = "너의 마음은 나의 마음 나의 마음은 너의 마음"
문자열.split("의")
Out[105]:
['너', ' 마음은 나', ' 마음 나', ' 마음은 너', ' 마음']

구분 문자열이 연속이 될 때는 빈 문자로 분리된다.

In [106]:
"1,,2,3".split(',')
Out[106]:
['1', '', '2', '3']

낱 글자로 분리하려면 list()를 이용한다.

In [107]:
문자열 = "너의 마음은 나의 마음"
list(문자열)
Out[107]:
['너', '의', ' ', '마', '음', '은', ' ', '나', '의', ' ', '마', '음']

직접하기

  • input() 함수를 이용해서 여러 개의 숫자를 한꺼번에 입력받아 모두 더한 값을 출력하는 프로그램을 작성하시오.

join

문자열.join(반복가능객체)반복가능객체의 각 성분 사이를 문자열로 연결한다.

In [108]:
전화번호 = "010 1234 5678"
번호리스트 = 전화번호.split()
print("번호리스트:", 번호리스트)
번호 = "-".join(번호리스트)
print("연결된 번호:", 번호)
번호리스트: ['010', '1234', '5678']
연결된 번호: 010-1234-5678

반복가능 객체의 성분은 문자열이어야 한다.

In [109]:
반복가능 = [("ㄱ", "ㄴ"), ("ㄷ", "ㄹ")]
"-".join(반복가능)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-109-d0a56bbe4d5e> in <module>()
      1 반복가능 = [("ㄱ", "ㄴ"), ("ㄷ", "ㄹ")]
----> 2 "-".join(반복가능)

TypeError: sequence item 0: expected str instance, tuple found

직접하기

  • 문자열 '010*1234****5678''010-1234-5678'로 바꾸는 프로그램을 작성하시오.

문자열에 대해서 더 세밀한 작업을 하려면 정규 표현식(regular expression) 모듈 re을 살펴보면 된다.

연습문제

  • 사용자로부터 input() 함수를 이용하여 숫자 5개를 쉼표로 구분해서 입력을 받아 split()을 이용하여 리스트로 만들어 각각의 수를 출력하시오.

  • 사용자로부터 문자열을 입력받아 그 문자열 안에 “는”이라는 문자가 포함된 단어와 단어의 갯수를 출력하는 프로그램을 작성하시오.

  • 문자열 "너의 마음은 나의 마음 나의 마음은 너의 마음"에서 "너""나""나""너"로 바꾸는 프로그램을 작성하시오.

  • 사용자로부터 휴대폰 전화번호를 입력받고 유효한 번호인지를 확인하는 함수 전화번호확인(문자열)를 작성하시오. 유효하면 입력한 번호를 xxx-xxxx-xxxx 형식으로 출력하시오. 입력 받는 문자 중에 -는 유효한 것으로 받아들이도록 한다. 아래 그림과 같은 결과가 나오도록 하시오.

  • 새로운 암호를 만들 때 숫자, 문자, 특수문자가 반드시 한 문자 이상씩 포함되어야 하고 문자의 갯수는 적어도 8자 이상이어야 한다. 사용자가 문자열을 입력했을 때 암호 조건에 맞는지 확인하는 프로그램을 작성하시오. 공백문자는 포함하면 안된다. 특수문자는 다음을 사용한다.

'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

포멧(format) 함수

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

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

괄호 { } 안의 숫자는 format()에 있는 인수의 인덱스를 나타낸다. 인덱스는 0부터 시작한다. { } 안의 숫자가 없으면 인자의 순서대로 들어가게 된다. 중괄호 {}를 포함하는 문자열을 형식 문자열(formatted string)이라고 한다. 형식 문자열은 데이터 형 부분에서 자세히 다룬다.

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

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

In [13]:
# 소수점 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?'과 같이 작은 따옴표 '로 만들어진 문자열 안에 작은 따옴표가 있으면 문자열이 어디서 끝나는지를 명확하게 알 수 없게 되므로 에러를 낸다.

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

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

In [15]:
'What\'s your name'
Out[15]:
"What's your name"

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

In [16]:
print("첫번째 줄입니다.\n여기부터는 두번째 줄입니다.")
첫번째 줄입니다.
여기부터는 두번째 줄입니다.

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

In [17]:
print("하나\t\t셋")
하나      둘       셋

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

변수

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

In [18]:
한글 = 1234
_x1 = "첫문자 밑줄 가능"
School = "학교"
school = "대문자 School과 다른 변수"
my_name = "문자 사이에 밑줄 가능"
print(한글 * 10 + 5, _x1, School, school, my_name, sep='\n')
12345
첫문자 밑줄 가능
학교
대문자 School과 다른 변수
문자 사이에 밑줄 가능

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

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

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

In [20]:
m$ = 100
  File "<ipython-input-20-8234573aaed3>", line 1
    m$ = 100
     ^
SyntaxError: invalid syntax

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

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

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

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

식(expression)

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

다음은 상수와 상수의 연산으로 이루어진 식이다.

2 + 3

다음은 변수 x와 상수의 연산으로 이루어진 식이다.

x + 2

sin 함수와 변수 x, 상수의 연산으로 이루어진 식이다.

import math

math.sin(2) + x ** 2

들여쓰기

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

In [22]:
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...

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

In [23]:
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) 원소 접근, 슬라이스, 함수 호출, 속성 참조
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 # 에러

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

In [24]:
fruit = "바나나"
baked_good = " 호두과자"
print(fruit + baked_good)
바나나 호두과자

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

In [25]:
'호두' * 3
Out[25]:
'호두호두호두'

사용자 입력

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