자유/대외 활동

패스트캠퍼스 프로그래밍첫걸음 학습후기 ) #12.10주차 학습후기, 파이썬 프로그래밍

Chipmunks 2019. 5. 27.
728x90


패스트캠퍼스 프로그래밍 첫걸음, 열 두 번째 학습 후기


프로그래밍 첫걸음도 곧 있으면 100% 진도다.


이번 진도도 파이썬 진도다.


스피디한 진행이 마음에 들었고


깃허브 문서로 여느 책 못지 않은 자세한 보충 설명으로


비전공자와 전공자 모두 만족시켜주는 강의다.


강의 영상은 대체로 10분이 넘었다.


이론 설명은 짧게 하고 대부분 실습을 진행하며


어떻게 동작하는지 자세히 알려주었다.


직접 따라쳐서 몸으로 익히면서 귀로 자세한 코드 설명을 듣고


시간을 정말 효율적으로 사용한다는게 마음에 들었다.


10주차 진도에서는

  • 06. [PYTHON] 컬렉션(set_tuple)
  • 과제1. 내장 함수로 컬렉션 정렬하기
  • 07. [PYTHON] 문자열 처리
  • 과제2. formatting, split 문자열 메서드 사용하기
  • 08. [PYTHON] 함수
  • 과제3. 정렬 함수 정의 하기
  • 09. [PYTHON] 예외 처리
  • 과제4. 예외 발생 시켜보기
  • 10. [PYTHON] 엑셀 처리
  • 과제5. 엑셀 파일 불러와서 출력하기

프로그래밍 첫걸음 파이썬 5개 강의와

5개 과제를 진행했다.

저번 진도에서 배운 컬렉션을 셋과 튜플로 마무리하고

문자열을 처리를 실습한다.

그리고 파이썬에서 함수를 어떻게 사용하는지

예외란 무엇이고 어떻게 다루는지 빠르게 실습한다.

파이썬 라이브러리로 엑셀 파일을 조작하는 방법을 배운다.

어떤 것들을 배웠는지 자세히 알아보자

06. [PYTHON] 컬렉션(set_tuple)

저번 시간에 리스트딕셔너리를 배웠다.

이번 시간에 다른 컬렉션인 튜플을 배운다.

튜플(Tuple)불변 타입(Immutable type)으로 새로운 요소의 추가, 삭제가 불가능하다.

1
2
3
4
num_tuple = (123)
# num_tuple[0] = 0 # TypeError
# del num_tuple[0] # TypeError
print(num_tuple) # (1, 2, 3)
cs

셋(Set) 중복이 없는 집합으로 순서를 갖지 않는다. 따라서 인덱싱, 슬라이싱 기능이 불가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
num_set = {112233}
num_set.add(4)
print(num_set) # {1 2 3 4}
 
set1 = {1234}
set2 = {123}
 
print(set1 & set2) # 교집합 {1, 2, 3}
print(set1 | set2) # 합집합 {1, 2, 3, 4}
print(set1 - set2) # 차집합 {4}
 
test_list = [123]
sub_list = [12]
print(test_list + sub_list) # [1, 2, 3, 1, 2]
print(test_list * 2# [1, 2, 3, 1, 2, 3]
 
test_list2 = [123123]
test_set = set(test_list2)
print(test_set) # {1, 2, 3}s
# list(), dict(), set(), tuple()
 
# print(test_set[0]) # TypeError not support indexing
cs

셋은 집합 연산을 할 수 있다. 학창시절에 배운 교집합, 합집합, 차집합 개념을 볼 수 있다.

두 집합의 공통 요소만 뽑는 교집합, 두 집합의 모든 요소를 뽑는 합집합,

한 집합에서 다른 집합의 요소들을 빼는 차집합이다.

리스트 컬렉션에서 중복을 없애려면

set() 생성자로 셋을 만들어 중복을 모두 제거할 수 있다.

많이 활용되는 방법이라고 한다.

다른 컬렉션 생성자로 list(), dict(), tuple() 이 있다.

[ QUIZ ]

1. '튜플(Tuple)'은 한 번 값이 정해지면 수정할 수 없는 불변 타입이다.
2. '셋(Set)'은 중복이 없는 요소로만 이루어지며 순서가 없다.
3. 컬렉션 자료형의 '생성자'를 통해 서로 다른 컬렉션으로 치환한다.

과제1. 내장 함수로 컬렉션 정렬하기

주어진 문서를 참고해 컬렉션의 내장 함수를 알아보는 것이 과제다.

자세한 컬렉션 설명이 있다.

1
2
3
4
5
6
7
8
9
10
num_set = {11223}
print(num_set) # {1, 2, 3}
str_set1 = {'abcabc'}
print(str_set1) # {'abcabc'}
str_set2 = set('abcabc')
print(str_set2) # {a, c, b}
hangul1 = {'안녕안녕ㅎㅎ'}
print(hangul1) # {'안녕안녕ㅎㅎ'}
hangul2 = set('안녕안녕ㅎㅎ')
print(hangul2) # {'ㅎ', '녕', '안'}
cs

셋 객체에 문자열을 넣을 때, 생성자에 넣을 때와 초기화를 해줄 때의 차이점을 일러 준다.

생성자에 넣을 때는 해당 문자열 안에 중복된 값을 제거하여 값을 반환한다.

그러나 { } 으로 초기화를 해줄 때는 기본 문자열 그 자체로 반환된다. 

아래는 셋 객체에 있는 메소드들이다.


실습할 때 봤던 메소드들도 있다. 여기서 집합 연산 메소드는 따로 연산자로 대신할 수 있다.


앞서 봤던 교집합, 합집합, 차집합 등이 그 예다.


1
2
3
4
5
6
= {123}
= {124}
print(a & b) # 1, 2 교집합
print(a | b) # 1, 2, 3, 4 합집합
print(a - b) # 3 차집합
print(a ^ b) # 3, 4 대칭차집합
cs


실습에서 보지 못한 연산은 대칭차집합 연산이다. 대칭차집합은 두 집합에서 공통 부분을 뺀 모든 요소들을 반환한다.


파이썬에서는 어떻게 연산자로 메소드로 대체할 수 있는 것인가? 라는 의문이 들었다.


찾아보니 연산자 오버로딩(Operator Overloading) 개념이 있기 때문이다.


그 전에 오버라이딩과 오버로딩의 차이점을 알아보자.


오버라이딩은 어떤 클래스를 상속할 때 그 클래스에 있는 메소드들을 자식 클래스가 입맛에 맞게 변경한다는 것을 의미한다.


오버로딩은 같은 이름을 가지고 중복해서 여러가지 매개 변수들을 받을 수 있게 해주는 것을 의미한다.


연산자 오버로딩은 연산자 기능을 중복으로 정의해서 설계자가 원하는 행위를 해주게 한다.


클래스 메소드에 파이썬이 정해놓은 특수한 메소드로 연산자 오버로딩을 가능케 해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__matmul__(self, other)
object.__truediv__(self, other)
object.__floordiv__(self, other)¶
object.__mod__(self, other)
object.__divmod__(self, other)
object.__pow__(self, other[, modulo])
object.__lshift__(self, other)
object.__rshift__(self, other)
object.__and__(self, other)
object.__xor__(self, other)
object.__or__(self, other)
cs

의 메소드로 연산자 오버로딩을 만들 수 있다.

자세한 사항은 파이썬 공식 문서를 참고하자!

셋 컬렉션 또한 Set Comprehension 을 지원한다.

1
2
= {x for x in 'abcdef' if x not in 'abc'}
print(a) # {'d', 'e', 'f'}
cs

다음은 튜플과 관련한 예제다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1번 코드
rainbow = 'red''orange''yellow''green''blue''indigo''violet',
# 2번 코드
rainbow[0= 'black' # TypeError 에러 발생!
# 3번 코드
tup = (rainbow, [12345])
print(tup) # (('red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'), [1, 2, 3, 4, 5])
numbers = tup[1]
numbers[0= 0 # 에러 없음
# 4번 코드
int1 = (1)
print(int1) # 1
# 5번 코드  
tuple1 = (1,) # 같은 표현: tuple1 = 1, 
print(tuple1) # (1,)
cs

튜플은 값을 변경하지 못하는 불변 타입인 것을 실습한다.

5번 코드에서 1 요소 하나만 있는 튜플을 만들기 위해서 (1,) 으로 만들어줘야 한다.

(1) 은 숫자 하나에 소괄호를 붙여 튜플이 아니라 숫자형이 된다.

튜플은 여러 요소를 하나로 묶을 수도 있고 묶은 요소들을 순서대로 꺼낼 수 있다.

이를 패킹(Packing)과 언패킹(Unpacking) 이라고 한다.

1
2
3
4
5
rainbow = 'red''orange''yellow''green''blue''indigo''violet' # Packing
tup = (rainbow, [12345]) # Packing
r, l = tup # Unpacking
 
print(r[0], l[0]) # red 1
cs

언패킹을 하기 위해서는 할당할 변수의 수가 튜플 요소의 수와 일치해야 한다. 그렇지 않다면 ValueError 예외가 발생한다.

만약 할당이 필요 없다면 언더바(_) 으로 받지 않을 수 있다.

언더바(_)로 프로그래머의 의도를 정확히 알려주고 파이썬은 정확히 그 의도에 맞게 프로그래머에게 전달한다.

다음은 셋과 튜플 생성자로 만들어보는 코드다.

1
2
3
4
5
6
7
numbers = [11223]
# 1번 코드
no_dup_numbers = list(set(numbers))  
print(no_dup_numbers) # [1, 2, 3]
 
tuple_numbers = tuple(numbers)
print(tuple_numbers) # (1, 1, 2, 2, 3)
cs

앞서 강의에서 실습했듯이

리스트에서 중복을 제거하고 싶다면

set() 생성자로 중복을 모두 제거한 뒤에

다시 list() 생성자에 넣어 리스트 컬렉션으로 만든다.

다음은 내장함수로 컬렉션을 정렬해보는 코드다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
numbers = [15432]
numbers = sorted(numbers)
print(numbers) # [1, 2, 3, 4, 5]
 
numbers = sorted(numbers, reverse=True)
print(numbers) # [5, 4, 3, 2, 1]
 
def double(x):
    return x * 2
 
numbers = [12345]
numbers = list(map(double, numbers))
print(numbers) # [2, 4, 6, 8, 10]
 
def grater_than_2(x):
    return x > 2
 
numbers = [12345]
numbers = list(filter(grater_than_2, numbers))
print(numbers) # [3, 4, 5]
 
numbers = [12345]
double = list(map(lambda x:x * 2, numbers))
grater_than_2 = list(filter(lambda x:x>2, numbers))
print(double) # [2, 4, 6, 8, 10]
print(grater_than_2) # [3, 4, 5][3, 4, 5]
cs

첫 번째로 sorted(iterable, key=None, reverse=False)

메소드는 기본적으로 오름차순으로 컬렉션 값들을 정렬하여 반환한다.

그러나 컬렉션 내부의 sort(), reverse() 메소드는 반환이 없고 내부적으로 정렬이 이루어진다.

두 번째로 map(function, iterable)

메소드는 컬렉션의 각 요소들이 함수를 거쳐 나온 결괏값들을 반환한다.

map 메소드의 반환값은 map 객체의 주소이기 때문에 list 생성자로 리스트 형태로 만들어줘야 한다.

세 번째로 filter(function, iterable)

메소드는 컬렉션의 각 요소들이 함수를 거쳐 True 로 반환된 요소들만 반환한다.

filter 메소드 또한 list 생성자로 리스트 형으로 다시 만든다.

마지막으로 lambda 표현식을 이용한다.

자바스크립트에서 이름이 없는 익명 함수(Anonymous Function)를 실습했다.

파이썬도 마찬가지로 lambda 키워드로 이름이 없는 함수를 정의할 수 있다.

함수 내부 코드가 짧고 재사용할 일이 많이 없다면  lambda 키워드로 매개 변수에 집어 넣는 것이 효율적이다.

07. [PYTHON] 문자열 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
test1 = "Life is too short, %s"
result1 = test1 % "You need python."
print(result1)
 
test2 = "Life is too short, %s %s %s"
result2 = test2 % ("You""need""python.")
print(result2)
 
test3 = "Life is too short, %.2f"
result3 = test3 % 100
print(result3)
 
test4 = "Life is too short, {} {} {}"
result4 = test4.format("You""need""python.")
print(result4)
 
test4 = "Life is too short, {} {} {}"
result4 = test4.format("You""need""python.")
print(result4)
 
test5 = "Life is too short, {} {} {}"
result5 = test5.format("You""need"10)
print(result5)
cs

이번 실습은 문자열을 포맷팅 해보는 실습이다.

문자열 안에 자료형에 따라 지시어를 집어 넣고 % 연산으로 차례대로 해당 지시어에 값을 넣을 수 있다.

지시어의 종류는 다음과 같다.



문자열 객체에 있는 format 메소드를 이용할 때는 별다른 지시어를 쓰지 않아도 된다.


마지막으로 이스케이프 문자를 배운다.


이스케이프 문자는 문자열을 만들 때 고유한 의미를 갖는 문자를 뜻한다.


문자열 안에 넣기에 문법적으로 맞지 않는 것들도 포함된다.


이스케이프 문자의 종류는 다음과 같다.



 [ QUIZ ]


1. '포맷팅'은 문자열을 원하는 스타일로 표현하기 위해서 사용된다.

2. '지시어(%)'를 이용해서 원하는 문자열의 자료형을 표현한다.

3. 'format() 함수'는 문자열 포맷을 지정하기 위한 함수이다.

4. '이스케이프 문자'는 고유한 의미를 갖는 문자이며, 역슬래시가 붙는다.


과제2. formatting, split 문자열 메서드 사용하기

아래 코드를 실습해보는 과제다.

1
2
3
4
5
6
7
8
9
test_string = "My name is Seongjae Moon."
print(test_string.split()) # ['My', 'name', 'is', 'Seongjae', 'Moon.']
 
for i in test_string.split():
    print(i, end = ' '# My name is Seongjae Moon.
 
replace = test_string.replace('Seongjae Moon.''Super Moon!')
for i in replace:
    print(i, end = ''# My name is Super Moon! 

cs


split() 메소드로 특정 문자를 기준으로 문자열을 구분하여 리스트로 반환한다.

replace() 메소드는 문자열 안에 있는 특정 문자를 치환하여 반환한다.

08. [PYTHON] 함수

함수는 특별한 역할을 수행하기 위한 코드 블록이다. 앞서 자바스크립트에서 실습을 해봤다.

파이썬에서의 함수 선언은 다음과 같다.

def 함수명(인자, default=값, *인자, **인자):
    실행코드
    ...
    return 반환값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def sum(x, y, test=1):
    return x + y + test
 
= 1
= 1
 
print(sum(x, y)) # 3
print(sum(x, y, 3)) # 5
 
def sum2(x, *y):
    result = 0
    for i in y:
        result += i
    print(x + result)
 
sum2(112345678910# 56
 
def sum3(one, two):
    return one + two
 
print(sum3(two=1, one=1)) # 2
cs

첫 번째 예는 함수 인자에 기본 값을 설정할 수 있다. 기본 값은 반드시 맨 오른쪽 인자부터 넣어줘야 한다.

두 번째 예는 함수 인자를 가변 인자로 받을 수 있다. 역시 맨 오른쪽 인자여야 한다.

세 번째 예는 인자=값 으로 인자값들을 전달할 수 있다. 이 때 순서에 유의하지 않아도 된다.

[ QUIZ ]

1. 'def'은 함수를 선언하기 위해 사용되는 키워드이다.
2. '기본 인자'은 인자에는 있지만 사용되지 않을 경우 기본 값이다.
3. '가변 인자'은 인자의 값을 특정 지을 수 없을 경우 사용한다.
4. '이름있는 인자'은 인자의 별칭을 붙여서 사용하는 방법이다.

과제3. 정렬 함수 정의 하기

파이썬 함수를 문서로 자세하게 아는 것이 과제다.

파이썬은 모든 것이 객체이다.

함수 또한 함수 객체가 된다.

함수는 1급 객체(First-class Object)라고 한다.

1급 객체는 다음 세 가지를 만족해야 한다.

1. 함수를 변수에 할당할 수 있어야 한다.
2. 함수를 반환 값으로 사용할 수 있어야 한다.
3. 함수를 함수의 인자로 입력할 수 있어야 한다.

아래 코드로 1급 객체의 사용법을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def sum(a, b):
    return a + b
 
= sum
print(s(12)) # 3
 
def sum(a, b):
    return a + b
 
def multiply(a, b):
    return a * b
 
func = [sum, multiply]
print(func[0](11), func[1](22)) # 2, 4
 
# 1번 코드
def sum(a, b):
    return a + b
 
# 2번 코드
def func(a, b):
    return sum(a, b)
 
print(func(11)) # 2
 
# 1번 코드
from time import time
 
# 2번 코드
def run_time(f):
    # 시작 시간
    start = time()
    f 
    print(time() - start) # 종료 시간 - 시작 시간(총 수행 시간)을 계산하여 정수 값으로 출력합니다.
 
# 3번 코드
def sum():
    sum = 0
    while sum < 100:
        sum += 1
        print(sum) # 1 2 3 ... 100
 
# 4번 코드
run_time(sum()) # 0, 코드 실행시간 출력
cs


09. [PYTHON] 예외 처리

예외 처리는 프로그램 오류를 핸들링 하는 방법을 말한다.

예상치 못한 예외 발생 시 취할 행동을 코드로 작성한다.

문법 오류는 인터프리터가 해당 라인을 실행할 때 해석할 수 없다면 발생한다.

반면 예외는 문법 오류는 없지만 실행 중 발생하는 에러다.

파이썬은 예외 처리를 try ~ except ~ finally 문법을 지원한다.


finally 블록은 없어도 된다.


반면 일부로 예외를 발생시킬 수 있다.


raise Exception("예외")


코드로 의도적으로 예외를 발생시킬 수 있다.


1
2
3
4
5
6
7
8
9
10
11
arr = [123]
 
try:
    print(arr[3])
except:
    print("오류!"# 실행
 
test = 10
 
if test == 10:
    raise Exception("test is 10."# Exception: test is 10. 예외 발생
cs

[ QUIZ ]

1. 'try~except 구문'은 예외 처리를 위해 사용한다.
2. 'except 구문'은 예외 발생시 실행할 코드를 작성하는 구문이다.
3. 'finally 구문'은 예외 발생 여부와 상관 없이 무조건 실행하는 구문이다.
4. 'raise 구문'은 사용자가 에러를 생성하기 위해 사용한다.

과제4. 예외 발생 시켜보기

해당 소스 코드를 채우는 과제다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Cat():
    
    def __init__(self, name):
        if not name:
            print("이름이 필요합니다!")
        self.name = name
 
cat = Cat("냥"# 에러가 발생하지 않습니다.
 
try:
    cat = Cat() # TypeError가 발생합니다. 객체 생성시 필요한 인자인 "name"이 없기 때문에 발생합니다.
except:
    print("Type Error가 발생합니다.")
 
cat = Cat(""# 이름이 필요합니다!
cs


10. [PYTHON] 엑셀 처리

openpyxl 라이브러리르 이용하여 엑셀을 다루는 실습이다.

먼저 pip 으로 openpyxl 라이브러리를 설치하자.

pip3 install openpyxl

엑셀(2007) 이상 xlsx 파일에서 동작한다.

openpyxl 의 주요 메소드는 다음과 같다.

1. load_workbook : 저장된 엑셀 파일 불러오기
2. create_sheet : 새로운 시트(sheet) 만들기
3. save : 엑셀파일 저장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from openpyxl import load_workbook as load
 
DIR = 'test.xlsx'
 
wb = load(DIR)
 
ws = wb.create_sheet('test')
ws['A1'= "제목1"
ws['B1'= "제목2"
 
ws['A2'= "10"
ws['B2'= "20"
 
wb.save(DIR)
wb.close()
 
wb = load(DIR)
 
ws = wb['test']
 
a1 = ws['A2'].value
a2 = ws['B2'].value
 
print(a1, a2)
 
wb.close()
cs

아무 엑셀 파일을 만들고 같은 디렉토리 내에 저장시켰다.

load_workbook 함수로 엑셀 파일을 불러온다.

create_sheet 메소드로 새 시트를 만든다.

그리고 셀영역으로 값을 넣을 수도 불러올 수도 있다.

[ QUIZ ]

1. 'openpyxl' 라이브러리를 통해 엑셀 파일 처리를 할 수 있다.
2. 엑셀 파일 처리를 위해 'Cell 단위'로 처리할 수 있다.

과제5. 엑셀 파일 불러와서 출력하기

99단을 엑셀 파일로 저장하고 읽는 실습이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from openpyxl import load_workbook as load
DIR = 'test.xlsx'
 
def save_excel(ws):
    idx = 65
    for i in range(110):
        for j in range(110):
            ws[chr(idx) + str(j)] = "{} x {} = {}".format(i, j, i*j)
        idx += 1
    wb.save(DIR)
 
def get_excel(ws):
    idx = 64
    for i in range(110):
        for j in range(110):
            print(ws[chr(idx + i) + str(j)].value)
        print()
 
wb = load(DIR)
ws = wb.create_sheet('99단')
try:
    save_excel(ws)
    get_excel(ws)
except Exception as e:
    print(e)
finally:
    wb.close()
cs



엑셀 파일과 콘솔 모두 실행이 잘 된다.





10주차 학습을 마무리 했다.


다음 진도는 본격적으로 웹 크롤러를 만들어본다.


웹 크롤러를 다 만들고 나면 파이썬 진도는 마무리 된다.


이후에 개발자 커리어 조언까지 준비되어 있으니


정말 알찬 강의 아닌가?


패스트캠퍼스 프로그래밍 첫 걸음 강의 정말 가성비 최고인 강의다!








댓글