[4일차] Python

송정근·2026년 5월 23일

파이썬의 입력과 출력

1. 입력: input()

input()은 사용자로부터 키보드 입력을 받는 파이썬 내장 함수다.

name = input("이름을 입력하세요: ")
print(name)

사용자가 값을 입력하고 Enter를 누르면, 입력한 값이 프로그램으로 전달된다.

예를 들어 다음 코드를 실행한다고 하자.

name = input("이름을 입력하세요: ")
print(f"{name}님 안녕하세요!")

사용자가 김사과를 입력하면 다음과 같이 출력된다.

김사과님 안녕하세요!

input()의 중요한 특징

input()으로 입력받은 값은 항상 문자열 str 타입이다.

num1 = input("첫 번째 숫자: ")
num2 = input("두 번째 숫자: ")

print(num1 + num2)

사용자가 10, 20을 입력하면 결과는 30이 아니라 1020이다.

1020

이유는 num1과 num2가 숫자가 아니라 문자열이기 때문이다. 문자열끼리 + 연산을 하면 덧셈이 아니라 문자열 연결이 일어난다.

숫자 계산을 하려면 int()를 사용해 정수로 변환해야 한다.

num1 = input("첫 번째 숫자: ")
num2 = input("두 번째 숫자: ")

print(int(num1) + int(num2))

또는 입력받는 순간 바로 변환할 수도 있다.

num1 = int(input("첫 번째 숫자: "))
num2 = int(input("두 번째 숫자: "))

print(num1 + num2)

여러 값을 한 번에 입력받기

여러 값을 한 번에 입력받을 때는 split()을 사용할 수 있다.

name, age, weight = input("이름 나이 몸무게를 입력하세요: ").split()

print(name)
print(age)
print(weight)

split()은 기본적으로 공백을 기준으로 문자열을 나눈다.

김사과 20 50.5

위와 같이 입력하면 각각 다음 값이 들어간다.

name = "김사과"
age = "20"
weight = "50.5"

주의할 점은 split()으로 나눈 값도 여전히 문자열이라는 것이다. 숫자로 계산하려면 int()나 float()로 변환해야 한다.

age = int(age)
weight = float(weight)

2. 출력: print()

print()는 값을 화면에 출력하는 함수다.

print("안녕하세요 파이썬")
print(10)
print("10")
print("안녕하세요", "파이썬")

여러 값을 콤마로 구분해서 출력하면 값 사이에 공백이 들어간다.

print(10, 20, 30, 40)

출력 결과:

10 20 30 40

sep 옵션

sep은 여러 값을 출력할 때 값 사이에 들어갈 구분자를 지정한다.

print("010", "1234", "5678", sep="-")

출력 결과:

010-1234-5678

다른 문자도 사용할 수 있다.

print(10, 20, 30, 40, sep=" / ")

출력 결과:

10 / 20 / 30 / 40

end 옵션

end는 출력이 끝난 뒤 붙일 문자를 지정한다. 기본값은 줄바꿈 문자 \n이다.

print("Hello")
print("Python")

출력 결과:

Hello
Python

end 값을 바꾸면 줄바꿈 대신 다른 문자를 붙일 수 있다.

print("Hello", end=" ")
print("Python")

출력 결과:

Hello Python

3. 이스케이프 문자

이스케이프 문자(Escape Character)는 문자열 안에서 특별한 기능을 하는 문자다. 백슬래시 \로 시작한다.

자주 사용하는 이스케이프 문자는 다음과 같다.

문자의미
\n줄바꿈
\t탭
\\백슬래시 출력
\"큰따옴표 출력
\'작은따옴표 출력
\r커서를 줄의 처음으로 이동
\b백스페이스

예시:

print("Hello\nPython!")
print("Name:\t김사과")
print("C:\\Users\\Administrator\\Documents")

출력 결과:

Hello
Python!
Name:   김사과
C:\Users\Administrator\Documents

문자열 안에서 백슬래시 자체를 출력하려면 \\처럼 두 번 써야 한다.

4. 문자열 포매팅

문자열 포매팅은 변수 값을 문자열 안에 넣어 출력하는 방법이다.

파이썬에서는 여러 방식의 포매팅을 지원한다.

  1. % 서식 지정자
  2. str.format()
  3. f-string

현재는 f-string을 가장 많이 사용한다.

4.1 % 서식 지정자

오래된 방식이지만, 기존 코드에서 여전히 볼 수 있다.

서식의미
%s문자열
%d정수
%f실수
%x16진수
num = 255
pi = 3.141592
name = "김사과"

print("문자열 출력: %s" % name)
print("정수 출력: %d" % num)
print("실수 출력: %f" % pi)
print("소수점 자리 지정: %.2f" % pi)
print("16진수 출력: %x" % num)
print("0 채움 정수: %05d" % 42)
print("여러 값 출력: %s %d %.2f" % (name, num, pi))

4.2 str.format()

format()은 문자열 안의 {} 자리에 값을 넣는 방식이다.

num = 255
pi = 3.141592
name = "김사과"

print("기본 출력: {}".format(name))
print("정수 출력: {:d}".format(num))
print("실수 출력: {:f}".format(pi))
print("16진수 출력: {:x}".format(num))
print("0 채움 정수: {:05d}".format(42))
print("소수점 자리 지정: {:.2f}".format(pi))

여러 값도 넣을 수 있다.

name = "김사과"
age = 20

print("이름은 {}이고 나이는 {}살입니다.".format(name, age))

4.3 f-string

f-string은 문자열 앞에 f를 붙이고, {} 안에 변수나 표현식을 넣는 방식이다.

name = "김사과"
age = 20

print(f"이름은 {name}이고 나이는 {age}살입니다.")

표현식도 바로 넣을 수 있다.

a = 10
b = 20

print(f"{a} + {b} = {a + b}")

출력 결과:

10 + 20 = 30

소수점 자리도 지정할 수 있다.

pi = 3.141592

print(f"{pi:.2f}")

출력 결과:

3.14

가독성이 좋고 사용하기 쉬워서, 특별한 이유가 없다면 f-string을 사용하는 것이 좋다.

연산자

연산자는 값을 계산하거나 비교하고, 논리적인 판단을 수행하기 위해 사용하는 기호다.

1.1 산술 연산자

산술 연산자는 숫자 계산에 사용된다.

연산자의미
+더하기
-빼기
*곱하기
/나누기
//몫
%나머지
**거듭제곱
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
print(10 // 3)
print(10 % 3)
print(10 ** 3)

/는 항상 실수 나눗셈 결과를 반환한다.

print(10 / 3)

출력 결과:

3.3333333333333335

//는 몫을 구한다.

print(10 // 3)

출력 결과:

3

1.2 비교 연산자

비교 연산자는 두 값을 비교한다. 결과는 항상 True 또는 False다.

연산자의미
==같다
!=같지 않다
<작다
<=작거나 같다
>크다
>=크거나 같다
print(10 > 5)
print(10 < 5)
print(10 >= 5)
print(10 <= 5)
print(10 == 5)
print(10 != 5)

1.3 할당 연산자

할당 연산자는 변수에 값을 저장할 때 사용한다.

연산자의미
=할당
+=더한 후 할당
-=뺀 후 할당
*=곱한 후 할당
/=나눈 후 할당
//=몫을 구한 후 할당
%=나머지를 구한 후 할당
**=거듭제곱 후 할당
num = 10

num += 1
print(num)

num -= 1
print(num)

num *= 10
print(num)

num /= 10
print(num)

num += 1은 다음 코드와 같은 의미다.

num = num + 1

1.4 비트 연산자

비트 연산자는 정수를 2진수 비트 단위로 계산하는 연산자다.

연산자의미
&비트 AND
``
^비트 XOR
~비트 NOT
<<왼쪽 시프트
>>오른쪽 시프트
a = 60  # 111100
b = 13  # 001101

print(a & b)   # 12
print(a | b)   # 61
print(a ^ b)   # 49
print(~a)      # -61
print(a << 2)  # 240
print(a >> 2)  # 15

비트 연산 예시

a = 60, b = 13을 2진수로 보면 다음과 같다.

a = 111100
b = 001101

&는 두 비트가 모두 1일 때만 1이 된다.

  111100
& 001101
--------
  001100

001100은 10진수로 12다.

print(60 & 13)
# 12

1.5 컴퓨터에서 음수를 표현하는 방법

컴퓨터는 내부적으로 0과 1만 저장한다. 그래서 음수를 표현하기 위해 별도의 규칙이 필요하다.

현대 컴퓨터에서는 대부분 2의 보수(two's complement) 방식을 사용한다.

2의 보수로 음수를 만드는 방법은 다음과 같다.

1. 양수의 비트를 모두 뒤집는다.
2. 1을 더한다.

예를 들어 8비트에서 5는 다음과 같다.

00000101

비트를 모두 뒤집으면:

11111010

여기에 1을 더한다.

11111010
+       1
---------
11111011

따라서 8비트 2의 보수에서 -5는 다음과 같다.

11111011

2의 보수를 사용하면 덧셈만으로 뺄셈을 처리할 수 있고, 0을 하나만 표현할 수 있어 효율적이다.

1.6 부동소수점 오차

파이썬에서 실수는 보통 부동소수점 방식으로 저장된다. 부동소수점은 실수를 정확히 저장하는 방식이 아니라, 제한된 비트 안에서 근사해서 저장하는 방식이다.

대표적인 예시는 다음과 같다.

print(1.1 + 0.1)
print(1.1 + 0.1 == 1.2)

결과는 다음처럼 나올 수 있다.

1.2000000000000002
False

왜 이런 일이 생길까?

컴퓨터는 숫자를 2진수로 저장한다. 그런데 0.1, 1.1, 1.2 같은 10진 소수는 2진수로 정확히 표현되지 않는다.

예를 들어 0.1은 2진수로 다음처럼 무한히 반복된다.

0.1 = 0.00011001100110011...₂

컴퓨터는 무한히 긴 값을 저장할 수 없으므로, 가장 가까운 값으로 잘라서 저장한다. 그래서 계산 결과에 아주 작은 오차가 생길 수 있다.

이런 값을 비교할 때는 ==를 직접 사용하기보다, 충분히 가까운지 확인하는 방식이 안전하다.

import math

print(math.isclose(1.1 + 0.1, 1.2))

출력 결과:

True

2. 논리 연산자

논리 연산자는 조건을 조합할 때 사용한다.

연산자의미
and둘 다 참이면 참
or하나라도 참이면 참
not참과 거짓을 반대로 바꿈
a = True
b = False

print(a and b)
print(a or b)
print(not a)

파이썬의 and, or는 항상 True나 False만 반환하지 않는다. 마지막으로 평가된 값을 반환한다.

print(True and 3)   # 3
print(3 and 5)      # 5
print(0 and 5)      # 0

print(False or 3)   # 3
print(3 or 5)       # 3
print(0 or 5)       # 5

이 동작은 파이썬의 truthy, falsy 개념과 연결된다.

3. Boolean으로 평가되는 값

파이썬에서는 값 자체가 조건식에서 True 또는 False처럼 평가될 수 있다.

True로 평가되는 값

다음 값들은 대부분 True로 평가된다.

0이 아닌 숫자
비어 있지 않은 문자열
비어 있지 않은 리스트
비어 있지 않은 튜플
비어 있지 않은 세트
비어 있지 않은 딕셔너리
True

예시:

print(bool(1))
print(bool(-1))
print(bool("Python"))
print(bool([1, 2, 3]))

False로 평가되는 값

다음 값들은 False로 평가된다.

False
0
0.0
""
[]
()
set()
{}
None

예시:

print(bool(0))
print(bool(""))
print(bool([]))
print(bool(None))

조건문에서 자주 사용된다.

name = ""

if name:
    print("이름이 있습니다.")
else:
    print("이름이 비어 있습니다.")

컬렉션 타입

컬렉션 타입은 여러 개의 데이터를 하나의 변수에 저장하고 관리할 수 있게 해주는 자료형이다.

파이썬의 대표적인 컬렉션 타입은 다음과 같다.

타입특징
리스트 list순서가 있고, 변경 가능
튜플 tuple순서가 있고, 변경 불가능
세트 set순서가 없고, 중복을 허용하지 않음
딕셔너리 dictkey-value 쌍으로 저장

이번 글에서는 리스트를 중심으로 정리한다.

1. 리스트

리스트(List)는 여러 개의 데이터를 하나의 변수에 순서대로 저장할 수 있는 자료형이다.

리스트는 대괄호 []를 사용해 만든다.

li1 = [1, 3, 5, 7, 9]
li2 = ["김사과", "반하나", "오렌지"]
li3 = [1, 50.5, "김사과", True]

리스트의 특징은 다음과 같다.

1. 순서가 있다.
2. 인덱스로 접근할 수 있다.
3. 값을 추가, 수정, 삭제할 수 있다.
4. 서로 다른 타입의 값도 함께 저장할 수 있다.

1.1 리스트 만들기

li1 = [1, 3, 5, 7, 9]
print(li1)
print(type(li1))

list() 함수를 사용해서 만들 수도 있다.

li2 = list([1, 3, 5, 7, 9])
print(li2)
print(type(li2))

서로 다른 타입의 값을 함께 저장할 수도 있다.

li3 = [1, 50.5, "김사과", True]

print(li3[0])
print(li3[1])
print(li3[2])
print(li3[3])

2. 리스트 인덱싱

인덱싱은 리스트에서 특정 위치의 요소 하나를 꺼내는 것이다.

파이썬의 인덱스는 0부터 시작한다.

li = [10, 20, 30, 40, 50]

print(li[0])   # 10
print(li[1])   # 20
print(li[-1])  # 50

음수 인덱스는 뒤에서부터 접근한다.

li[-1] = 마지막 요소
li[-2] = 뒤에서 두 번째 요소

리스트 안에 리스트가 들어갈 수도 있다.

li = [1, 2, "파이썬", ["김사과", "오렌지"]]

print(li[3])
print(li[3][1])

출력 결과:

['김사과', '오렌지']
오렌지

3. 리스트 슬라이싱

슬라이싱은 리스트에서 여러 요소를 잘라 새로운 리스트를 만드는 것이다.

기본 형태는 다음과 같다.

리스트[start:end:step]

각 값의 의미는 다음과 같다.

항목의미
start시작 위치, 포함
end끝 위치, 포함하지 않음
step몇 칸씩 이동할지

예시:

li = [10, 20, 30, 40, 50]

print(li[0:3])
print(li[1:4])
print(li[:3])
print(li[2:])

출력 결과:

[10, 20, 30]
[20, 30, 40]
[10, 20, 30]
[30, 40, 50]

end 위치의 값은 포함되지 않는다는 점이 중요하다.

step 사용하기

li = [10, 20, 30, 40, 50]

print(li[::1])
print(li[::2])
print(li[::-1])

출력 결과:

[10, 20, 30, 40, 50]
[10, 30, 50]
[50, 40, 30, 20, 10]

[::-1]은 리스트를 역순으로 뒤집을 때 자주 사용한다.

4. 리스트 추가, 변경, 삭제

리스트는 mutable, 즉 변경 가능한 자료형이다. 따라서 요소를 추가하거나 수정하거나 삭제할 수 있다.

요소 변경

li = [10, 20, 30, 40, 50]

li[1] = 200

print(li)

출력 결과:

[10, 200, 30, 40, 50]

슬라이싱으로 여러 요소 변경

li = [10, 20, 30, 40, 50]

li[1:3] = [200, 300]

print(li)

출력 결과:

[10, 200, 300, 40, 50]

인덱싱과 슬라이싱의 차이

인덱싱으로 값을 넣으면 해당 위치에 하나의 값으로 들어간다.

li = [10, 20, 30]
li[1] = ["A", "B"]

print(li)

출력 결과:

[10, ['A', 'B'], 30]

슬라이싱으로 값을 넣으면 리스트의 요소들이 펼쳐져 들어간다.

li = [10, 20, 30]
li[1:2] = ["A", "B"]

print(li)

출력 결과:

[10, 'A', 'B', 30]

요소 삭제

li = [10, 20, 30, 40, 50]

del li[1]

print(li)

출력 결과:

[10, 30, 40, 50]

슬라이싱에 빈 리스트를 대입해서 삭제할 수도 있다.

li = [10, 20, 30, 40, 50]

li[1:3] = []

print(li)

출력 결과:

[10, 40, 50]

5. 리스트 결합과 반복

리스트는 + 연산자로 결합할 수 있다.

li1 = [10, 20, 30]
li2 = [40, 50, 60]

print(li1 + li2)

출력 결과:

[10, 20, 30, 40, 50, 60]

* 연산자로 반복할 수도 있다.

li = [10, 20, 30]

print(li * 3)

출력 결과:

[10, 20, 30, 10, 20, 30, 10, 20, 30]

6. 리스트 주요 함수와 메서드

리스트를 다룰 때 자주 사용하는 함수와 메서드를 정리해보자.

len()

len()은 리스트의 길이를 반환한다.

li = [10, 20, 30]

print(len(li))

출력 결과:

3

append()

append()는 리스트 끝에 요소 하나를 추가한다.

li = [10, 20, 30]

li.append(100)

print(li)

출력 결과:

[10, 20, 30, 100]

리스트를 append()하면 리스트 자체가 하나의 요소로 들어간다.

li = [10, 20, 30]
li.append([200, 300])

print(li)

출력 결과:

[10, 20, 30, [200, 300]]

extend()

extend()는 여러 요소를 리스트 끝에 추가한다.

li = [10, 20, 30]

li.extend([200, 300])

print(li)

출력 결과:

[10, 20, 30, 200, 300]

append()와 extend()의 차이는 중요하다.

li = [10, 20, 30]
li.append([40, 50])
print(li)

li = [10, 20, 30]
li.extend([40, 50])
print(li)

출력 결과:

[10, 20, 30, [40, 50]]
[10, 20, 30, 40, 50]

pop()

pop()은 리스트의 마지막 요소를 삭제하고, 삭제한 값을 반환한다.

li = [10, 20, 30]

value = li.pop()

print(value)
print(li)

출력 결과:

30
[10, 20]

인덱스를 지정하면 해당 위치의 요소를 삭제할 수 있다.

li = [10, 20, 30]

value = li.pop(0)

print(value)
print(li)

출력 결과:

10
[20, 30]

index()

index()는 특정 값의 인덱스를 반환한다.

li = [10, 20, 30]

print(li.index(30))

출력 결과:

2

값이 없으면 에러가 발생한다.

li = [10, 20, 30]

print(li.index(100))
ValueError: 100 is not in list

reverse()

reverse()는 리스트의 순서를 직접 뒤집는다.

li = [100, 50, 70, 60, 20]

li.reverse()

print(li)

출력 결과:

[20, 60, 70, 50, 100]

원본을 바꾸지 않고 역순 리스트가 필요하면 슬라이싱을 사용할 수 있다.

li = [100, 50, 70, 60, 20]

reversed_li = li[::-1]

print(li)
print(reversed_li)

sort()

sort()는 리스트를 직접 정렬한다.

li = [100, 50, 70, 60, 20]

li.sort()

print(li)

출력 결과:

[20, 50, 60, 70, 100]

내림차순으로 정렬하려면 reverse=True를 사용한다.

li = [100, 50, 70, 60, 20]

li.sort(reverse=True)

print(li)

출력 결과:

[100, 70, 60, 50, 20]

sorted()

sorted()는 원본 리스트를 바꾸지 않고, 정렬된 새 리스트를 반환한다.

li = [100, 50, 70, 60, 20]

result = sorted(li)

print(li)
print(result)

출력 결과:

[100, 50, 70, 60, 20]
[20, 50, 60, 70, 100]

count()

count()는 리스트 안에서 특정 값이 몇 번 등장하는지 반환한다.

li = [10, 20, 30, 50, 20, 40, 30, 20]

print(li.count(20))
print(li.count(100))

출력 결과:

3
0

마무리

이번 글에서는 파이썬의 기본 문법 중 입력과 출력, 문자열 포매팅, 연산자, Boolean 평가, 리스트를 정리했다.

핵심은 다음과 같다.

input()은 항상 문자열을 반환한다.
print()는 sep, end 옵션으로 출력 방식을 조절할 수 있다.
f-string은 문자열 포매팅에서 가장 직관적인 방식이다.
연산자는 계산, 비교, 할당, 논리 판단에 사용된다.
부동소수점은 근사값으로 저장되기 때문에 오차가 생길 수 있다.
리스트는 순서가 있고 변경 가능한 컬렉션 자료형이다.

파이썬 기초 문법은 처음에는 많아 보이지만, 직접 코드를 작성해보면 금방 익숙해진다. 특히 input(), print(), 리스트는 이후 조건문, 반복문, 함수에서도 계속 사용되므로 확실히 익혀두는 것이 좋다.

출처 및 참고 자료

본 정리는 강의 내용과 아래 자료를 참고하여 학습 목적으로 작성하였습니다.

https://ryuzyproject.tistory.com/280
https://ryuzyproject.tistory.com/281
https://ryuzyproject.tistory.com/282

profile
기록하며 성장하는 개발자

0개의 댓글