"미운코딩새끼"의 두 판 사이의 차이

130번째 줄: 130번째 줄:
* https://www.python.org/ → Downloads → 3.X 클릭
* https://www.python.org/ → Downloads → 3.X 클릭
* 더블클릭 후 Install Now 누르기 전에 ?Add Python? 3.6 to PATH 체크하고 Next
* 더블클릭 후 Install Now 누르기 전에 ?Add Python? 3.6 to PATH 체크하고 Next
* 3.6.2 (가장 최신) 버전을 이용하는 것을 추천합니다. 본 강의는 3.6.0 버전을 기준으로 합니다.
* 본 강의는 3.6.0 버전을 기준으로 합니다. 가장 최신 버전을 사용해도 관계 없습니다.
* 2.x 버전을 사용하면 미운코딩새끼의 예제가 정상적으로 동작하지 않을 수 있습니다.
* 2.x 버전을 사용하면 미운코딩새끼의 예제가 정상적으로 동작하지 않을 수 있습니다.



2017년 10월 3일 (화) 22:14 판

1 미운코딩새끼

대학 새내기 시절 코딩이 너무 어려웠습니다. 잘해보려 아등바등 노력해 봤지만 매번 실패하다가 결국 미워하게 돼버렸습니다. 지금 돌아보면 그렇게 미워할 정도는 아니었는데 말이죠. 지금도 같은 고민을 하는 분들이 많을 거라고 생각합니다. 그 때 그 시절 이런 강의가 있었으면 어땠을까 하는 마음으로 미운코딩새끼를 만들었습니다.

미운코딩새끼는 코딩이 너무 어려워 포기한 분, 또는 코딩을 처음 접하는 분을 위한 강의입니다. 파이썬이라는 프로그래밍 언어의 기초 문법을 쉽게 배울 수 있습니다. 코딩을 왜 배워야 하는지, 왜 필요한지에 대해서 답을 주지는 않지만 코딩이란 이런 거구나, 파이썬이란 이런 거구나 하는 정도의 감을 잡을 수 있습니다.

이 문서는 코딩계의 아이돌 그룹 김왼손과 집단지성들이 함께 정리했습니다. 미운코딩새끼는 남녀노소 상관없이 누구나 기여할 수 있습니다. 여러분도 지금 참여해보세요!

1.1 김왼손과 집단지성들

김왼손과 집단지성들은 잉끼유튜버 김왼손과 그 열혈 구독자들이 함께하는 코딩계의 아이돌 그룹입니다. 정규 1집 미운코딩새끼에 참여해 주신 분들은 아래에 기록을 꼭 남겨주세요. 참여해 주신 모든 여러분들께 감사드립니다.

  • 김레이 (leykim0907@naver.com) : 딕셔너리 부분 편집
  • 켈리(Kelly) (rnrmf3apdlf@gmail.com) : list, tuple 등 요약
  • MANGO 망고 (mingyu041209@naver.com) : 디자인 다듬기, 귀도 반 로섬 제작
  • 요거트 (changeunp04@gmail.com) : 전체적인 내용 편집
  • H2SO4
  • 이에스 (hubolab10@gmail.com) : 파이썬이란, 이 책을 읽는 방법 제작 및 보기 좋게 다듬기
  • JW호박 pumkin (pjwbrain@naver.com) : 기본 내용들의 부족한 부분 보충
  • Meta27-익명의 거북 (leeyoungmin2788@gmail.com) : 약간의 수정, 조건문, IDLE 커스텀, While문, 문자열 등
  • 토미유튜브 (tjdwn1416@gmail.com) : 무한루프 내용 추가
  • 김씨가족 (wearekimsfamily@gmail.com) : 수정 및 추가, 소소한 부분 정리
  • 스치 (junhg0211@gmail.com)
  • 류도영 (ryudo1023@gmail.com) : 사소한 내용 고침
  • 호옹 (v1000401@gmail.com) : 사소한 내용 고침
  • 문용석 (weedss9@naver.com) : 귀도 반 로섬은 누구인가? 제목 제작, 미운코딩새끼 요약 다듬기, 파이썬이란? 일부분 수정
  • 불탄고등어 : 사소한 내용 고침
  • 이다은(Danna) (daeunlee0720@gmail.com) : 사소한 내용 고침, 맞춤법/띄어쓰기 오류 수정

1.2 멤버 모집 영상

1.3 앨범 제작 방식

  • 김왼손은 강의합니다.
  • 집단지성들은 공부합니다.
  • 모두 함께 정리합니다.

2 프로그램과 프로그래밍

2.1 프로그램이란?

  • 문제를 해결하기 위해서 명령을 모아놓은 것을 말합니다.
  • 컴퓨터를 이용해서 우리 일상의 문제들을 해결할 수 있습니다.
  • 프로그램이라는 단어는 고대 그리스어에서 유래된 것으로 미리 정해놓은 것이라는 뜻을 가지고 있습니다.
  • 방송 프로그램, 운동 프로그램처럼 일상에서도 프로그램이라는 말을 사용하고 있습니다.
  • 일상 속 여러 프로그램들처럼 미리 정해놓은 것을 순서대로 실행하는 것을 말합니다.
  • 코딩(coding)과 프로그래밍(programming)은 엄밀히 말하면 다르지만 혼용해서 많이 사용합니다.
  • 프로그래밍 언어란 컴퓨터가 알아듣는 언어를 말합니다. 세상에는 다양한 프로그래밍 언어가 있습니다.

2.2 프로그램의 기본 구조

  • 모든 프로그램은 순차, 선택, 반복 세 가지 기본 구조로 구성되어 있습니다.
    • 순차 : 정해진 순서대로 명령을 수행하는 것을 말합니다.
    • 선택 : 예와 아니오를 구분하는 조건에 따라 흐름을 바꾸는 것을 말합니다.
    • 반복 : 같은 명령을 조건이나 횟수에 따라 반복하는 것을 말합니다.

3 왜 파이썬일까요?

3.1 쉽습니다

  • 문법이 쉽고 간결해서 배우고 사용하기 쉽습니다.
  • 코딩은 쉽지 않지만 파이썬은 다른 언어들보다는 비교적 쉽습니다.
  • 우리가 사용하는 영어와 유사하기 때문에 친숙한 느낌을 받을 수 있습니다.
  • 외국의 경우 파이썬을 입문 언어로 많이 사용합니다. 우리나라도 바뀌고 있는 추세입니다.
  • 범용 프로그래밍 언어라서 데이터 분석, 게임 개발, 보안 등 다방면에 사용이 가능합니다.
  • 아래는 자바라는 언어로 "Life is Short!"를 분리하고 출력하는 코드입니다.
public static void main(String[] args) {
    String msg = "Life is Short!";
        for(String m : msg.split(" "))
            System.out.println(m);
}
  • 아래는 파이썬으로 "Life is Short!"를 분리하고 출력하는 코드입니다.
msg = 'Life is Short!'
print(msg.split())
  • 같은 기능인데도 파이썬이 자바보다 간결한 것을 볼 수 있습니다.

3.2 많습니다

  • 구글, 페이스북 같은 기업뿐만 아니라 파이썬을 사용하는 사람이 아주 많기 때문에 참고할 자료도 많습니다.
  • 스택오버플로우 (https://stackoverflow.com/) : 코딩계의 네이버 지식인이라 할 수 있습니다.
  • 질문도 엄청 많지만 답변은 이보다 훨씬 많습니다. 훑어보는 것만으로도 공부가 됩니다.
  • 파이썬의 모토 : "어떤 문제를 해결하는 가장 아름다운 방법이 있다."
  • 파이썬과 자주 비교되는 언어로 이 있는데 은 문제를 해결할 때 다양한 방법을 선호합니다.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

3.3 빠릅니다

  • 실행속도가 빠르다는 것이 아니라 개발을 빠르게 할 수 있다는 말입니다.
  • 배우는데 걸리는 시간도 다른 언어에 비해 비교적 적게 드는 편입니다.
  • 제품을 구매했을 때 배터리가 포함되어 있어 따로 구매하거나 필요가 없는 경우가 있습니다.
  • 파이썬은 제공하는 라이브러리들이 많아서 구현할 필요 없이 바로 가져다 쓸 수 있습니다.
  • 보통 이런 라이브러리들은 충분히 검증이 되어있기 때문에 직접 만드는 것보다 성능이 좋습니다.

4 파이썬 시작하기

4.1 파이썬 설치하기

  • https://www.python.org/ → Downloads → 3.X 클릭
  • 더블클릭 후 Install Now 누르기 전에 ?Add Python? 3.6 to PATH 체크하고 Next
  • 본 강의는 3.6.0 버전을 기준으로 합니다. 가장 최신 버전을 사용해도 관계 없습니다.
  • 2.x 버전을 사용하면 미운코딩새끼의 예제가 정상적으로 동작하지 않을 수 있습니다.

4.2 IDLE

  • IDLE (Integrated Development and Learning Environment)
  • 초보자들이 처음 파이썬을 입문할 때 사용하기에 간편합니다.
  • 개발을 할때도 보조 도구로 사용하기 좋습니다.
  • 인터렉티브 셸 모드
    • 컴퓨터와 탁구를 치듯이 주고받을 수 있는 모드입니다.
    • 한번 명령어를 던지면 컴퓨터가 대답을 하는 형식입니다.
  • 에디터 모드
    • 여러 줄의 코드를 작성할 수 있는 모드입니다.

5 입력과 출력

5.1 출력하기

  • print()는 값을 출력해주는 함수입니다.
  • 입력한 메시지나 값을 출력합니다.
  • 문자나 숫자 등을 출력할 수 있습니다.
  • 쉼표(,)로 여러 값을 출력할 수 있습니다.
  • 괄호(()) 안의 값을 출력합니다.
>>> print()

>>> print('Hello world!')
Hello world!
>>> print(1)
1
>>> print([1, 2, 3])
[1, 2, 3]
  • 정확하게 print()를 입력해야 합니다. 잘못 입력하면 에러가 발생합니다.
>>> pritn()
Traceback (most recent call last):
  File "<pyshell#105>", line 1, in <module>
    pritn()
NameError: name 'pritn' is not defined
  • 컴퓨터는 개떡같이 말하면 찰떡같이 알아듣지 못합니다. 그냥 개떡같이 알아 듣습니다.
  • 이 때문에 컴퓨터가 알아들을 수 있도록 문법에 맞게 찰떡같이 말해줘야 합니다.
>>> print(1)
1
>>> print(1, 2, 3)
1 2 3
>>> print(1,2,3)
1 2 3
>>> print(123)
123
>>> print('python')
python
>>> print('My name is', 'Bob')
My name is Bob

5.2 입력하기

  • 실행 중 사용자의 입력을 받습니다.
  • 입력 값은 항상 문자열로 받아옵니다.
  • 프로그램에게 정보를 전달할 수 있습니다.
  • 괄호 안에 문자열을 넣으면 프롬프트의 역할을 수행합니다.
  • 입력 받은 값을 변수에 저장할 수 있습니다.
>>> name = input('What is your name?')
What is your name?

6 변수

6.1 변수

  • 변수에는 값을 할당할 수 있습니다.
  • 파이썬에서 =은 할당을 의미합니다.
  • 할당된 값은 변할 수 있습니다.
>>> my_int = 1
>>> my_str = 'Python'
>>> count = 1  # 1
>>> count = count + 1  # 2

6.2 변수의 이름

  • 아주 예전에는 메모리에 저장되어 있는 값을 불러오기 위해 번호를 사용했습니다.
  • 번호가 많아지면서 관리가 어려워지고 숫자 대신 이름을 붙이기 시작했습니다.
  • 변수의 이름은 다른 사람들과 함께 쓰기에 편한 이름으로 짓는 것이 좋습니다.
  • 혼자만이 아닌 모두가 이해할 수 있게 작성하는 것을 권장합니다.
  • 글자나 밑줄 문자(_)를 사용합니다.
  • 대문자와 소문자를 구분합니다.
>>> python = 1
>>> PYTHON = 2
  • 숫자로 시작하는 이름은 쓸 수 없습니다.
  • 띄어쓰기를 포함할 수 없습니다. 보통 띄어쓰기 대신 밑줄 문자(_)를 사용합니다.
  • 유니코드 방식을 사용하기 때문에 변수명으로 한글도 지원합니다.
  • 하지만 대부분의 경우 영어 변수명을 사용합니다.
>>> 파이썬 = 1
>>> 김왼손 = 20

7 프로그램의 기본재료

7.1 숫자형, 문자열, 불린

  • 숫자형 (Numeric)
    • 숫자로 이루어진 자료형입니다.
    • 정수나 실수 등을 다룰 수 있습니다.
    • 숫자끼리 연산도 가능합니다.
>>> my_int1 = 1
>>> my_int2 = -2
>>> my_int3 = 4096
>>> my_float1 = 1.0
>>> my_float2 = 2.0
>>> my_float3 = 3.14
  • 문자열 (String)
    • 문자나 문자들을 늘어놓은 것입니다.
    • 큰따옴표와 작은따옴표로 구분합니다.
    • 리스트와 함께 시퀀스 자료형입니다.
    • 작은따옴표(' ') 또는 큰따옴표(" ")로 구분합니다.
>>> my_str1 = 'a'
>>> my_str2 = '3.14'
>>> my_str3 = 'coding'
>>> my_str4 = "coding"
  • 불린 (Boolean)
    • 참(True)과 거짓(False)을 말합니다.
    • 비교나 논리연산자의 결과입니다.
>>> my_bool1 = True  # True
>>> my_bool2 = False  # False
>>> my_bool3 = 1 < 2  # True
>>> my_bool4 = 1 == 2  # False

7.2 리스트, 튜플, 딕셔너리

  • 리스트 (List)
    • 여러 값을 함께 모아서 저장합니다.
    • 값을 변경할 수 있으며 순서가 있습니다.
>>> my_list = []  # []
>>> my_list.append(123)  # [123]
>>> my_list.append('abc') # [123, 'abc']
>>> my_list.append(True)  # [123, 'abc', True]
  • 튜플 (Tuple)
    • 여러 값을 함께 모아서 저장합니다.
    • 값을 변경할 수 없으며 순서가 있습니다.
>>> my_tuple1 = ()
>>> my_tuple2 = (1,)
>>> my_tuple3 = ('a', 'b', 'c')
>>> my_tuple4 = 3.14, 'Python', True
  • 딕셔너리 (Dictionary)
    • 관련된 정보를 서로 연관시켜 놓은 것입니다.
    • 키와 값의 쌍으로 이루어져 있습니다.
>>> my_dict = {}  # {}
>>> my_dict[1] = 'a'  # {1: 'a'}
>>> my_dict['b'] = 2  # {1: 'a', 'b': 2}
>>> my_dict['c'] = 'd'  # {1: 'a', 'b': 2, 'c': 'd'}

7.3 자료형 변환하기

  • 자료형끼리 변환할 수 있는 함수도 있습니다.
  • int(): 정수형으로 변환합니다.
>>> print(int(3.14))
3
  • float(): 실수형으로 변환합니다.
>>> print(float(3))
3.0
  • str(): 문자열로 변환합니다.
>>> print(str(3.0))
3.0
>>> print(type(str(3.0)))
<class 'str'>
  • list(): 리스트로 변환합니다.
>>> print(list('3.0'))
['3', '.', '0']

8 주석

  • 사람을 위한 설명을 메모합니다.
  • 코멘트(comment)라고도 합니다.
  • 컴퓨터는 주석을 무시합니다.
  • #을 사용합니다.
  • 지나치게 많거나 코드와 상관없는 주석은 오히려 방해가 될 수 있습니다.
>>> print('Hello Python!')  # 문자열을 출력합니다.
Hello Python!
>>> print(12345)  # 숫자를 출력합니다.
12345
>>> print(2 + 3)  # 계산결과를 출력합니다.
5

9 문자열

9.1 기본구조

  • 문자나 문자들을 나열한 것입니다.
  • 값을 변경할 수 없으며 순서가 있습니다.
  • 큰따옴표나 작은따옴표로 구분합니다.
>>> my_str = 'python'
>>> print(my_str)
python
>>> type(my_str)
<class 'str'>
  • 문자열 안에 큰따옴표나 작은따옴표를 넣고 싶을 때는 서로 다른 따옴표를 함께 씁니다.
>>> print("Let's go!")
>>> print('I said, "Hello!"')
  • 따옴표를 세 번씩 쓰면 여러 줄을 표현할 수 있습니다.
>>> my_str = """버스
지하철
택시
"""

9.2 문자열 포맷팅

  • % 연산자를 이용해 문자열에 숫자, 문자열 등을 대입합니다.
  • 문자열을 자유롭게 표현하는 방법입니다.
>>> print('My name is %s' % 'Tom')
My name is Tom
>>> print('x = %d, y = %d' % (1, 2))
x = 1, y = 2
>>> print('%d x %d = %d' % (2, 3, 2 * 3))
2 x 3 = 6
  • %d : 정수형 숫자를 대입할 수 있습니다.
>>> print('%d %d' % (1, 2))
1 2
  • %f : 실수형 숫자를 대입할 수 있습니다.
>>> print('%f' % 3.14)
3.14
  • %s : 문자열을 대입할 수 있습니다.
>>> print('%s' % 'coding')
coding

9.3 format()

  • 포맷팅을 수행하는 문자열의 메소드입니다.
  • 중괄호 { }를 이용해 값을 대입합니다.
  • 보다 파이썬스러운 방법입니다.
  • 순서도 지정할 수 있습니다.
>>> print('My name is %s' % 'Tom')
My name is Tom
>>> print('My name is {}'.format('Tom'))
My name is Tom
>>> print('{} x {} ={}'.format(2, 3, 2 * 3))
2 x 3 = 6
>>> print('{1} x {0} ={2}'.format(2, 3, 2 * 3))  # 괄호 안의 숫자는 순서를 지정
3 x 2 = 6

9.4 인덱싱

  • 위치(index)를 이용해 각 문자에 접근할 수 있습니다.
  • 'Python' : 0 = P, 1 = y, t = 2, h = 3, o = 4, n = 5
  • 위치는 0부터 시작합니다. 공백도 포함합니다.
>>> alphabet = 'abcde'
>>> print(alphabet[0])
a
>>> print(alphabet[3])
b
>>> print(alphabet[5])
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    print(alphabet[5])
IndexError: string index out of range

>>> my_name = '김왼손의 왼손코딩'
>>> my_name[3]

>>> my_name[8]

  • 음수를 인덱스로 사용할 수 있습니다.
  • 가장 뒤의 값을 -1부터 해서 거꾸로 세어갑니다.
>>> my_name = '김왼손의 왼손코딩'
>>> my_name[-1]

  • 리스트 자료형에서도 거의 비슷합니다.

9.5 슬라이싱

  • 문자열에서 여러 값을 한꺼번에 잘라옵니다.
  • 콜론(:)을 이용해 여러 값을 한꺼번에 가져올 수 있습니다.
  • 기존 문자열은 그대로 두고 복사해서 사용합니다.
>>> my_str = 'Hello Python!'
>>> print(my_str[0:1])
H
>>> print(my_str[0:2])
He
>>> print(my_str[3:7])
lo P

>>> my_name = '김왼손의 왼손코딩'
>>> print(my_name[5:7])
왼손
  • 앞이나 뒤 숫자를 생략할 수도 있습니다.
>>> my_name = '김왼손의 왼손코딩'
>>> my_name[:2]
김왼
>>> my_name[7:]
코딩

9.6 메서드

  • 특정한 기능을 수행하기 위한 코드를 모아두고 이름을 붙인 것을 함수라고 합니다.
  • 메서드는 특정 객체만 사용할 수 있는 함수를 말합니다.
  • string.split(): 문자열을 공백 기준으로 분리합니다.
>>> fruit_str = 'apple banana lemon'
>>> fruits = fruit_str.split()
>>> print(fruits[0])
apple
>>> print(fruits[1])
banana

>>> my_name = '김왼손의 왼손코딩'
>>> print(my_name.split())
['김왼손의', '왼손코딩']

9.7 독스트링

  • 문서화 문자열(Documentation string)입니다.
  • 함수가 어떤 일을 수행하는지 설명합니다.
  • 보통 큰따옴표 세 개를 사용합니다.
def 함수이름(인자1, ...):
    """함수에 대한 설명"""
    실행할 명령1
    실행할 명령2
    ...
    return 결과

9.8 end

  • print() 함수에서 출력의 끝을 지정합니다.
  • 파이썬에서는 줄 바꿈(\n)이 기본 값입니다.
>>> print(' ', end='')

>>> print('집단지성', end='/')
집단지성/
>>> print('집단지성', end='미운코딩새끼')
집단지성미운코딩새끼

9.9 이스케이프 코드

  • 특정한 기능을 수행하는 문자의 조합입니다.
  • 문자열에 포함해서 사용할 수 있습니다.
  • 키보드에서 백슬래쉬와 원화는 같은 키입니다.
  • \n : 개행, 줄 바꿈
>>> print('미운코딩새끼의 집단지성들')
미운코딩새끼의 집단지성들
>>> print('미운코딩새끼의/n집단지성들')
미운코딩새끼의
집단지성들
  • \t : 탭(tab)
>>> print('미운', end='\t'); print('코딩')
미운    코딩

10 리스트

10.1 기본구조

  • 여러 값을 한꺼번에 모을 수 있습니다.
  • 값들은 변경할 수 있고 순서가 있습니다.
    • 가변(mutable) : 값을 변경할 수 있습니다. 리스트, 딕셔너리 등이 해당됩니다.
    • 불변(immutable) : 값을 변경할 수 없습니다. 문자열, 튜플 등이 해당됩니다.
  • 빈 리스트 만들기
>>> my_list = []
[]
>>> type(my_list)
<class 'list'>
  • 값을 가지고 있는 리스트 만들기
>>> my_list = [1, 2, 3]
>>> print(my_list)
[1, 2, 3]

10.2 값 추가하기

  • list.append()를 사용해서 값을 추가할 수 있습니다.
>>> students = ['Tom', 'Alice', 'Sally']
>>> students.append('Betty')
>>> students.append('Angela')
>>> print(students)
['Tom', 'Alice', 'Sally', 'Betty', 'Angela']
  • 리스트는 그릇과 같습니다. 그릇이 없는 상태에서 식재료를 쏟을 수 없습니다.
  • 리스트가 없는 상태로 append()를 이용해 값을 추가할 수 없습니다.
>>> humans.append('David')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    humans.append('David')
NameError: name 'humans' is not defined

10.3 인덱싱

  • 인덱싱, 슬라이싱은 문자열과 상당히 유사합니다.
  • 위치를 이용해서 값에 접근하는 것을 인덱싱이라고 합니다.
>>> animals = ['코알라', '하이에나', '바다소', '땅다람쥐', '바다코끼리', '스컹크', '아나콘다']
>>> print(animals[1])
['하이에나']

10.4 값 제거하기

  • del : 리스트의 값을 제거합니다.
>>> animals = ['코알라', '하이에나', '바다소', '땅다람쥐', '바다코끼리', '스컹크', '아나콘다']
>>> print(animals[4])
'바다코끼리'
>>> del animals[4]  # 4번째 값 삭제
>>> print(animals)
['코알라', '하이에나', '바다소', '땅다람쥐', '스컹크', '아나콘다']

10.5 슬라이싱

  • 리스트에서 여러 값을 한꺼번에 잘라옵니다.
  • 콜론(:)을 이용해 여러 값을 한꺼번에 가져올 수 있습니다.
  • 기존 리스트는 그대로 두고 복사해서 사용합니다.
>>> animals = ['코알라', '하이에나', '바다소', '땅다람쥐', '바다코끼리', '스컹크', '아나콘다']
>>> print(animals[1:3])
['하이에나', '바다소']

10.6 메서드

  • 리스트도 다양한 메서드가 있습니다.
  • 외우는 건 중요하지 않습니다. 필요할 때 검색해서 사용할 수 있으면 됩니다.
  • list.sort(): 리스트 안의 값을 정렬합니다.
>>> animals =['코알라', '하이에나', '바다소', '땅다람쥐', '바다코끼리', '스컹크', '아나콘다']
>>> animals.sort()
>>> print(animals)
['땅다람쥐', '바다소', '바다코끼리', '스컹크', '아나콘다', '코알라', '하이에나']
  • list.count(): 해당 값의 개수를 셉니다.
>>> animals =['코알라', '하이에나', '바다소', '땅다람쥐', '바다코끼리', '스컹크', '아나콘다']
>>> print(animals.count('바다소'))
1
  • 리스트의 메서드에 대해서 더 알고 싶다면 구글에 검색해보세요.

11 튜플

11.1 기본구조

  • 리스트와 거의 유사합니다.
  • 여러 값을 한꺼번에 모을 수 있습니다.
  • 값을 변경할 수 없다는 점이 리스트와 다릅니다.
  • 튜플은 괄호를 쓰지 않아도 됩니다.
>>> my_tuple = (1, 2, 3)
>>> type(my_tuple)
<class 'tuple'>
>>> my_tuple = 1, 2, 3
>>> type(my_tuple)
<class 'tuple'>

11.2 패킹, 언패킹

  • 패킹(Packing) : 여러 개의 값을 한꺼번에 묶는 것을 말합니다.
  • 언패킹(Unpacking) : 묶여 있는 값을 풀어놓는 것을 말합니다.
>>> my_tuple = (1, 2, 3)
>>> num1, num2, num3 = my_tuple
>>> print(num1)
1
>>> print(num2)
2
  • 두 변수의 값을 서로 바꿀 때도 사용할 수 있습니다.
>>> num1 = 1
>>> num2 = 2
>>> num1, num2 = num2, num1
>>> print(num1)
2
>>> print(num2)
1

12 for

12.1 반복문

  • 반복되는 지루한 작업을 처리하기 위해 사용합니다.
  • 파이썬에는 for와 while 두 가지 반복문이 있습니다.
  • for는 횟수를 기준으로, while은 조건을 기준으로 반복합니다.

12.2 기본구조

for 변수 in 컨테이너:
    실행할 명령1
    실행할 명령2
    ...
  • 컨테이너 안의 값을 전부 순회할 때까지 반복합니다.
  • 반복하는 부분을 코드블럭이라고 합니다.
  • 코드블럭을 구분하기 위해 콜론(:)과 들여쓰기를 사용합니다.
animals = [땅다람쥐, 바다코끼리, 스컹크, 아나콘다, 코알라, 하이에나, 바다소]
for animal in animals:
    print(animal)

땅다람쥐
바다코끼리
스컹크
아나콘다
코알라
하이에나
바다소

for num in [1, 2, 3]:
    print(num)

1
2
3

for ch in '김왼손':
    print(ch)




12.3 들여쓰기

  • 파이썬에서는 들여쓰기가 선택이 아닌 필수입니다.
  • 띄어쓰기의 종류는 하나로 통일해야 합니다.
  • 보통 4칸 띄어쓰기를 권장합니다.

12.4 range()

  • for와 함께 자주 사용되는 내장함수입니다.
  • range(stop)은 0부터 stop 전까지의 숫자를 나열합니다.
  • range(start, strop)는 start부터 stop 전까지의 숫자를 나열합니다.
for n in range(3):
    print(n)

0
1
2

for n in range(4, 6):
    print(n)

4
5

12.5 for x 2

  • 반복문을 중첩해서 사용할 수 있습니다.
  • 아래는 for를 이용해 구구단 2단을 출력하는 예제입니다.
for i in range(1, 10):
    print('{}x{}={}'.format(2, i, 2 * 1))
  • for를 중첩해서 사용하면 2단부터 9단까지 모두 출력할 수도 있습니다.
for j in range(2, 10):
    for i in range(1, 10):
        print('{}x{}={}'.format(j, i, j * i))

12.6 컴프리헨션

  • 리스트를 만드는 강력하고 간결한 방법입니다.
  • 초보자에게는 쉽지 않지만 많이 사용됩니다.
  • 주어진 리스트에서 홀수만 뽑아내는 코드를 작성해봅시다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers = []

for number in numbers:
    if number % 2 == 1:  # 2로 나눴을 때 1이 남으면 홀수입니다.
        odd_numbers.append(number)
  • 다음은 컴프리헨션을 이용한 방법입니다.
>>> odd_numbers = [number for number in numbers if number % 2 == 1]

13 연산자

13.1 할당

  • 수학에서 =는 같다는 뜻입니다.
  • 파이썬에서 =은 할당 연산자입니다.
  • 오른쪽의 값을 왼쪽의 변수에 할당합니다.
>>> my_int = 1
>>> my_float = 2.0
>>> my_list = []
  • +=와 같은 것들을 복합 할당 연산자라고 합니다.
>>> count = 0
>>> count = count + 1
>>> print(count)
1
>>> count += 1  # count = count + 1과 같습니다.
>>> print(count)
2

13.2 산술

  • 숫자끼리 연산을 할 수 있게 합니다.
  • 아래와 같이 더하기, 빼기, 곱하기, 나누기를 할 수 있습니다.
>>> print(3 + 3)
6
>>> print(20 - 5)
15
>>> print(6 * 2)
12
>>> print(12 / 3)
4.0
  • 아래는 특수 연산자입니다.
>>> print(3 ** 2)  # 3의 2제곱
9
>>> print(4 ** 3)  # 4의 3제곱
64
>>> print(7 / 3)  # 7 나누기 3
2.3333333333333335
>>> print(7 // 3)  # 7 나누기 3의 몫
2
>>> print(7 % 3)  # 7 나누기 3의 나머지
1


  • %의 경우에는 홀수, 짝수의 구분 등에 사용될 수 있습니다.
  • 아래 코드는 %를 이용해 홀짝 구분을 하는 코드입니다.
numbers = [1, 2, 3, 4, 5, 6, 7]
for number in numbers:
    if number % 2 == 1:
        print(number, ': 홀수')
    else:
        print(number, ': 짝수')

1 : 홀수
2 : 짝수
3 : 홀수
4 : 짝수
5 : 홀수
6 : 짝수
7 : 홀수

13.3 문자열

  • 문자열에도 연산자가 있습니다.
  • + : 문자열끼리 연결합니다.
>>> print('김왼손'+ 'X' + '집단지성들')
김왼손X집단지성들
>>> print('안녕하세요' + ' ' + '반갑습니다')
안녕하세요 반갑습니다
  • * : 문자열을 곱한 수만큼 반복합니다.
>>> print('안녕' * 3)
안녕안녕안녕
>>> print('안녕 ' * 5)
안녕 안녕 안녕 안녕 안녕

13.4 비교

  • 비교연산자는 말 그대로 비교를 하는 것입니다.
  • 비교의 결과는 불린(True, False)입니다.
  • == : 왼쪽과 오른쪽이 같은 지
  • != : 왼쪽과 오른쪽이 다른 지
  • > : 왼쪽이 더 큰 지
  • < : 오른쪽이 더 큰 지
  • >= : 왼쪽이 더 크거나 같은 지
  • <= : 오른쪽이 더 크거나 같은 지
>>> print(1 < 2)
True
>>> print(1 > 2)
False
>>> print(1 == 1)
True
>>> print(1 != 1)
False
>>> print(4 <= 6)
True
>>> print(5 <= 5)
True

13.5 논리

  • 파이썬의 논리 연산자에는 and, or, not이 있습니다.
  • and : 둘 다 True일 때에만 True
  • or : 한 쪽이라도 True이면 True
  • not : True이면 False, False이면 True
>>> print(True)
True
>>> print(False)
False

>>> print(True and True)
True
>>> print(True and False)
False
>>> print(False and True)
False
>>> print(False and False)
False

>>> print(True or True)
True
>>> print(True or False)
True
>>> print(False or True)
True
>>> print(False or False)
False

>>> print(not False)
True
>>> print(not True)
False
  • 놀이동산의 청룡 열차를 타기 위해서는 키와 나이 제한이 있다고 생각해봅시다.
  • 키가 140cm 이상이면서 나이도 10살 이상이어야 청룡 열차를 탈 수 있다고 합니다.
  • 일단 키도 120cm 이하면서 나이가 8살이면 결과는 어떻게 될까요?
  • 키와 나이 조건 모두 False이기 때문에 결과는 False입니다.
>>> my_height = 120
>>> my_age = 8
>>> print(my_height > 140 and my_age > 10)
False
  • 키가 190cm이면서 나이가 9살이면 어떨까요?
  • 키 조건은 True이지만 나이 조건은 False이므로 결과는 False입니다.
>>> my_height = 190
>>> my_age = 9
>>> print(my_height  > 140 and my_age > 10)
False
  • 키가 150cm이면서 나이가 32살이면 어떨까요?
  • 키와 나이 조건 모두 True이므로 결과는 True입니다.
>>> my_height = 150
>>> my_age = 32
>>> print(my_height > 140 and my_age > 10)
True

13.6 멤버쉽

  • 리스트, 튜플 등의 안에 해당하는 값이 있는 지 확인합니다.
  • in, not in 키워드를 사용합니다.
>>> fruits = ['사과', '딸기', '망고', '브로콜리', '바나나']
>>> print(fruits)
['사과', '딸기', '망고', '브로콜리', '바나나']
>>> print('딸기' in fruits)
True
>>> print('딸기' not in fruits)
False
>>> print('상추' in fruits)
False
>>> print('상추' not in fruits)
True

14 조건문

14.1 if

if 조건:
    실행할 명령1
    실행할 명령2
    ...
  • 조건이 참인지 거짓인지 판단합니다.
  • 조건에 따라 처리의 흐름을 바꿉니다.
  • if 키워드를 사용합니다.
    • 참일 경우 코드블럭을 실행합니다.
    • 거짓일 경우 코드블럭을 넘어갑니다.
name = 'Edwin'
if name == 'Edwin':
    print('당신이 Edwin이군요.')
    print('만나서 반가워요 Edwin.')

당신이 Edwin이군요.
만나서 반가워요 Edwin

14.2 else, elif

if 조건:
    실행할 명령1
    실행할 명령2
else:
    실행할 명령3
    실행할 명령4
  • if와 함께 사용할 수 있는 친구들입니다.
  • else: 이전의 if나 elif가 모두 거짓일 경우 else로 넘어갑니다.
name = 'Bob'
if name == 'Alice':
    print('당신이 Ailce이군요.')
else:
    print('아니 당신은!?')

아니 당신은!?
  • elif : 이전의 if나 elif가 거짓일 경우 elif의 조건문으로 넘어갑니다.
if 조건:
    실행할 명령1
    실행할 명령2
elif 조건:
    실행할 명령3
    실행할 명령4
name = 'Bob'
if name == 'Alice':
    print('당신이 Ailce이군요.')
elif name == 'Bob':
    print('당신이 Bob이군요.')
else:
    print('아니 당신은!?')

당신이 Bob이군요.

15 while

15.1 기본구조

while 조건:
	실행할 문장 1
	실행할 문장 2
	...
  • 반복문은 반복되는 지루한 작업을 처리합니다.
  • 코드의 양이 줄어들고 읽기 쉬워집니다.
  • while은 조건을 기준으로 반복합니다.
count = 0
whlie count < 3:
    print('횟수: ', count)
    count += 1

횟수: 0
횟수: 1
횟수: 2

15.2 continue, break

  • continue : 다시 조건으로 돌아갑니다.
  • break : 반복문을 끝내 버립니다.
count = 0
while count < 10:
    count += 1
    if count < 4:
        continue
    if count == 8:
        break

16 딕셔너리

16.1 기본구조

{key1: value1, key2: value2, key3: value3 ...}
  • 딕셔너리를 말 그대로 해석하면 사전입니다.
  • 딕셔너리는 키(key)와 값(value)을 쌍으로 갖는 자료형입니다.
  • 리스트와의 차이점은 관련된 정보를 연관시킨다는 것입니다.
  • 리스트는 값을 다루기 위해 인덱스를 사용하지만 딕셔너리는 키를 사용합니다.
>>> my_dict = {}  # {}
>>> my_dict[1] = 'a'  # {1: 'a'}
>>> my_dict['b'] = 2  # {1: 'a', 'b': 2}
>>> my_dict['c'] = 'd'  # {1: 'a', 'b': 2, 'c': 'd'}

16.2 값 추가하기

  • 딕셔너리는 아래와 같은 방법으로 값을 추가합니다.
>>> my_dict['학생1'] = 'Tom'
>>> print(my_dict)
{'학생1': 'Tom'}
>>> my_dict['학생2'] = 'Sally'
>>> my_dict['학생3'] = 'Betty'
>>> my_dict['학생4'] = 'Angela'
{'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty', '학생4': 'Angela'}

16.3 값 제거하기

  • del을 이용해 키, 값 쌍을 제거합니다.
>>> my_dict = {'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty', '학생4': 'Angela'}
>>> del my_dict['학생4']
>>> print(my_dict)
{'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty'}

16.4 메서드

  • 메서드는 특정 객체만 사용할 수 있는 함수를 말합니다.
  • dict.values(): 딕셔너리에서 값만 뽑아 돌려줍니다.
students = {'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty'}
for student in students.values():
    print(student)

Tom
Sally
Betty
  • dict.keys(): 딕셔너리에서 키만 뽑아 돌려줍니다.
students = {'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty'}
for key in students.keys():
    print(key)

학생1
학생2
학생3
  • dict.items(): 딕셔너리에서 키와 값 쌍을 뽑아 돌려줍니다.
students = {'학생1': 'Tom', '학생2': 'Sally', '학생3': 'Betty'}
for key, val in students.items():
    print(key, val)

학생1 Tom
학생2 Sally
학생3 Betty

17 함수

17.1 기본구조

  • 수학에도 함수가 있고, 엑셀에도 함수가 있습니다.
  • 우리가 사용해왔던 print(), input() 등도 모두 함수입니다.
  • 반복되는 코드에 이름을 붙여서 다시 사용할 수 있게 합니다.
  • 필요할 때 함수의 이름을 불러서 사용할 수 있습니다.
  • 통나무가 마술모자에 들어가면 마술빗자루가 나옵니다.
  • 이와 유사하게 입력 값이 함수에 들어가면 출력 값이 나옵니다.
def 함수이름(인자1, ...):
    실행할 명령1
    실행할 명령2
    ...
    return 결과
  • 함수에게 전달하는 값을 인자 혹은 매개변수라고 합니다.
  • 굳이 따지자면 다른 용어이지만 보통 혼용해서 사용합니다.
  • 함수에게 받아오는 값을 리턴 값, 반환 값, 결과 값이라고 합니다.
  • 마치 내가 함수와 함께 캐치볼을 하는 것과 같습니다.
  • 인자와 결과 값은 있을 수도 있고 없을 수도 있습니다.

17.2 함수의 종류

  • 내장 함수: 파이썬에서 기본으로 제공하는 함수입니다.
  • 모듈의 함수: 모듈에 포함되어 있는 함수입니다.
  • 사용자 정의 함수: 사용자가 직접 정의한 함수입니다.
  • 일반적인 함수
def 함수이름(인자1, ...):
    실행할 명령1
    실행할 명령2
    ...
    return 결과
  • 결과 값이 없는 함수
def sum(a, b): 
     print('%d, %d의 합은 %d입니다.' % (a, b, a+b))
  • 입력 값도, 결과 값도 없는 함수
def say(): 
     print('Hi')

17.3 여러 개 돌려받기

  • 콤마(,)를 사용해서 여러 개의 값을 돌려받을 수 있습니다.
  • 여러 개를 돌려줄 때는 하나의 튜플로 묶어서 전달합니다.
def add_mul(num1, num2):
    return num1 + num2, num1 * num2

my_add, my_mul = add_mul(1, 2)  # 3, 2

17.4 함수를 사용하는 이유

  • 다시 사용할 수 있습니다.
  • 코드를 관리하기 쉬워집니다.
  • 조립해서 사용할 수 있습니다.

18 모듈

18.1 기본구조

  • 비슷한 기능의 함수들을 모아둔 파일입니다.
  • 직접 만들 수도 있고 가져와서 사용할 수도 있습니다.
  • import 키워드로 모듈을 가져옵니다.
  • 마침표(.)를 이용해 함수를 사용합니다.
import 모듈이름
  • 제품을 구매했을 때 배터리가 포함되어 있어 따로 구매할 필요가 없는 경우가 있습니다.
  • 파이썬은 제공하는 라이브러리들이 많아서 구현할 필요 없이 바로 가져다 쓸 수 있습니다.
  • 보통 이런 라이브러리들은 충분히 검증이 되어있기 때문에 직접 만드는 것보다 성능이 좋습니다.

18.2 random

  • 난수를 만들거나 무작위와 관련된 함수를 포함합니다.
  • random.choice(): 리스트의 값 중 하나를 랜덤하게 선택합니다.
>>> import random
>>> students = ['Tom', 'Sally', 'Betty', 'Eric', 'Angela', 'Stephany'] 
>>> print(random.choice(students))
Betty
>>> print(random.choice(students))
Eric
>>> print(random.choice(students))
Tom
  • random.sample(): 리스트의 값 중에서 지정한 개수만큼 랜덤하게 선택합니다.
import random
fruits = ['apple', 'banana', 'lemon']
my_fruit = random.sample(fruits, 2)
print(my_fruit) # ['apple', 'banana'] or ['banana', 'lemon'] or ...
  • random.randint(): 특정 범위의 정수 중 하나를 랜덤하게 선택합니다.
import random
my_int = random.randint(0, 10)
print(my_int)  # 0~10

19 객체

  • 현실의 물건, 물체, 사물을 컴퓨터 안에 재현하는 것입니다.
  • 함수와 데이터를 한꺼번에 묶어둔 것을 말합니다.
  • 파이썬에서는 대부분의 것들이 객체입니다.
  • 통기타 객체
    • 데이터: 이름, 색깔, 종류
    • 함수: 핑거스타일로 연주하기, 스트럼으로 연주하기
  • 게임 속 용사 객체
    • 데이터: 성별, 이름, 레벨
    • 함수: 앞으로 가기, 때리기, 점프 뛰기
  • http://pythontutor.com/

20 코딩 스타일

20.1 PEP8

  • 코드를 작성하다 보면 나보다 다른 사람들이 보는 경우가 더 많습니다.
  • 일관된 기준을 가지고 코드를 작성하면 다른 사람들과의 협업에 도움이 됩니다.
  • PEP8은 파이썬 제작자인 귀도 반 로썸이 제안하는 코딩 스타일 가이드입니다.
  • 코드를 일관성 있게 작성할 수 있게 하는 기준이자 약속입니다.
  • 하지만 무리하게 일관성을 지키는 것은 별로 현명한 행동이 아닙니다.

21 구글링 방법

  • 프로그래밍을 하다 보면 검색을 해야 할 경우가 많습니다.
  • 구글링이란 필요한 정보를 구글에서 검색하는 것을 말합니다.
  • 영어로 된 자료가 훨씬 많지만 입문자는 한국어 자료로도 충분합니다.
  • 구글링으로 모듈을 검색해 오늘 날짜를 구하는 코드를 작성해보세요.
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2017, 9, 20, 22, 48, 1, 48263)
>>> print(datetime.datetime.now())
2017-09-20 22:48:19.225368

22 강의 외 내용

22.1 파이썬이란?

1989년 12월 귀도 반 로섬은 크리스마스 이브를 의미 있게 보내기 위해 취미로 인터프리터 언어를 만들기로 결심하였다. 그는 ABC 라는 프로그래밍 언어를 주로 사용하였는데 ABC 프로그래밍 언어의 장점은 그대로 살리고 단점은 제거 함을 시작으로 1990년 파이썬이 만들어졌다. 파이썬은 우리나라를 비롯한 동아시아 지역에서는 아직 대중적으로 사용되지 않지만 서양에서는 교육을 비롯해 많은 곳에서 사용되고 있다. 파이썬은 구글이 애용하는 언어 중 하나로 컴퓨터에서 쉽게 사용될 수 있는 언어이다. 파이썬은 다른 언어들에 비해서 쉽고 배우기도 편해서 요즈음 핫한 언어로 떠오르고 있다. 하지만 파이썬은 다른 언어에 비해 실행 속도가 빠른 앱을 만들기 어렵고 복잡한 명령어는 수행하기 어려워 빠른 속도가 필요한 앱에는 사용되지 않고 있다. 그래도 파이썬을 먼저 배우면 다른 언어를 배우기 쉬운 만큼 지금 먼저 같이 배우기를 추천한다.(프로그래밍 경험이 없는 사람도 같이 즐길 수 있다!)

22.2 귀도 반 로섬은 누구인가?

귀도 반 로섬 (Guiido van Rossum)은 네덜란드 출신의 컴퓨터 프로그래머이며, 프로그래밍 언어인 파이썬을 개발했다. 로섬은 2005년부터 2012년까지 구글에서 일했으며, 2013년부터 구글에서 퇴사해 현재까지 드롭박스에서 일하고 있다. 귀도 반 로섬은 Stichting Mathematisch Centrum (CWI)에서 일하면서 1986년에 BSD Unix에 glob () 루틴을 작성하고 기고했다. 또한 로섬은 ABC 프로그래밍 언어의 개발에 참여했으며, 나중에 a,b,c언어는 파이썬을 제작할 때 쓰였다.

22.3 이 책을 읽는 방법

요즈음 시대는 단순히 암기하는 시대가 아니다. 이러한 명령문이 있다는 것을 알고 다시 활용하거나 구글에 검색할 수 있게 되면 이 강의는 많은 도움이 될 것이다. 그래서 모든 내용을 외우려 하지 마시고 편안한 마음으로 봐주시면 좋겠다. 왜 구글으로 검색해야 하나? 구글은 네이버보다 코딩 관련 자료가 훨씬 많다. 구글에는 다양한 문제 예시와 강의들이 있어 검색하기 편하다.

22.4 삼항연산자

  • if문을 이용해 변수의 값을 선택할 때, 보통 우리는 이렇게 한다
  • a, b 두 값중 더 큰 값을 넣을 때
>>> a, b = 1, 2
>>> if a > b:
... 	print(a, end="")
... else:
... 	print(b, end="")
2
# 더 큰 값을 출력하는 if-else문이다.
  • 하지만, 우리가 코딩을 하다 보면, 이렇게 긴 문장을 쓰면 근처에 있는 방대한 양의 if문과 겹쳐저, 잘 안 보일 수도 있고,
  • 어쨌든! 삼항연산자라는것은 if-else문을 한 줄로 줄인 것이다.
>>> a, b = 1, 2
>>> print(a if a > b else b)
2
  • 아니!? 무려 2가 출력되었다!
  • "값1 if 조건 else 값2" 는 '조건'이 True일 때는 값1을 출력하고, False일 때에는 값2를 출력한다.

22.5 예외 처리

try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

a = [1, 2, 3, 4]
b = [0, 'a', 1, 2]
i = 0

while i < len(a):
   try:
      print a[i] / b[i]
   except TypeError:
      print "분모는 숫자여야 합니다."
   except ZeroDivisionError:
      print "0 으로는 나눌 수 없습니다."
   i = i + 1

0으로는 나눌  없습니다.
분모는 숫자여야 합니다.
3
2

22.6 랜덤

  • 많이 쓰이는 함수에는 이런 것들이 있다.
    • random.random()
      • 0에서 1까지의 실수를 출력하는 함수.
    • random.randint(a, b)
      • a에서 b까지의 정수를 출력하는 함수.
    • random.shuffle(list)
      • list를 섞는 함수.
    • random.choice(list)
      • list에서 아무거나 하나를 선택한다.
>>> import random
>>> print(random.random())
0.20928967330889192
>>> print(random.randint(0, 100))
47
>>> my_list = [i * 2 for i in range(9)]
>>> random.shuffle(my_list)
>>> print(my_list)
[10, 8, 0, 14, 4, 6, 2, 12, 16]
>>> print(random.choice(my_list))
4
  • 으아니?! 여기는 이렇게 나오지만, 당신은 이렇게 나오지 않았을지도 모른다.
  • 이렇게, 예시에서의 출력과 자신의 출력이 다른 이유는, random이란, 난수를 출력하는 함수이기 때문이다.

23 무편집영상

  • 1주차
  • 2주차
  • 3주차
  • 4주차

24 기타 사이트

25 문서 정보

미운코딩새끼

  • 제 1판 1쇄 펴낸 날 2017년 9월 7일
  • 지은이 : 김왼손과 집단지성들
  • 펴낸곳 : 왼손코딩 유튜브 (https://goo.gl/xHi84G)
  • 제작기간 : 2017년 9월 7일~
  • 이 문서가 만들어지는데 큰 도움을 주신 조희진님, 훌륭한 강의를 해주신 김왼손님께 감사합니다. -제작자 일동-