Post

[TeamLog] Python 기초

TeamLog 2024 여름방학 Python 기초 학습자료

TeamLog 2024 여름방학 : Python 기초


Python?

파이썬은 1991년 네덜란드계 소프트웨어 엔지니어인 귀도 반 로섬이 발표한 고급 프로그래밍 언어로, 인터프리터를 사용하는 객체지향 언어이자 플랫폼에 독립적인, 동적 타이핑 대화형 언어이다.

Installation

Python은 Debian 기반 리눅스 OS(Ubuntu)에서 다음과 같은 명령어로 설치할 수 있다.

1
sudo apt install -y python3

설치가 완료된 후, python3 -V 명령어를 실행하여 다음과 같이 버전 정보가 출력된다면 성공적으로 설치가 진행된 것이다.

1
2
$ python3 -V
Python 3.10.12 # 버전은 상이할 수 있음

pip?

pip는 파이썬으로 작성된 패키지 소프트웨어를 설치, 관리하는 패키지 관리 시스템이다.
Python Package Index(PyPI) 에서 많은 파이썬 패키지를 볼 수 있다.
파이썬 2.7.9 이후 버전과 파이썬 3.4 이후 버전은 pip를 기본적으로 포함한다.
즉 현재는 pip는 따로 설치하지 않아도 위와 같은 명령어로 Python 설치에 성공했다면, pip3 -V 를 실행하여 같이 설치된 것을 확인할 수 있다.
혹여나 설치되지 않았다면 다음과 같은 명령어로 설치할 수 있다.

1
sudo apt install python3-pip

pip를 이용하여 다음과 같이 패키지를 설치할 수 있다.

1
pip3 install <package name>

Python 코드 작성과 실행

파이썬은 인터프리터 언어로, 사용자가 작성한 코드를 한 줄 단위로 실행한다.
그러므로 사용자가 코드를 파일에 작성하여 이를 한 번에 실행시킬 수도 있고, 대화형 프롬프트를 이용하여 인터프리터와 실시간으로 코드를 주고받으며 실행할 수도 있다.

  • 파일로 작성된 코드 실행: python3 <file name>
  • 프롬프트 실행: python3

예시로 Hello, Python!을 출력해보자.

1
2
3
$ echo 'print("Hello, Python!")' > hello.py
$ python3 hello.py
Hello, Python!
1
2
3
4
5
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello, Python!")
Hello, Python!

Python 기초 문법


자료형

파이썬에는 다양한 자료형들이 정의되어 있다.
목차에 나와 있듯이 이 중에서 기본적인 몇 가지에 대해서만 설명할 것이다.

숫자 (int, float)

파이썬에서 숫자는 정수와 소수로 구분된다.
각각 intfloat 라는 클래스로 통용된다.
정수는 다양한 진법(2, 8, 10, 16)으로 표기될 수 있다. 하지만 출력할 때에는 모두 10진법으로 출력된다.

1
2
3
4
5
6
7
8
9
10
11
12
>>> type(123)
<class 'int'>
>>> type(1.23)
<class 'float'>
>>> type(0xdead)
<class 'int'>
>>> type(0b1011)
<class 'int'>
>>> type(0o127)
<class 'int'>
>>> 0xdead
57005

문자열 (str)

문자열은 말 그대로 문자들의 집합이다.
str 이라는 클래스로 통용되며, 따옴표(’), 쌍따옴표(”)로 감싸진 문자들은 모두 문자열로 취급한다.
문자 하나도 예외없이 문자열로 처리된다.

1
2
3
4
5
6
>>> type("Hello, Python!")
<class 'str'>
>>> type('Hello, Python!')
<class 'str'>
>>> type('H')
<class 'str'>

바이트 (bytes)

bytes는 1바이트 단위의 값을 연속적으로 저장하는 자료형이다.
bytes 라는 클래스로 통용되며, 문자열과 쓰임새가 비슷하다고 볼 수 있다.
따옴표 혹은 쌍따옴표로 감싸되, 앞에 b를 붙이면 bytes가 된다.

1
2
>>> type(b'This is bytes.')
<class 'bytes'>

리스트 (list)

리스트는 다양한 자료형을 연속적으로 담을 수 있는 자료형이다. list 라는 클래스로 통용된다.
데이터를 연속적으로 저장하다는 점에서 C언어의 배열과 비슷하다고 볼 수 있는데, 차이점이 있다면 C언어의 배열은 하나의 자료형만 담을 수 있는 반면, 파이썬의 리스트는 모든 자료형을 마음대로 담을 수 있다.
데이터들을 대괄호[] 안에 감싸면 리스트로 선언된다.

1
2
3
4
>>> type(["element", "of", "list"])
<class 'list'>
>>> type(["element", 123, 3.14])
<class 'list'>

클래스 (class)

클래스는 파이썬에서 객체를 표현하는 문법이다.
클래스는 깊게 들어가면 메서드, 속성, 상속 등의 복잡한 개념이 많지만, 여기서는 다루지 않는다.
대신에 클래스를 간단히 비유하자면 다음과 같다.

  • 클래스 : 쿠키를 만들기 위한 틀
  • 객체 : 쿠키용 틀로 찍어낸 쿠키

클래스를 선언할 때에는 다음과 같이 선언한다.

1
2
class Cookie:
	...

선언된 클래스를 통하여 객체를 생성할 때에는 다음과 같이 생성한다.

1
mycookie = Cookie()

이번 특강에서는 클래스를 생성하기보다는 이미 생성된 클래스를 통하여 객체를 만드는 일이 많을 것이기 때문에, 참고하기를 바란다.


연산자

사칙연산 (+, -, *, /)

기본적인 숫자들 간의 사칙연산은 C언어와 같다.
다만 파이썬에서의 나누기(/)는 C언어와 달리 나눗셈의 결과를 소숫점까지 출력한다.

1
2
3
4
5
6
7
8
>>> 1 + 2
3
>>> 2.5 - 1.5
1.0
>>> 3 * 4
12
>>> 123 / 4
30.75

다양한 자료형의 사칙연산

C언어에서는 숫자를 표현하는 자료형끼리만 연산이 가능하지만, 파이썬은 이를 좀 더 추상화하여 다양한 자료형과의 연산이 가능하다.
예를 들어, 'A' * 10 은 결과적으로 'AAAAAAAAAA' 를 나타낸다.
문자열끼리 'A' + 'B' = 'AB' 와 같이 표현하는 것 또한 가능하다.
하지만 'AB' - 'B' 의 경우 TypeError가 발생하며 동작하지 않는다.

1
2
3
4
>>> 'AB' - 'B'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

다양한 예제들

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> [0] + [1]
[0, 1]
>>> [0] + 'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>> [0] * 10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> b"A" * 0x10
b'AAAAAAAAAAAAAAAA'
>>> b"A" * 8 + b"B" * 8
b'AAAAAAAABBBBBBBB'
>>>

인덱싱과 슬라이싱

파이썬에서는 인덱싱(indexing)과 슬라이싱(slicing)을 사용하여 연속된 자료형(문자열, 리스트 등)을 편하게 관리할 수 있다.
C언어의 문자열과 배열에서는 인덱싱을 지원하듯이, 파이썬도 크게 다르지 않다.
대괄호[] 안에 원하는 인덱스 값을 넣어 추출할 수 있다. 다음은 인덱싱 예제이다.

1
2
3
4
5
6
>>> a = 'abcd'
>>> a[2]
'c'
>>> b = [1, [1, 2, 3], 'A', b'B']
>>> b[1]
[1, 2, 3]

다음은 C언어에서는 따로 지원하지 않는 슬라이싱 기능이다.
슬라이싱은 영어 단어의 뜻처럼 특정한 데이터를 자르는 기능이다.
인덱싱과 비슷하게 자르는 범위를 지정할 수 있다.
문법은 다음과 같다.

1
data[start:end:step]

위와 같이 작성 시 start부터 end까지만 데이터를 잘라낸다.
stepstep마다의 값만 보존하겠다는 뜻이다.
말로 설명하려니 어려워서 예제를 통해 설명하자면

1
2
3
4
5
6
7
8
9
>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> a[1:]
[2, 3, 4, 5, 6, 7, 8]
>>> a[:5]
[1, 2, 3, 4, 5]
>>> a[2:6]
[3, 4, 5, 6] 
>>> a[1:8:2]
[2, 4, 6, 8]
  • a[1:] : 1번째 인덱스부터 끝까지 잘림
  • a[:5] : 처음부터 5번째 인덱스까지 잘림
  • a[2:6] : 2번째 인덱스부터 6번째 인덱스까지 잘림
  • a[1:8:2] : 1번째 인덱스부터 8번째 인덱스까지 2개씩 잘림

예시를 보며 눈치를 챈 사람들도 있겠지만, end에 들어가는 값은 실제 인덱스 값 + 1이다.
파이썬 개발자의 말로는 이게 더 직관적이라서 이렇게 만들었다는데, 필자는 개인적으로 좀 헷갈려서 오래 쓰며 감을 익힌 편이다.


입력과 출력

print()

파이썬의 print() 는 데이터를 표준 출력(stdout)에 출력하는 가장 간단한 방법이다. C언어의 printf() 함수와 비슷하다고 볼 수 있다.
사용할 때에는 간단히 소괄호() 안에 원하는 데이터를 넣으면 출력된다.

1
2
3
4
5
6
>>> print("abcd")
abcd
>>> print(123)
123
>>> print(['a', 'b', 'c', 'd'])
['a', 'b', 'c', 'd']

C언어의 printf() 함수와 차이점을 두자면 문자열이 아닌 값도 전부 출력할 수 있다는 점이다.

input()

input() 은 사용자의 입력을 표준 입력(stdin)을 통해 읽어들인다.
input() 안에 문자열을 삽입하면 사용자에게 입력해야하는 값을 알려주는 프롬프트를 전달한다.

1
2
3
4
5
6
7
8
>>> a = input()
this is user input.         # 이 줄은 사용자의 입력임
>>> a
'this is user input.'
>>> b = input("type an any strings: ")
type an any strings: Hello, Python!  # 이 줄도
>>> b
'Hello, Python!'

사용할 때에 주의점이 하나 있다면, 사용자의 입력은 언제든 문자열(str)로 받아들여진다는 점이다.
아래와 같이 사용자가 정수, 리스트 등의 형태로 입력하더라도 무조건 문자열의 형태로 받는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> c = input()
123
>>> c
'123'
>>> type(c)
<class 'str'>

>>> d = input()
[1, 2, 3]
>>> d
'[1, 2, 3]'
>>> type(d)
<class 'str'>

만약 '123' 과 같은 문자열의 형태로 된 정수 데이터를 정수형 데이터로 변환하고 싶다면 다음과 같이 형변환하여 사용할 수 있다. (다른 자료형도 마찬가지)

1
2
3
4
5
>>> c_int = int(c)
>>> c_int
123
>>> type(c_int)
<class 'int'>

분기(제어)문

분기(제어)문은 프로그램의 실행 흐름을 제어하는 기능을 가진다. 이하에서는 제어문으로 서술한다.

조건문 (if, else, elif)

파이썬의 조건문은 if, else, elif 와 같이 크게 세 가지로 나눌 수 있다. elif 는 C언어에서의 else if 를 축약한 것이다.
조건문의 사용법은 C언어와 크게 다르지 않다.

1
2
3
4
5
6
if 조건:
	...
elif 조건:
	...
else:
	...

차이점이 있다면 C언어에서는 조건문을 통해 실행될 코드의 범위를 중괄호{}로 지정하는 반면,
파이썬은 시작부분에 콜론(:)을 붙이고, 들여쓰기를 통해 구분한다.

반복문 (for, while, do-while)

반복문의 종류 중 while 문과 do-while 문은 C언어와 거의 유사하다.

1
2
3
4
5
6
while 조건:
	...

do:
	...
while 조건

하지만 for 문은 조금 다르다.
파이썬에서 for 문은 in 이라는 키워드와 함께 사용된다.
사용법은 다음과 같다.

1
2
for 변수 in 반복 가능한 데이터:
	...

여기서 ‘반복 가능한 데이터’라는 말이 잘 와닿지 않을 수 있는데, 예제를 통해 설명해 보겠다.

1
2
3
scores = [90, 100, 60]
for score in scores:
	print(score)
1
2
3
4
$ python3 repeat.py 
90
100
60

코드 실행 시, 리스트 scores 안에 있는 값들을 score 라는 변수에 하나씩 할당하여 반복하는 모습을 볼 수 있다.

또한 for 문을 배울 때 빠질 수 없는 내용이 하나 더 있는데, 바로 range 클래스이다.
range 클래스는 반복 가능한 데이터를 생성해주는 클래스이다.
사용법은 range(start, stop, step) 과 같이 쓰는데, 슬라이싱과 비슷한 형태를 지니는 것을 볼 수 있다.

1
2
3
4
5
6
>>> range(1, 3)
range(1, 3)
>>> list(range(1, 3))
[1, 2]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]

이런 식의 데이터가 생성되는 것을 볼 수 있다.
이를 for문과 같이 활용하여 위의 repeat.py 를 좀 더 수정해 보자면

1
2
3
scores = [90, 100, 60]
for i in range(0, 3):
    print("score" + str(i) + " = " + str(scores[i]))
1
2
3
4
$ python3 repeat.py 
score0 = 90
score1 = 100
score2 = 60

위와 같이 수정할 수 있다.


함수

함수는 특정 작업을 수행하는 코드의 묶음이다.
함수를 사용하면 코드를 재사용하고 프로그램을 더 체계적으로 구성할 수 있다.
함수의 개념은 C언어와 비슷하다.

함수의 선언

함수는 def 키워드를 사용하여 선언한다.
기본 구조는 다음과 같다.

1
2
3
def 함수이름(매개변수1, 매개변수2, ...):
    # 함수 내용
    return 결과

다음은 함수 선언의 예시이다.

1
2
3
4
5
def hello():
    print("Hello, Function!")

def add(a, b):
    return a + b

함수의 호출

함수를 사용하려면 함수 이름과 괄호를 사용하여 호출한다.
호출에 인자가 필요한 경우에는 괄호 안에 인자를 포함하여 호출한다.

1
2
3
4
hello()  # 출력: Hello, Function!

result = add(3, 5)
print(result)  # 출력: 8

함수의 인자

인자는 함수에 전달되는 값이다.
매개변수는 함수 정의에서 사용되고, 인자는 함수 호출 시 사용된다.

1
2
3
4
5
def square(x):
    return x ** 2

result = square(4)
print(result)  # 출력: 16

함수가 여러 개의 인자를 받을 수 있게 하려면 *args를 사용한다.

1
2
3
4
5
def function(*args):
    return sum(args)

print(function(1, 2, 3))  # 출력: 6
print(function(1, 2, 3, 4, 5))  # 출력: 15

lambda 함수는 간단한 일회용 함수를 만들 때 사용한다.

다음은 예시이다.

1
2
3
4
5
6
square = lambda x: x ** 2
print(square(4))  # 출력: 16

nums = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, nums))
print(squares)  # 출력: [1, 4, 9, 16, 25]

패키지 사용

파이썬에서 패키지는 관련된 모듈들을 모아놓은 폴더다.
패키지를 사용하면 다른 프로그래머들이 만든 유용한 코드를 쉽게 활용할 수 있다.

import 문

import 키워드는 패키지나 모듈을 가져올 때 가장 기본적으로 사용하는 방법이다.

1
2
3
4
5
6
7
8
import time
import random

# time 패키지의 sleep 함수 사용
time.sleep(1)

# random 패키지의 randint 함수 사용
rand = random.randint(1, 10)

from 문

from 키워드는 패키지나 모듈에서 특정 함수나 클래스만 가져올 때 사용한다.

1
2
3
4
5
6
7
8
from time import sleep
from random import randint

# sleep 함수 직접 사용
sleep(1)

# randint 함수 직접 사용
rand = randint(1, 10)

as 문

as 키워드는 불러오는 모듈이나 함수의 이름을 변경할 때 사용한다.

1
2
3
4
5
6
7
8
import time as t
from random import randint as ri

# t로 time 모듈의 함수 사용
t.sleep(1)

# ri로 randint 함수 사용
rand = ri(1, 10)

예시 패키지

다음 예시들은 파이썬을 설치할 때 기본적으로 내장되어있는 패키지들의 용례이다.

time 패키지 예시:

1
2
3
4
5
6
7
8
9
10
11
import time

print("프로그램 시작")
time.sleep(2) # 2초 대기
print("2초 후")

start_time = time.time() # 현재 시간 저장
time.sleep(1)
end_time = time.time() # 1초 후 시간 저장
elapsed_time = end_time - start_time
print(f"경과 시간: {elapsed_time:.2f}")

random 패키지 예시:

1
2
3
4
5
6
7
8
9
10
from random import randint, choice

# 1부터 6까지의 무작위 정수 생성 (주사위 굴리기)
dice = randint(1, 6)
print(f"주사위 결과: {dice}")

# 리스트에서 무작위 선택
fruits = ['사과', '바나나', '오렌지', '포도']
fruit = choice(fruits)
print(f"선택된 과일: {fruit}")

from import as 문법을 사용하면 코드를 더 간결하게 작성할 수 있고, 이름 충돌을 피할 수 있다.
하지만 너무 많은 함수를 개별적으로 import 하면 코드의 출처가 불분명해질 수 있으므로 적절히 사용해야 한다.

이러한 패키지 사용법을 익히면 상술한 내부 패키지 뿐만 아니라 정말 다양하고 강력한 외부 패키지 또한 유용하게 사용할 수 있다.



TeamLog 2024 여름방학 특강 파이썬 기초 학습자료.
Special thanks to jwp22 ;)

This post is licensed under CC BY 4.0 by the author.