기본 입출력
자주 사용되는 표준 입력 방법
input()
함수는 한 줄의 문자열을 입력받는 함수
map()
함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
- ex) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용
- list(map(int, input().split()))
- ex) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 다음과 같이 사용
- a, b, c = map(int, input().split())
빠르게 입력 받기
- sys 라이브러리에 정의되어 있는
sys.stdin.readline()
메서드를 이용
- 입력 후 엔터(Enter)가 줄 바꿈 기호로 입력되므로
rstrip()
메서드를 함께 사용
import sys
data = sys.stdin.readline().rstrip()
print(data)
자주 사용되는 표준 출력 방법
- 파이썬에서 기본 출력은
print()
함수를 이용
- 각 변수를 콤마(
,
)를 이용하여 띄어쓰기로 구분하여 출력할 수 있음
- print()는 기본적으로 출력 이후에 줄 바꿈을 수행
- 줄 바꿈을 원치 않는 경우
'end'
속성을 이용할 수 있음
a = 1
b = 2
print(a, b)
print(7, end=" ")
print(8, end=" ")
answer = 7
print(" 정답은 " + str(answer) + "입니다.")
1 2
7 8 정답은 7 입니다.
f-string 예제
- 파이썬 3.6부터 사용 가능
- 문자열 앞에 접두사 'f' 를 붙여 사용
- 중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있음
answer = 7
print(f"정답은 {answer}입니다.")
정답은 7입니다.
자료형
- 파이썬의 자료형으로는 정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전 등이 있다
정수형 (Integer)
a = 1000
print(a)
a = -7
print(a)
a = 0
print(a)
1000
-7
0
실수형 (Real Number)
- **소수점 아래의 데이터를 포함하는 수 자료형
- 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리됨
- 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있다
a = 157.93
print(a)
a = -1837.2
print(a)
a = 5.
print(a)
a = -.7
print(a)
157.93
-1837.2
5.0
-0.7
지수 표현 방식
- e나 E를 이용한 지수 표현 방식을 이용할 수 있다
- e나 E 다음에 오는 수는 10의 지수부를 의미함
- ex) 1e9라고 입력하게 되면, 10의 9제곱(1,000,000,000)이 됨
- 지수 표현 방식은 임의의 큰 수를 표현하기 위해 자주 사용됨
- 최단 경로 알고리즘에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정하곤 함
- 이때 가능한 최댓값이 10억 미만이라면, 무한(INF)의 값으로 1e9를 이용할 수 있음
a = 1e9
print(a)
a = 75.25e1
print(a)
a = 3954e-3
print(a)
1000000000.0
752.5
3.954
실수형 더 알아보기
- IEEE754 표준에서는 실수형을 저장하기 위해 4바이트, 혹은 8바이트의 고정된 크기의 메모리를 할당하므로, 컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가짐
- ex) 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어짐
- 하지만 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없음
- 컴퓨터는 최대한 0.9와 가깝게 표현하지만, 미세한 오차가 발생하게 됨
a = 0.3 + 0.6
print(a)
if a == 0.9 :
print(True)
else :
print(False)
0.89999999999999
False
- 개발 과정에서 실수 값을 제대로 비교하지 못해서 원하는 결과를 얻지 못할 수 있음
- round() 함수를 이용할 수 있으며, 이러한 방법이 권장됨
- ex) 123.456 을 소수 셋째 자리에서 반올림 하려면 round(123.456, 2)라고 작성함
a = 0.3 + 0.6
print(round(a, 4))
if round(a,4) == 0.9 :
print(True)
else :
print(False)
0.9
True
수 자료형의 연산
- 사칙연산과 나머지 연산자가 많이 사용됨
- 단 나누기 연산자(
/
) 를 주의해서 사용해야 함
- 파이썬에서 나누기 연산자 (
/
)는 나눠진 결과를 실수형으로 반환함
- 다양한 로직을 설계할 때 나머지 연산자 (
%
)를 이용해야 할 때가 많음
- 파이썬에서는 몫을 얻기 위해 몫 연산자(
//
)를 사용함
- 이 외에도 거듭 제곱 연산자(**) 를 비롯해 다양한 연산자들이 존재함
a = 7
b = 3
print(a / b)
print(a % b)
print(a // b)
2.3333333333335
1
2
a = 5
b = 3
print(a ** b)
print(a ** 0.5)
125
2.23606797749979
리스트 자료형
- 여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형
- 리스트 대신에 배열 혹은 테이블이라고 부르기도 함
리스트 초기화
- 리스트는 대괄호([])안에 원소를 넣어 초기화하며, 쉼표(
,
)로 원소를 구분
- 비어 있는 리스트를 선언하고자 할 때는
list()
혹은 간단히 [] 를 이용할 수 있음
- 리스트의 원소에 접근할 때는 인덱스(index) 값을 괄호에 넣음
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
print(a[3])
n = 10
a = [0] * n
print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
4
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
리스트의 인덱싱과 슬라이싱 (Indexing and Slicing)
- 인덱스 값을 입력하여 **리스트의 특정한 원소에 접근하는 것을
인덱싱(Indexing)
이라고 함
- 파이썬의 인덱스 값은 양의 정수와 음의 정수를 모두 사용할 수 있음
- 음의 정수를 넣으면 원소를 거구로 탐색하게 됨
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[7])
print(a[-1])
print(a[-3])
a[3] = 7
print(a)
8
9
7
[1, 2, 3, 7, 5, 6, 7, 8, 9]
- 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱(Slicing)을 이용함
- 대괄호 안에 콜론(
:
) 을 넣어서 시작 인덱스 와 끝 인덱스를 설정할 수 있음
- 끝 인덱스는 실제 인덱스보다 1을 더 크게 설정
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[3])
print(a[1 : 4])
4
[2,3,4]
리스트 컴프리헨션
- 리스트를 초기화하는 방법 중 하나
- 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 할 수 있음
array = [i for i in range(10)]
print(array)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
array = [i for i in rage(20) if i % 2 == 1]
print(array)
array = [i * i for i in range(1,10)]
print(array)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[1, 4, 9, 16, 25, 36, 49, 64, 81]
- 2차원 리스트를 초기화할 때 효과적으로 사용 될 수 있음
- 특히 N X M 크기의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용
- 좋은 예시 : aray = [[0] * m for _ in range(n)]
- 만약 2차원 리스트를 초기화할 때 다음과 같이 작성하면 예기치 않은 결과가 나올 수 있음
- 잘못된 예시: array = [[0] m] n
- 위의 코드는 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식됨
n = 4
m = 3
array = [[0] * m for _ in range(n)]
print(array)
[[0, 0 , 0], [0, 0, 0], [0, 0 ,0], [0, 0, 0]]
언더바는 언제 사용할까?
- 파이썬에서는 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(
_
)를 자주 사용한다
summary = 0
for i in range(1, 10) :
summary += i
print(summary)
for _ in range(5) :
print("Hello World")
리스트 관련 기타 메서드
append()
- 변수명.append()
- 리스트에 원소를 하나 삽입할 때 사용함
sort()
- 변수명.sort()
- 변수명.sort(reverse=True)
reverse()
- 변수명.reverse()
- 리스트의 원소의 순서를 모두 뒤집어 놓음
insert()
- insert(삽입할 위치 인덱스, 삽입할 값)
- 특정한 인덱스 위치에 원소를 삽입할 때 사용함
count()
- 변수명.count(특정 값)
- 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용함
remove()
- 변수명.remove(특정 값)
- 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거함
리스트에서 특정 값을 가지는 원소를 모두 제거하기
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
result = [i for i in a if i not in remove_set]
print(result)
[1, 2, 4]
문자열 자료형
- 문자열 변수를 초기화할 때는 큰따움표(
"
)나 작은 따옴표('
)를 이용함
- 문자열 안에 큰따옴표나 작음따옴표가 포함되어야 하는 경우가 있음
- 전체 문자열을 큰따옴표로 구성하는 경우, 내부적으로 작은따옴표를 포함할 수 있음
- 전체 문자열을 작은따옴표로 구성하는 경우, 내부적으로 큰따옴표를 포함할 수 있음
- 혹은 백슬래시(
\
)를 사용하면, 큰따옴표나 작은따옴표를 원하는 만큼 포함시킬 수 있음
data = 'Hello World'
print(data)
data = "Don't you know \"Python\"?"
print(data)
Hello World
Don't you know "Python"?
문자열 연산
- 문자열 변수에 덧셈(
+
)을 이용하면 문자열이 더해져서 연결(Concatenate)된다
- 문자열 변수를 특정한 양의 정수와 곱하는 경우, 문자열이 그 값만큼 여러 번 더해진다
- 문자열에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있다
- 다만 문자열은 특정 인덱스의 값을 변경할 수는 없다 (Immutable)
a = "Hello"
b = "World"
print(a + " " + b)
a = "String"
print(a * 3)
a = "ABCDEF"
print(a[2 : 4])
Hello World
StringStringString
CD
튜플 자료형
- 튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있다
- 튜플은 한 번 선언된 값을 변경할 수 없다
- 리스트는 대괄호(
[]
)를 이용하지만, 튜플은 소괄호(()
)를 이용한다
- 튜플은 리스트에 비해 상대적으로 공간 효율적이다
a = (1, 2, 3, 4, 5, 6, 7, 8, 9)
print(a[3])
print(a[1 : 4])
4
(2, 3, 4)
a = (1, 2, 3, 4)
print(a)
a[2] = 7
Traceback (most recent call last):
File "main.py", line 4, in <module>
a[2] = 7
TypeError: 'tuple' object does not support item assignment
튜플을 사용하면 좋은 경우
- 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
- 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함
- 데이터의 나열을 해싱(Hashing)의 키 값으로 사용해야 할 때
- 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다
- 리스트보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
- 사전 자료형은 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형
- 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비됨
- 사전 자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 '변경 불가능한(Immutable) 자료형'을 키로 사용 할 수 있음
- 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있음
키(Key) | 값(Value) |
---|
사과 | Apple |
바나나 | Banana |
코코넛 | Coconut |
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
print(data)
if '사과' in data :
print("'사과'를 키로 가지는 데이터가 존재합니다.")
{'사과': 'Apple', '바나나': 'Banana', '코코넛': 'Coconut'}
'사과'를 키로 가지는 데이터가 존재합니다.
사전 자료형 관련 메서드
- 사전 자료형에서는 키와 값을 별도로 뽑아내기 위한 메서드를 지원함
- 키 데이터만 뽑아서 리스트로 이용할 때는
keys()
함수를 이용
- 값 데이터만 뽑아서 리스트로 이용할 때는
values()
함수를 이용
사전 자료형 관련 함수
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
key_list = data.keys()
value_list = data.values()
print(key_list)
print(value_list)
for key in key_list:
print(data[key])
dict_keys(['사과', '바나나', '코코넛'])
dict_values(['Apple', 'Banana', 'Coconut'])
Apple
Banana
Coconut
집합 자료형
- 집합은 다음과 같은 특징이 있음
- 리스트 혹은 문자열을 이요해서 초기화 할 수 있음
- 혹은 중괄호(
{}
) 안에 각 원소를 콤마(,
)를 기준으로 구분하여 삽입함으로써 초기화 할 수 있음
- 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있음
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)
data = {1, 1, 2, 3, 4, 4, 5}
print(data)
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
집합 자료형의 연산
- 기본적인 집합 연산으로는 합집합, 교집합, 차집합 연산 등이 있음
- 합집합 : 집합 A에 속하거나 B에 속하는 원소로 이루어진 집합 (
A∪B
)
- 교집합 : 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합 (
A∩B
)
- 차집합 : 집합 A의 원소 중에서 B에 속하지 않는 원소들로 이루어진 집합 (
A - B
)
a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])
print(a | b)
print(a & b)
print(a - b)
{1, 2, 3, 4, 5, 6, 7}
{3, 4, 5}
{1, 2}
집합 자료형 관련 함수
data = set([1, 2, 3])
print(data)
data.add(4)
print(data)
data.update([5, 6])
print(data)
data.remove(3)
print(data)
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6}
{1, 2, 4, 5, 6}
사전 자료형과 집합 자료형의 특징
- 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있음
- 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음
- 사전의 키(key) 혹은 집합의 원소 (Element)를 이용해 O(1)의 시간 복잡도로 조회함
조건문
예제
x = 15
if x >= 10:
print("x >= 10")
if x >= 0:
print("x >= 0")
if x >= 30:
print("x >= 30")
x >= 10
x >= 0
들여쓰기
- 코드의 블록(Block)을 들여쓰기(Indent)로 지정
- 탭을 사용하는 쪽과 공백 문자(space)를 여러 번 사용하는 쪽으로 두 진영이 있음
- 파이썬 스타일 가이드라인에서는 4개의 공백 문자를 사용하는 것을 표준으로 설정하고 있음
조건문의 기본 형태
- 기본적인 형태는 if ~ elif ~ else
- 조건문을 사용할 때 elif 혹은 else 부분은 경우에 따라서 사용하지 않아도 됨
if 조건문 1:
조건문 1이 True 일 때 실행되는 코드
elif 조건문 2:
조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행되는 코드
else:
위의 모든 조건문이 모두 True 값이 아닐 때 실행되는 코드
비교 연산자
- 특정한 두 값을 비교할 때 이용할 수 있음
- 대입 연산자 (
=
)와 같음 연산자 (==
)의 차이점에 유의할 것
비교 연산자 | 설명 |
---|
X == Y | X와 Y가 서로 같을 때 참(True)이다 |
X != Y | X와 Y가 서로 다를 때 참(True)이다 |
X > Y | X가 Y보다 클 때 참(True)이다 |
X < Y | X가 Y보다 작을 때 참(True)이다 |
X >= Y | X가 Y보다 크거나 같을 때 참(True)이다 |
X <= Y | X가 Y보다 작거나 같을 때 참(True)이다 |
논리 연산자
- 논리 값 (True/False) 사이의 연산을 수행할 때 사용
논리 연산자 | 설명 |
---|
X and Y | X와 Y가 모두 참(True)일 때 참(True)이다 |
X or Y | X와 Y중에 하나만 참(True)이어도 참(True)이다 |
not X | X가 거짓(False)일 때 참(True)이다 |
파이썬의 기타 연산자
- 다수의 데이터를 담는 자료형을 위해 in 연산자와 not in 연산자가 제공됨
- 리스트, 튜플, 문자열, 딕셔너리 모두에서 사용이 가능
in 연산자와 not in 연산자 | 설명 |
---|
x in 리스트 | 리스트 안에 x가 들어가 있을 때 참(True)이다 |
x not in 문자열 | 문자열 안에 x가 들어가 있지 않을 때 참(True)이다 |
pass 키워드
- 아무것도 처리하고 싶지 않을 때 pass 키워드를 사용
- ex) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분을 비워놓고 싶은 경우
score = 85
if score >= 80 :
pass
else :
print('성적이 80점 미만입니다.')
print('프로그램을 종료합니다.')
프로그램을 종료합니다.
조건문의 간소화
- 조건문에서 실행될 소스코드가 한 줄인 경우, 굳이 줄바꿈을 하지 않고도 간략하게 표현할 수 있음
score = 85
if score >= 80: result = "Success"
else: result = "Fail"
Success
- 조건부 표현식(Conditional Expression)은 if ~ else문을 한 줄에 작성할 수 있도록 해줌
score = 85
result = "Success" if scroe >= 80 else "Fail"
print(result)
Success
조건문 내에서의 부등식
> 0 and x < 20
과 0 < x < 20
은 같은 결과를 반환함
x = 15
if x > 0 and x < 20:
print("x는 0 이상 20 미만의 수입니다.")
x = 15
if 0 < x < 20:
print("x는 0이상 20 미만의 수입니다.")
반복문
- 특정한 소스코드를 반복적으로 실행하고자 할 때 사용하는 문법
- while문과 for문이 있는데, 어떤 것을 사용해도 상관 없음
1부터 9까지 모든 정수의 합 구하기 예제 (while문)
i = 1
result = 0
while i <= 9:
result += i
i += 1
print(result)
45
1부터 9까지 홀수의 합 구하기 예제 (while문)
i = 1
result = 0
while i <= 9:
if i % 2 == 1:
result += i
i += 1
print(result)
25
반복문에서의 무한 루프
- 무한 루프(Infinite Loop)란 끊임없이 반복되는 반복 구문을 의미
x = 10
while x > 5:
print(x)
10
10
10
10
10
10
...
(중략)
for문
- 특정한 변수를 이용하여 'in' 뒤에 오는 데이터(리스트, 튜플 등)에 포함되어 있는 원소를 첫 번째 인덱스부터 차례대로 하나씩 방문
for 변수 in 리스트:
실행할 소스코드
array = [9, 8, 7, 6, 5]
for x in array:
print(x)
9
8
7
6
5
- for문에서 연속적인 값을 차례대로 순회할 때는
range()
를 주로 사용
- 이때 range(시작 값, 끝 값 + 1) 형태로 사용
- 인자를 하나만 넣음녀 자동으로 시작 값은 0이 됨
result = 0
for i in range(1, 10):
result += i
print(result)
45
1부터 30까지 모든 정수의 합 구하기 예제 (for문)
result = 0
for i in range(1, 31):
result += i
print(result)
465
Continue
- 반복문에서 남은 코드의 실행을 건너뛰고, 다음 반복을 진행하고자 할 때 continue를 사용
result = 0
for i in range(1, 10):
if i % 2 = 0:
continue
result += i
print(result)
25
break
- 반복문을 즉시 탈출하고자 할 때 break를 사용
i = 1
while True:
print("현재 i의 값:", i)
if i == 5:
break
i += 1
현재 i의 값: 1
현재 i의 값: 2
현재 i의 값: 3
현재 i의 값: 4
현재 i의 값: 5
함수
함수 정의하기
- 함수를 사용하면 소스코드의 길이를 줄일 수 있음
- 매개변수 : 함수 내부에서 사용할 변수
- 반환 값 : 함수에서 처리된 결과를 반환
def 함수명(매개변수):
실행할 소스코드
return 반환 값
람다 표현식
- 람다 표현식을 이용하면 함수를 간단하게 작성할 수 있음
- 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징
def add(a, b):
return a + b
print(add(3, 7))
print((lambda a, b: a + b)(3, 7))
10
10
https://www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC