2021년 8월 29일 일요일

파이썬의 기본 문법

컴퓨터 공부는 '백물이 불여일타'. 어려운 말들 늘어놓고 이말 저말 암기하려고 하면 공부하기가 힘듭니다. 컴퓨터 공부는 일단 두드려 보고, 만들어 보는 것이 가장 빠르게 학습을 하는 길이라고 생각합니다. 파이썬 공부를 처음 시작하시는 분들을 위해서 만든 포스팅입니다. 파이썬 언어의 특징, 자료 구조 등등 이론적 토대는 별도로 공부를 하시길 바랍니다.

온라인 컴파일러


파이썬 문법 공부는 아래의 사이트를 통해서 진행하시면 됩니다. 실제로는 파이썬을 설치해서 사용해야 하지만 그것은 나중에 꼭 필요할 때 하시는 것으로 하고, 일단 문법 공부를 간단하게 하는 정도는 온라인 컴파일러를 사용하시는 것을 추천합니다. 

맥북이나 맥에는 파이썬이 기본적으로 깔려 있습니다. 터미널 사용법을 아시는 분은 터미널에서 파이썬을 구동해서 공부해도 됩니다.

일단 파이썬 설치를 못 하는 분들을 위해서 3개의 사이트를 추천해 드리겠습니다. 취향에 맞는 곳에서 공부하시면 됩니다.


기초문법


이제부터는 글을 평어체로 쓰겠습니다.

변수와 자료형


파이썬은 변수 선언을 할 때 데이터 타입을 명시하지 않는다. 또한, 자바스크립트의 변수 선언부처럼 'var'와 같은 것도 사용할 필요가 없다.
a = 10
위와 같이 사용하면 그만이다. 변수 a는 int값 10을 갖게 되었다.
a = 10
print(a)
print(type(a))
변수 a에 담긴 값과 데이터 타입을 확인해 보면 그 결과는 다음과 같다.




변수 a에는 숫자 10이라는 값이 담겨 있으며 데이터 타입은 int형임을 알 수 있다. 어디서나 이렇게 유연하게 변수 선언을 하면 된다.
count = 20
math, english = (90, 100)
name = "Jongsik"
option = True
memo = "Good morning"
score = 90.5
companies = ["LG", "Samsung", "Hyundai"]

print(count, math, name, option, memo, score, companies)
print(type(count), type(math), type(name), type(option), type(memo), type(score), type(companies))
자료형을 몇가지 더 사용해보았다. 위에서 아래로 count, math, name 등의 변수를 선언하였다. 순서대로 정수형, 정수형(튜플 이용), 문자열, 불리언, 문자열, 실수형, 리스트 형태의 자료가 사용되었다.

변수가 가진 값들을 그대로 print한 것과 각 변수의 자료형태를 print한 결과는 다음과 같다.


이처럼 파이썬은 자료형을 별도로 설정하지 않아도 들어가는 값에 따라 자동으로 자료형태가 설정된다.

주석

"""
파이썬입니다!
기본적인 변수 사용법에 대한 연습장
여러줄 주석은 이렇게 사용합니다
"""

# 리스트 타입 (한줄 주석)
companies = ["LG", "Samsung", "Hyundai", "Google", "Amazon"]

print(companies)
print(companies[0])
print(companies[2])
print(companies[3][0])
print(companies[3] + companies[4])
이번에는 주석문을 사용하였다. 한줄 주석은 #을 사용하면 된다. 주석문을 여러줄로 사용하고 싶은 경우에는 홑따옴표나 쌍따옴표를 3개 연속으로 사용하고 이것으로 감싸주면 된다. 보통 IDE를 사용할 경우에는 윈도우는 Ctrl + / 맥은 Option + / 키를 사용하면 편리하다.

리스트와 딕셔너리


리스트 타입을 다룰일이 많을테니 리스트 타입을 다루는 아주 기본적인 방법 몇가지만 짚고 넘어가보자. 위의 코드를 실행하면 5개의 print문이 아래와 같이 출력된다.





companies라는 변수는 5개의 회사 이름이 각각의 원소로 존재하는 리스트를 갖고 있다. 이것을 그냥 print문으로 출력하면 목록과 목록이 가진 원소값들 그러니까 회사 이름이 그대로 출력된다.

다른 언어들이 배열을 다룰 때 처럼 대괄호를 사용하면 특정한 원소값만 출력할 수 있다. 가장 앞에 있는 원소값 즉, companies[0]을 출력하면 목록에서 가장 앞에 있는 'LG'가 출력된다. 당연히 companies[2]를 출력하면 3번째에 있는 'Hyundai'가 출력된다.

companies[3][0] 이 부분이 재미있다. 다른 언어에서는 2차원 배열에 속한 원소값을 꺼내올 때 이렇게 사용한다. 위의 예제에서는 'G'가 출력된다. 4번째에 있는 원소 'Google'에서 다시 첫번째에 있는 글자인 'G'를 추출한 것이다.

마지막으로 4번째 원소와 5번째 원소를 단순히 더하기 하면 결과값은 'GoogleAmazon'이다. 위의 예제에서 리스트에 포함된 모든 원소는 문자열이기 때문에 문자열을 더하면 단순히 문자열이 합해진 값이 결과로 출력된다.
a = "We are Korean!"

print(a)
print(a[:])
print(a[0])
print(a[:5])
print(a[4:8])
변수 a에 담긴 값은 단순한 문자열이다. 파이썬은 유연해서 단순 문자열에 포함된 각 문자도 하나의 원소로 취급할 수 있다.

리스트를 다룰때와 마찬가지로 대괄호 []를 사용하여 문자열에 포함된 특정한 문자를 추출할 수 있다. 파이썬은 리스트에 포함된 원소를 추출하거나 슬라이싱 하기 위해서 콜론을 이용한다. 독특하고 편리하게 원하는 값을 추출할 수 있다.

[:]를 사용하면 리스트의 모든 값을 출력한다. [:5]는 [0:5]와 동일하다. 첫번째 글자부터 6번째 글자까지 슬라이스 하여 추출하라는 의미이다. [4:8]은 5번째 글자부터 9번째 글자까지 출력하라는 의미이다. [4:]라고 하면 5번째 글자부터 마지막까지 모두 출력하라는 의미이다. 위의 예제를 실행하면 결과값은 아래와 같다.






이상에서 소개한 자료형 외에도 파이썬은 다양한 자료형을 제공한다. 복소수 형태라던가 딕셔너리도 제공한다. 복소수는 사용할 일이 많을지 모르겠지만 딕셔너리는 이야기가 나온김에 간단하게 살펴보고 넘어가자.
user = { "name": "Jongsik", "age": 39, "sex": "male" }

print(user)
print(user["name"])
print(user["age"])
딕셔너리는 "키:밸류" 쌍으로 이루어진 값들의 집합이다. JSON을 많이 사용해 보았다면 익숙한 형태일 것이다. 파이썬의 딕셔너리는 JSON으로 다시 JSON은 딕셔너리로 입출력이 편리하다.




위의 예제를 출력한 결과값은 이와 같다. 다른 프로그래밍 언어에서 딕셔너리를 다루는 법과 거의 동일하다.

분기처리 제어문, if


이제 제어문의 기본적인 형태를 살펴보자.
a = True

if a == True:
    print("결과는 참")
else:
    print("결과는 거짓")
    
------------------------
>> 결과는 참
변수 a에 불리언 값 True를 주었다. if문을 사용해서 a의 값이 참이면 '결과는 참'이라는 문장을 출력하고 거짓이면 '결과는 거짓'이라는 문장을 출력하는 아주 간단한 코드이다.

다른 프로그래밍 언어와 별달리 다른 점은 없다. 다만, 파이썬만의 특성이 몇가지 있는데 그 부분만 짚고 넘어가면 되겠다.

우선 파이썬의 제어문에는 보통의 다른 언어와 달리 괄호가 없다. 그냥 조건문을 작성하고 콜론(:)을 사용하여 해당 문장을 마무리하면 된다. 콜론을 빠뜨리면 에러가 난다.

그리고 조건문 이후에 오는 문장은 인덴테이션을 받드시 해주어야 한다. 파이썬은 문장의 끝을 알리는 세미콜론(;)을 사용하지 않는 만큼 정확한 인덴테이션을 요구한다. 따라서, 인덴테이션을 제대로 해주지 않아도 구문 오류가 난다. 주석문 조차도 마음대로 달련 오류가 나니 인덴테이션을 제대로 맞춰주도록 한다.
age = 39

if age >= 10 and age <= 19:
    print("당신은 10대입니다")
elif age >= 20 and age <= 29:
    print("당신은 20대입니다")
elif age >= 30 and age <= 39:
    print("당신은 30대입니다")
else:
    print("당신은 청년은 아닙니다")
    
------------------------
>> 당신은 30대입니다
이번에는 변수 a에 39라는 정수를 어싸인하였다. 변수 a에 있는 값으로 현재 세대를 판정하는 간단한 if ~ elif ~ else 제어문이다.

이것도 다른 프로그래밍 언어와 별로 다른 부분은 없지만 파이썬의 특징이 몇가지 있다. 우선 파이썬은 &&, || 와 같은 연산자를 사용하지 않는다. 파이썬에서는 해당 연산자를 곧이 곧대로 and, or 라고 사용하면 된다.

그리고 조건이 여러가지인 경우에 다른 언어에서의 else if 문을 파이썬에서는 elif로 사용한다. 일단은 이 부분만 중점적으로 숙지하면 된다.
car = {"benz", "bmw", "audi"}

if "benz" in car:
    print("독일차 명단에 존재합니다")

--------------------------------
독일차 명단에 존재합니다
딕셔너리나 목록에 특정한 값이 포함되어 있는지 in 을 사용하여 간단하게 체크할 수 있다.
member = { "Jinsu", "Mihee", "Sohee" }

if "Jongsik" not in member:
    print("Jongsik은 멤버가 아닙니다")
위와 같이 not을 사용하여 목록에 포함되지 않은 값을 처리할 수도 있다. 다른 프로그래밍 언어 경험이 있다면 !in과 같은 방법을 시도하는 분도 있을텐데 이 구문은 잘못된 구문으로 오류를 뱉는다. not in이라고 정확하게 쓰자.

반복문, for


프로그래밍 언어에서 사용하는 제어문의 양대산맥 중 하나인 if문을 이용한 분기처리 문법에 대해서 수박 겉핥기로 알아보았다. 이제 나머지 한쪽 산맥인 반복문에 대해서 알아보자.

여러가지 형태의 반복문 중 단연 많이 쓰이는 것은 for문이다.
for i in range(0, 5):
    print(i)

결과:----------------------
0
1
2
3
4
가장 간단한 형태의 for문이다. 0에서 시작해서 4까지 총 5바퀴를 돌면서 i값을 출력하는 코드다. 다른 언어와는 조금 다른 점이 보이는데 하나씩 짚어보자.

우선 range라는 부분이 독특하게 여겨질 것이다. range는 다음과 같이 사용한다. range(시작숫자, 끝나는 숫자, 증가값). 여기서 시작숫자와 증가값은 생략할 수 있다. 시작숫자를 생략하면 0에서 끝 숫자까지 도는 것이고, 증가값을 제외하면 다른 언어의 ++과 비슷한 효과를 가지며 한바퀴 돌 때 마다 값을 1씩 증가시킨다.

for문도 if문과 마찬가지로 선언문이 끝나는 부분에 세미콜론(:)을 사용해주고, 그 다음줄부터는 들여쓰기(인덴테이션)를 제대로 맞추어 주저야 한다. 그렇지 않으면 구문 오류로 코드가 실행되지 않는다.

위의 예제는 for 문을 돌리면서 선언한 변수 i에 한바퀴 돌 때마다 0에서 4까지 숫자를 1씩 증가시키면서 i를 i++ 처리하는 예제다. range의 끝나는 숫자 바로 앞의 숫자까지 for문이 돈다.
numbers = [1, 3, 7, 9, 12]

for i in numbers:
    print(i)
    
결과:----------------------
1
3
7
9
12
리스트에 있는 원소의 숫자만큼 for문을 돌고 각 원소를 하나씩 꺼내서 뿌려주는 코드다.

반복문, while


while은 조건이 참인 경우에 루프를 도는 반복문이다. 기본적인 문법은 다음과 같다.

while 조건문:
    실행되는 코드
For 문과 달리 튜플을 돌거나 변수 생성을 하지 않느다. 조건문이 True인지 False인지를 체크하고 조건문의 결과가 True인 경우에만 루프를 돈다.
debt = 1000
due = 0
while debt > 0:
    debt = debt - 100
    due = due + 1
    print("상환 {0}개월차, 빚 100만원을 갚았습니다".format(due))
    print("남은 빚은 {0}만 원입니다".format(debt))
    
    if debt == 0:
        print("모든 빚을 갚았습니다")

결과: -----------------------------
상환 1개월차, 빚 100만원을 갚았습니다
남은 빚은 900만 원입니다
상환 2개월차, 빚 100만원을 갚았습니다
남은 빚은 800만 원입니다
상환 3개월차, 빚 100만원을 갚았습니다
남은 빚은 700만 원입니다
상환 4개월차, 빚 100만원을 갚았습니다
남은 빚은 600만 원입니다
상환 5개월차, 빚 100만원을 갚았습니다
남은 빚은 500만 원입니다
상환 6개월차, 빚 100만원을 갚았습니다
남은 빚은 400만 원입니다
상환 7개월차, 빚 100만원을 갚았습니다
남은 빚은 300만 원입니다
상환 8개월차, 빚 100만원을 갚았습니다
남은 빚은 200만 원입니다
상환 9개월차, 빚 100만원을 갚았습니다
남은 빚은 100만 원입니다
상환 10개월차, 빚 100만원을 갚았습니다
남은 빚은 0만 원입니다
모든 빚을 갚았습니다
빚 1000만 원을 변수 debt가 갖고 있다. while 문은 빚을 모두 값아서 0원이 될 때까지 루프문을 돈다. 루프를 한바퀴 돌 때 마다 빚을 100만원 씩 갚아 나가고, 기간을 1개월씩 증가시킨다. 최종적으로 빚을 모두 갚으면 빚을 모두 갚았다는 문구를 출력하고 루프문을 종료하는 간단한 코드이다.

continue, break, pass


continue : 반복문의 초반으로 돌아가서 다음 반복문을 계속 실행한다.
break : 반복문의 실행을 중단하고 빠져나간다.
pass : 처리될 구문은 있지만 처리할 일은 없을 때 익셉션을 방지하기 위해 사용한다.

먼저 break는 제어문을 탈출할 때 사용한다. 간단한 사용 방법은 다음과 같다.
for a in range(0 ,10):
    if a == 3:
        break
    print(a)

결과:--------------------
0
1
2
위의 구문은 변수 a에 0부터 9까지 총 10바퀴를 돌면서 숫자를 할당하고 출력하게 하는 코드이다. if 문 안에 break가 걸려있다. for문이 3바퀴를 돌고나면 break가 걸리면서 이 루프문은 종료된다. break는 이렇게 루프를 종료하고 빠져나가는 역할을 갖고 있다.
for a in range(0 ,10):
    if a == 3:
        continue
    print(a)
결과:--------------------
0
1
2
4
5
6
7
8
9
이 구문은  앞의 구문과 동일하다. break가 있던 부분에 continue가 들어간 것만 다르다. break와 달리 continue는 루프를 계속 돈다. 파이썬 인터프리터가 continue를 만나는 순간 아래에 있는 코드는 무시하고 곧장 다시 루프문의 다음 바퀴를 돌기 위해 올라간다. 그리고 다시 루프를 계속 돈다.

결과를 보면 0에서 9까지 10바퀴의 루프를 도는 동안 3번은 print가 되지 않은 것을 확인할 수 있다. 3바퀴째에 print 구문에 도달하기 전에 continue를 만났기 때문이다.
def test(a):
    
print (test("안녕!"))

결과:----------------------
File "<string>", line 3
    print (test("안녕!"))
    ^
IndentationError: expected an indented block
위의 코드는 test라는 함수를 만들어서 print 구문을 통해서 test 함수를 호출한다. test 함수 안에는 아무런 내용도 없다. 그래서 코드를 실행하면 블럭에 코드가 비어 있다고 에러를 뱉는다. 이런 에러를 방지하기 위해서 pass를 사용한다.
def test(a):
    pass
    
print (test("안녕!"))

결과:----------------------
None
함수 블럭은 생성되었지만 할 일이 없는 경우에 pass를 사용하여 indented block 익셉션을 방지하였다.

외부 모듈 불러오기(import)


자바나 타입스크립트와 같이 파이썬도 import라는 구문을 사용할 수 있다. import를 사용하면 외부의 모듈을 가져와서 사용할 수 있다.
import 모듈명
이렇게 사용하면 해당 모듈을 모두 가져온다.
from 모듈명 import 기능명
이렇게 사용하면 모듈안에 있는 특정한 기능만 꺼내서 가져온다. 모듈은 파이썬이 제공하는 기본 모듈들이 있고, 세계의 여러 개발자들이 만들어 둔 오픈소스 모듈들도 있을거고 또 우리가 만드는 확장자 .py 파일도 외부 모듈로써 필요할 때는 언제든 외부의 .py 파일을 import 해서 사용할 수 있다.

기본모듈


파이썬에는 수 많은 기본 모듈이 제공된다. 파이썬에 내장된 기본모듈이므로 별도로 설치를 할 필요가 없다. 파이썬에서 제공하는 기본 모듈을 잘 활용하면 프로그램을 만들 때 매우 유용하게 사용할 수 있다. 그 중에서 몇 가지 표준 모듈만 살펴보자.

우선 math 모듈을 사용한 예제다. math 모듈은 복잡한 수학 계산을 편리하게 처리할 수 있도록 도와주는 함수들을 제공한다. 복소수는 cmath 모듈에서 지원한다.
import math

print(math.fabs(-99))    # 절대값 반환
print(math.factorial(4)) # 팩토리얼값 반환
print(math.isnan(10))    # 숫자이면 False 반환
print(math.isqrt(16))    # 제곱근 반환
print(math.log(24))      # 자연로그 반환(밑 e)
print(math.pow(3, 3))    # 거듭제곱 반환

결과:-------------------------
99.0
24
False
4
3.1780538303479458
27.0
math 모듈에서 지원하는 함수 몇가지만 사용해 본 예제다. 위와 같이 사용하면 된다.

json을 인코딩/디코딩 할 때 매우 편리하게 사용할 수 있는 json 모듈 등 유용한 기본 모듈이 상당히 많이 지원되고 있다. 표준 라이브러리 목록과 사용 방법은 내용이 방대하므로 파이썬 공식 홈페이지에서 제공하는 매뉴얼을 참고하는 것을 추천한다. 

표준 라이브러리 매뉴얼 주소 : https://docs.python.org/ko/3/library/index.html

파이썬에는 멋진 외부 모듈도 많다. 대표적으로 선형대수 라이브러리인 넘파이와 같은 외부 모듈도 꼭 활용해보면 좋겠다. 파이썬의 기본 연산 속도가 느리다고 생각되면 이 모듈을 쓰면 대규모 숫자들의 빠른 연산이 가능하다. 그리고 표준편차, 분산, 푸리에 변환 등을 빠르고 편리하게 계산하고 사용할 수 있다.

넘파이에 대한 이야기가 나왔으니 넘파이에 대해서 정리를 잘 해둔 블로그가 있어서 링크를 해두니 참고하자.

f-string 포맷팅


파이썬2까지는 문자열을 다룰 때 C에서 썼던 %-포맷팅 방법을 쓰거나 위의 while문 예제에서 사용했던 {}.format() 포맷팅 방식을 썼다. 그러나 파이썬3에서는 가독성이 떨어지는 이런 방법을 쓰지 않고도 f-string 포맷팅 방법을 사용할 수 있게 되어서 가독성이 좋아졌다.

간단한 사용법은 다음과 같다.
name = "송종식"
age = 38
memo = f"안녕하세요. 제 이름은 {name}입니다. {age}살이에요."
print(memo)

결과:--------------------------
안녕하세요. 제 이름은 송종식입니다. 38살이에요.
리액트, Vue와 같은 프론트엔드 프레임워크에서 사용하는 보간자와 비슷한 방법으로 사용하면 된다.
price = 1000
amount = 5
memo = f"사과{amount}개에 {amount*price}입니다"
print(memo)

결과:--------------------------
사과5개에 5000입니다
이런식으로 f-string을 이용해서 바로 연산을 처리할 수도 있다.
profile = {"name": "Jongsik Song", "age": 38}
data = f'이름은 {profile["name"]}이고 나이는 {profile["age"]}살 입니다'
print(data)

결과:--------------------------
이름은 Jongsik Song이고 나이는 38입니다
리스트와 딕셔너리를 활용할 때는 이와 같이 처리하면 된다. 홑따옴표와 쌍따옴표 사용에 주의하자. f-string은 날짜처리를 비롯해서 더욱 다양한 기능을 지원한다. 잘 활용하면 정말 편리한 기능이니 숙지하자. 

f-string 포맷팅에 대한 더 많은 정보는 다음 링크를 통해서 확인하자.

형변환


파이썬은 형변환이 유연하다.
a = 10
print(type(a))
a = "10"
print(type(a))

결과:-----------------
<class 'int'>
<class 'str'>
변수에 들어가는 값의 자료형이 바뀌면 변수에 자료형 변경을 가하는 작업을 하지 않아도 자동으로 변수형이 변한다. 변수 a가 int형에서 string형으로 자료형이 변한 것을 확인할 수 있다.

이상으로 파이썬을 다루기 위한 가장 기초적인 문법에 대해서 다루어 보았다.


댓글 4개:

  1. 감사합니다. 앞으로 기본적인 프로그래밍이나 코딩에 대한 이해가 없으면 살아남기 힘든 세상이 될거 같습니다.

    답글삭제
    답글
    1. 네, 현대인의 패시브 스킬이 될 것 같습니다!

      삭제