Introduction to Python I (Python Basics I)
Introduction to Python I (Python Basics)¶
by JunPyo Park
Part of the Alpha Square Lecture Series:
파이썬 기초와 자료구조, 문자열, 조건문, 반복문 그리고 함수에 대해서 간단하게 정리해 보았습니다. 주피터 노트북 환경에서 작성한 문서이기 때문에 주피터 노트북을 켜고 따라서 실습해 보시면 쉽게 이해하실수 있습니다.
주석 코드(code comments)¶
주석 코드는 프로그래머가 프로그램의 소스코드 상에 남기는 메모 입니다. 주석의 목적은 소스 코드를 명확히 하는것과 더불어 다른사람들이 코드를 쉽게 따라갈 수 있도록 안내해주는 역할을 합니다. 코드가 실행될 때 주석처리된 모든 내용은 무시됩니다. 파이썬에서 주석은 # 을 통해 작성할 수 있습니다(# 주석 내용
). #
이 포함된 줄은 어떤 내용을 입력해도 주석처리 됩니다.
# 주석 처리 연습
# 이 줄들은 프로그램상에 전혀 영향을 주지 않습니다.
# # 이후의 어떤 내용이 와도 코드로 실행되지 않습니다.
큰 따옴표 세개를 사용한 주석(""" 이곳에 입렵된 텍스트 """
)을 보신 분들도 있을겁니다. 여러 줄의 주석처리를 할 때 사용되기도 하지만 정확하게 말하자면 이는 docstring
이라 불리는 문자열 타입(string
)의 특수한 형태입니다. docstring
은 함수의 목적과 기능을 설명하는데 주로 사용됩니다.
"""docstring : special string"""
주석 처리가 되어있는 부분이 있다면 항상 잘 살펴보는 습관을 가지는 것이 중요합니다.
변수(Variables)¶
변수는 값에 이름을 붙여 사용할 수 있도록 해줍니다. 어떤 값을 저장해놓고 나중에 반복적으로 사용하게 될 경우, 그 값에 이름을 붙여 변수에 저장 할 수 있습니다. 프로그래밍에서의 변수 사용은 기본적으로 수학에서의 사용과 유사하다고 생각하시면 됩니다. 하지만 파이썬은 추가적으로 변수마다 다른 데이터 타입을 제공합니다.
오늘 살펴볼 가장 기본적인 변수 타입들은 integers(정수형)
, floating point numbers(소수점)
, booleans(참/거짓)
, 그리고 strings(문자열)
이 있습니다.
integers(정수형)
은 수학에서의 정수와 같습니다. 파이썬 내장 함수인 print
함수를 통해 변수의 값과 타입을 출력해 볼 수 있습니다.
my_integer = 50
print(my_integer, type(my_integer))
타입에 관계없이 변수는 등호 기호(=
)를 통해 값을 할당할 수 있습니다. 변수 이름은 대/소문자를 구분하기에 대/소문자를 변경할 경우 완전히 다른 변수가 됩니다.
one = 1
print(One)
첫 글씨가 대문자인 One 이라는 변수는 값이 할당되지 않았기 때문에 오류가 발생합니다.
float
이라 불려지는 변수 타입은 수학에서 실수(real number)를 나타낸다고 생각하시면 됩니다. float
변수를 선언 하기 위해서는 소수점(.
)을 찍어주시거나 할당하려는 값이 float 임을 나타내 주어야 합니다.
my_float = 1.0
print(my_float, type(my_float))
my_float = float(1)
print(my_float, type(my_float))
int
형태의 변수들은 소숫점을 잘라내 버리는 반면 float
형태는 특별한 지시가 없다면 소숫점을 반올림하거나 잘라내지 않습니다. 따라서 수치 계산에 있어서는 float
형태의 변수가 더 적합하다고 할 수 있습니다.
참고) 이전에 데이터 값이 float
형태임을 나타내기 위해 float()
이라는 함수를 사용하였습니다. 이와 마찬가지로 int()
함수를 사용하여 데이터 값을 강제로 int
형태로 처리하도록 할 수 있습니다. 이때, 소숫점은 무조건 버려집니다.
my_int = int(3.14159)
print(my_int, type(my_int))
이를 응용하여 다음과 같이 반올림 함수를 만들 수 있습니다.
x = 3.49
int(x + 0.5)
x = 3.5
int(x + 0.5)
Strings(문자열)
타입은 텍스트값을 저장할 수 있습니다. 작은 따옴표('')나 큰 따옴표("")를 사용하여 문자열 변수를 할당할 수 있습니다.
my_string = 'This is a string with single quotes'
print(my_string)
my_string = "This is a string with double quotes"
print(my_string)
작은 따옴표와 큰 따옴표 모두 사용 할 수 있기에 다음과 같이 작은 따옴표나 큰 따옴표 자체를 문자열에 저장할 수 있습니다.
my_string = '"Jabberwocky", by Lewis Carroll'
print(my_string)
my_string = "'Twas brillig, and the slithy toves / Did gyre and gimble in the wabe;"
print(my_string)
Booleans
, 또는 bools
타입은 이진 변수입니다. bool
타입은 True(참)
과 False(거짓)
중 하나의 값만 가질 수 있습니다. 그렇기 때문에 이진 변수라고 불리는것 입니다. 이런 bool
타입은 프로그래밍에서 Logical Operators 라는 이름으로 활용되는데 자세한 내용은 추후 다루도록 하겠습니다.
my_bool = True
print(my_bool, type(my_bool))
파이썬에는 위에서 살펴본 데이터 타입 이외에도 많은 타입들이 있지만 이것들이 가장 기본적인 데이터 타입이기에 살펴보았습니다. 이번 튜토리얼을 진행하면서 추가적으로 몇가지의 타입들을 더 살펴보도록 하겠습니다.
기초 수학연산(Basic Math)¶
파이썬은 기본적으로 내장된 수학 함수들을 제공합니다. math 패키지를 불러와서 추가적인 수학 함수들을 사용할 수도 있습니다.
+
, -
, /
, 그리고 *
와 같은 기본 4칙연산이 지원되며 지수 계산은 **
, 나머지(modular)연산은 %
기호로 계산이 가능합니다.
print('Addition: ', 2 + 2)
print('Subtraction: ', 7 - 4)
print('Multiplication: ', 2 * 5)
print('Division: ', 10 / 2)
print('Exponentiation: ', 3**2)
# 15를 4로 나눈 나머지
print('Modulo:', 15 % 4)
이런 연산은 물론 변수에게도 적용이 가능합니다.
first_integer = 4
second_integer = 5
print(first_integer * second_integer)
first_integer = 11
second_integer = 3
print(first_integer / second_integer)
이외에 파이썬에서 자주 쓰이는 수학 함수들은 다음과 같습니다.
abs()
round()
max()
min()
sum()
함수이름에서 유추할 수 있듯 각각의 기능을 수행합니다. abs()
는 absolute value 함수로써 절댓값을 반환합니다. round()
는 반올림 함수로 지정된 소수점 자릿수에 맞게 반올림된 값을 반환합니다. Default 값은 $0$ 입니다. max()
와 min()
함수는 숫자열(collection of numbers)에 대해 각각 최댓값과 최솟값을 반환합니다. sum()
함수는 숫자열에 대한 합을 반환합니다. 숫자열을 파이썬에서 어떻게 표현하는지는 곧 살펴보도록 하겠습니다.
이외 추가적인 수학 함수는 math
패키지를 통해 불러올수 있습니다.
import math
math 라이브러리에는 다양한 수학함수들이 구축되어 있습니다. 자세한 내용은 documentation을 통해 확인 가능합니다.
print('Pi: ',math.pi)
print("Euler's Constant: ", math.e)
print('Cosine of pi: ', math.cos(math.pi))
my_list = [1, 2, 3]
print(my_list)
대괄호 안에 인덱스를 입력하여 리스트 안의 내용(element)에 접근할 수 있습니다.
print(my_list[0])
print(my_list[2])
파이썬에서 인덱싱은 숫자 0부터 시작합니다. 길이가 $n$인 리스트가 있다면 처음 내용물은 인덱스 번호 $0$번에 저장되고 다음 내용물은 인덱스 번호 $1$번에 저장됩니다. 따라서 마지막 내용물은 $n-1$번 인덱스 상에 저장되게 됩니다. 존재 하지 않는 인덱스에 접근할 경우 에러 메시지가 출력되게 됩니다.
print('The first, second, and third list elements: ',
my_list[0], my_list[1], my_list[2])
print('Accessing outside the list bounds causes an error: ',
my_list[3])
리스트에 몇개의 내용물이 있는지는 len()
함수를 통해 확인할 수 있습니다.
print(len(my_list))
리스트에 내용물을 변경하고 싶다면 다음과 같이 해당 인덱스 값을 바꾸어 주면 됩니다.
print(my_list)
my_list[0] = 42
print(my_list)
이는 string(문자열)
타입이 처리되는 방식과 완전히 다른 방식입니다. 리스트
구조는 위와 같이 내용물의 변경이 자유롭게 가능하지만 string
타입과 같은 몇몇 데이터 타입의 경우 내용물의 변경이 불가능합니다. 이와 같은 변경불가능(immutable) 데이터 타입은 일단 만들어지면 새로운 객체를 만들지 않는 이상 변경이 불가능 합니다.
my_string = "Strings never change"
my_string[0]
my_string[0] = 'Z'
위에서 설명하였듯 리스트는 어떤 데이터 타입도 담을 수 있습니다. 다음과 같이 리스트 안에 문자열을 저장 할 수 있습니다.
my_list_2 = ['one', 'two', 'three']
print(my_list_2)
또한 리스트는 다음과 같이 여러가지 서로 다른 타입들을 한번에 담을 수 있습니다.
my_list_3 = [True, 'False', 42]
두 가지 리스트를 붙여서 하나로 만들고 싶다면 다음과 같이 +
기호를 통해 하나의 리스트로 붙일 수 있습니다.
my_list_4 = my_list + my_list_2 + my_list_3
print(my_list_4)
Slicing¶
리스트에서 하나의 데이터가 아닌 특정 그룹의 데이터에 접근하고자 할 때 슬라이싱(slicing) 기법을 활용 할 수 있습니다. 콜론(:
) 기호를 통해 리스트를 슬라이싱 할 수 있습니다.
my_list = ['friends', 'romans', 'countrymen', 'lend', 'me', 'your', 'ears']
print(my_list[2:4])
위와 같이 :
을 사용하여 리스트 상에서 특정 인덱스 그룹에 대한 선택을 할 수 있습니다. 인덱스 2번 위치에 있는 데이터 부터 4번 보다 작은 위치에 있는 데이터(2이상 4미만)에 접근한 모습입니다.
다음과 같이 콜론 뒤에 숫자를 비운다면 특정 지점 이후 모든 데이터에 접근할 수 있습니다.
print(my_list[1:])
이와 비슷하게 콜론 앞에 숫자를 비운다면 특정 지점 이전 까지의 데이터에 접근할 수 있습니다.
print(my_list[:4])
음수 인덱스를 입력할 경우 마지막 인덱스부터 카운팅 하여 해당 데이터에 접근 할 수 있습니다. 예를 들어 다음과 같이 -1
인덱스에 접근한다면 해당 리스트의 마지막 데이터 값이 출력됩니다.
print(my_list[-1])
0:7:2
와 같이 세번째 숫자를 입력하여 슬라이싱을 할 수 있습니다. 세번째 숫자의 의미는 건너뛸 간격의 사이즈(step size) 입니다.
print(my_list[0:7:2])
위의 코드를 자세히 살펴보면 먼저 0:7
은 전체 리스트를 선택했음을 의미합니다(인덱스 0에서 6까지를 의미하기 때문입니다). 그리고 마지막에 step size '2'를 입력하였습니다. 그 결과 0
번, 2
번, 4
번, 6
번 에 해당하는 데이터 값들이 출력됩니다.
위와 같이 전체 리스트에 대해 step size를 적용할 경우 아래 코드와 같이 시작과 끝 번호에 해당하는 값을 생략해도 무관합니다.
print(my_list[::2])
모든 숫자를 생략하고 :
만 입력할 경우 자동적으로 전체 리스트를 선택하게 됩니다.
print(my_list[:])
다음과 같이 step size 위치에 음수인 -1을 넣으면 간단하게 역순으로 배열된 리스트를 얻을 수 있습니다.
print(my_list[::-1])
numpy
와 같은 패키지에는 행렬을 표현하는 자료구조가 따로 있지만 파이썬 자체에는 행렬을 구현하는 자료구조가 따로 없습니다. 따라서 파이썬 자체에서 행렬을 구현하기 위해서는 리스트 안의 리스트 구조를 사용합니다.
파이썬의 range()
라는 내장함수를 통해 리스트를 생성할 수 있습니다. range()
함수는 몇가지 형태의 입력을 받을 수 있으며 list()
명령어와 같이 사용하여 입력 값에 대한 리스트를 얻을 수 있습니다.
(파이썬 2의 경우 range()
를 단독으로 사용하면 리스트를 얻을 수 있지만 파이썬 3 에서는 list(range())
와 같이 사용하여야 원하는 리스트를 얻을 수 있습니다.)
b = 10
my_list = list(range(b))
print(my_list)
리스트 슬라이싱 기법들을 동일하게 적용할 수 있습니다.
a = 3
b = 10
my_list = list(range(a, b))
print(my_list)
a = 3
b = 10
step = 2
my_list = list(range(a, b, step))
print(my_list)
튜플(Tuples)¶
튜플(Tuples)
자료구조는 리스트와 비슷한 데이터 타입으로 서로 다른 종류의 데이터 타입들을 내용물로 가질 수 있습니다. 핵심이 되는 차이점은 튜플
은 변경불가능(immutable)하다는 것 입니다. 내용물들 사이에 쉼표(,
)를 입력하여 튜플을 선언 할 수 있습니다. 일반적으로 튜플을 선언할 때 괄호(()
)를 사용하여 묶어주는 것이 코드 가독성에 좋습니다.
my_tuple = 'I', 'have', 30, 'cats'
print(my_tuple)
my_tuple = ('I', 'have', 30, 'cats')
print(my_tuple)
위에서 언급하였듯 튜플은 변경불가능합니다. 어떤 부분도 접근을 하여 수정이 불가능합니다.
# 'cats' 값을 'dogs' 로 바꾸려 한다면 에러가 발생합니다.
my_tuple[3] = 'dogs'
리스트 슬라이싱 기법을 그대로 사용할 수 있습니다.
print(my_tuple[1:3])
리스트와 마찬가지로 +
기호를 통해 합칠 수 있습니다.
my_other_tuple = ('make', 'that', 50)
print(my_tuple + my_other_tuple)
다음과 같이 튜플에 있는 값들을 풀어서(unpacking) 각 변수에 할당 할 수 있습니다.
str_1, str_2, int_1 = my_other_tuple
print(str_1, str_2, int_1)
이렇게 값들을 풀어줄 때는 튜플에 있는 값들이 순서대로 왼쪽에 입력한 변수들에 할당되어 집니다.
집합(Sets)¶
집합(Sets)
자료구조는 순서가 없고(unordered) 중복된 값을 제거하는 자료구조 입니다. 학창시절 수학책 맨 앞에 나와 열심히 공부했던 집합의 개념과 거의 유사하다고 생각하시면 됩니다. Set
은 중괄호 ({}
)를 사용하여 정의할 수 있습니다.
things_i_like = {'dogs', 7, 'the number 4', 4, 4, 4, 42, 'lizards',
'man I just LOVE the number 4'}
print(things_i_like, type(things_i_like))
출력 결과를 살펴봤을 때 중복되어 포함된 4는 중복이 제거되어 한번만 출력된 것을 확인할 수 있습니다.
다음과 같이 set()
함수를 통해 리스트로 부터 set
자료구조 형태를 만들어 낼 수 있습니다.
animal_list = ['cats', 'dogs', 'dogs', 'dogs', 'lizards', 'sponges',
'cows', 'bats', 'sponges']
animal_set = set(animal_list)
print(animal_set) # 리스트에서 중복된 값을 제거 할 수 있습니다.
len()
함수를 활용하여 몇 종류의 동물이 있는지 다음과 같이 볼 수 있습니다.
print(len(animal_set))
Set
타입은 순서가 없기 때문에 set[0]
와 같이 특정 인덱스 값을 통해 데이터에 접근할 수 없습니다. 하지만 다음과 같이 어떤 원소가 들어있는지 체크는 가능합니다.
# 'in' 키워드를 사용하여 'cats' 가 animal_set 에 들어있는지 확인가능합니다.
'cats' in animal_set
String 'cats' 가 animal_set에 들어가 있기 때문에 True 값이 반환됩니다.
학창시절 배운 교집합과 합집합연산을 &
와 |
연산자를 통해 구현할 수 있습니다.
# 교집합 연산을 수행하여 출력합니다.
print(animal_set & things_i_like)
# 합집합 연산을 수행하여 출력합니다.
print(animal_set | things_i_like)
이 외에도 set
과 관련된 다양한 파이썬 내장함수들을 살펴보시려면 공식 Documentation 을 확인해 주세요.
딕셔너리(Dictionaries)¶
딕셔너리는 또 하나의 가장 중요한 자료구조 형태로 중괄호({}
)와 콜론(:
)을 사용하여 정의할 수 있습니다.
중괄호는 딕셔너리의 처음과 끝 부분을 나타내고 콜론 기호는 키(key) 와 값(value)의 쌍을 나타냅니다. 딕셔너리는 본질적으로 key-value의 쌍으로 이루어진 집합(set) 자료구조 입니다. 딕셔너리의 키(key)는 변경불가능한 자료형 이어야 합니다. 따라서 문자열(string)과 튜플(tuple)은 키(key)로 쓰일 수 있습니다. Key 값들은 추가되거나 삭제가 가능합니다.
아래의 예제는 딕셔너리를 생성하는 예제입니다. 여기서 Key는 책의 장르를 나타내는 string
타입의 데이터이고 value는 list
타입으로 해당 Key에 속하는 책들을 담고있습니다.
my_dict = {"High Fantasy": ["Wheel of Time", "Lord of the Rings"],
"Sci-fi": ["Book of the New Sun", "Neuromancer", "Snow Crash"],
"Weird Fiction": ["At the Mountains of Madness", "The House on the Borderland"]}
다음과 같이 접근을 원하는 Key를 입력하여 해당하는 Value를 확인할 수 있습니다.
print(my_dict["Sci-fi"])
어떤 Key값에 연결된 Value를 자유롭게 수정할 수 있습니다.
my_dict["Sci-fi"] = "I can't read"
print(my_dict["Sci-fi"])
새로운 key-value 쌍을 추가 하고자 한다면 다음과 같이 선언해 주면 됩니다.
my_dict["Historical Fiction"] = ["Pillars of the Earth"]
print(my_dict["Historical Fiction"])
print(my_dict)