공부/AIFFEL

FUNDAMENTAL 13. 파이썬 잘 하는 척 해보자

dong_dong_2 2021. 1. 27. 20:35

1. 파이썬 어디까지 써 봤니?
    - 퍼포먼스(성능)란 어떤 언어든 코드를 짜서 실행을 시켰을 때 얼마나 빨리 처리가 되는가를 말함.
    - 생산성이란 똑같은 기능을 하는 프로그램을 얼마나 빨리 작성할 수 있는가를 말함
    - 퍼포먼스 vs 생산성 : 퍼포먼스와 생산성 간의 trade-off가 상당하다.
    - 목적과 상황에 맞게 퍼포먼스와 생산성의 중요도를 판단하여 언어를 선택하고 사용하면 된다.
    - 파이썬의 성능 : 높은 생산성, 코드의 간결함, 빠른 개발 속도, 스크립트 언어
2. 파이썬을 더 잘 사용해보자 (1) for문 잘 사용하기
    - enumerate : 리스트, 문자열, 튜플 등이 있는 경우 순서와 리스트의 값을 함께 반환해주는 기능을 한다.
    - 이중 for문 : for안의 for를 쓰는 것을 말함. 삼중, 사중 for문도 있을 수 있지만 효율적인 코드가 아니다.
    - range(start, stop, step)
    - 리스트 컴프리헨션 : 리스트 등 순회형 컨테이너 객체로부터 이를 가공한 새로운 리스트를 생성하는 간결하고 편리한 방법
       ex) result_list = [(i, j) for i in range(2) for j in ["a", "b", "c", "d"]]
    - 제너레이터 : 길이가 긴 리스트를 전부 메모리에 올려놓고 처리할 필요없이 현재 처리해야 할 데이터를 1개씩 로드해서 사용할 수 있게 해준다. 이는 빅데이터를 처리해야 할 머신러닝 상황에서 매우 좋다.
3. 파이썬을 더 잘 사용해보자 (2) Try - Except 예외 처리하기
    - try 이하의 코드가 먼저 실행되고, 코드상 에러가 발생하면 except 안에 있는 코드가 실행된다. 코드상 에러가 발생하지 않는다면 코드는 정상적으로 작동된다.
    - 즉, 우리는 에러를 파악하기 위해 재작업을 하는 등 행위를 할 필요가 없고, 에러 발생 상황을 다룰 수 있게 된다.
4. 파이썬을 더 잘 사용해보자 (3) Multiprocessing
    - 컴퓨터가 작업을 처리하는 속도를 높여주는 방법 중 하나이다.
    - 우리가 짠 코드는 대부분 순차 처리(serial processing)이지만 병렬 처리(parallel processing)로 해줄 수 있다.

       1) import multiprocessing : 패키지 불러오기

       2) multiprocessing.Pool(processes) : 병렬 처리 시 몇개의 프로세스를 사용할 것인지

       3) multiprocessing.Pool.map(function, list) : 병렬화 시키는 함수에 list의 원소들을 하나씩 넣어 놓음

       4) multiprocessing.Pool.close : 일반적으로 병렬화 부분이 끝나면 나온다. 더이상 새로운 작업을 추가하지 않을 때 사용한다.

       5) multiprocessing.Pool.join : 프로세스가 종료될 때까지 대기하도록 지시하는 구문, 병렬처리 작업이 끝날 때까지 기다리도록 한다.

5. 같은 코드 두 번 짜지 말자 (1) 함수 사용하기
    - 함수에는 입력(정의역), 수식, 결과(치역)이 필요하다.
    - def 함수명(입력받을 객체) : 함수 작동 코드 return 반환 받을 객체
    - 함수를 잘 만들어 놓으면 
       1) 코드의 효율성을 높여주고
       2) 코드의 재사용성을 높여줘서 개발 시간을 줄일 수 있고
       3) 코드의 가독성이 좋아진다.
6. 같은 코드 두 번 짜지 말자 (2) 함수 사용 팁
    - pass : 기타 제어 흐름 도구이다. 하는 일은 아무것도 하지 않는 일이다.
    - 함수에 함수 사용 : 함수 안에 함수를 만들어서 사용할 수 있다.
    - 함수 안의 함수 : 함수 안의 함수를 만들 경우 가장 밖에 있는 def가 만든 울타리에서만 사용이 가능하다. 
    - 2개 이상의 return : return 받을 객체를 하나의 변수에 묶거나, return x, y 처럼 ,를 이용하여 각각 반환할 수 있다.
7. 같은 코드 두 번 짜지 말자 (3) 람다 표현식
    - 람다는 런타임에 생성해서 사용할 수 있는 익명 함수이다. 쉽게 말하면, 함수 이름이 없는 함수(일회성 함수)라고 생각하면 된다.
    - ex) print((lambda x, y: x + y)(10, 20))
    - 람다 표현식을 사용하는 가장 중요한 이유는 함수의 인수 부분을 간단히 하기 위함이다. 

    - 대표적인 예로 map(), filter(), reduce() 등 람다 표현식과 자주 쓰이는 함수가 많이 있다.
8. 같은 코드 두 번 짜지 말자 (4) 클래스, 모듈, 패키지
    - 클래스(Class) : 비슷한 역할을 하는 함수들의 집합이라 보면 된다.
    - 모듈(Module) : 함수, 변수, 클래스를 모아 놓은 파일을 말한다. 즉, 코드의 저장소라 볼 수 있다. 이미 만들어진 모듈을 가져와 쓸 수 있고, 직접 모듈을 만들어 사용할 수 있다.
    - 패키지(Package) : 여러 모듈을 하나로 모아둔 폴더라고 할 수 있다. pip 명령어로 거의 모두 설치할 수 있다.
9. 프로그래밍 패러다임과 함수형 프로그래밍
    - 패러다임(Paradigm) : 어떤 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리를 말함. 인식의 체계 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다.
    - 프로그래밍 패러다임 : 프로그래머에게 프로그래밍의 관점을 갖게 해 주고, 결장하는 역할을 한다. 프로그래밍 언어들은 각자 패러다임을 가지고 있다.
    - 데이터 사이언스를 공부하는 입장에서 적합한 패러다임은 함수형 프로그래밍이다.
    - 절차 지향 프로그래밍
       1) 일이 진행되는 순서대로 프로그래밍하는 방법
       2) 순차적으로 작성되어 순서대로 읽기만 하면 이해가 가능하단 장점이 있다.
       3) 순차적으로 작성되었기 때문에 위에서 하나가 잘못되면 아래도 연쇄적으로 잘못되어 유지보수가 어렵다는 단점이 있다.
    - 객체 지향 프로그래밍
       1) 개발자가 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 한다.
       2) 객체 지향 프로그래밍은 객체를 먼저 작성하고 함수를 작성한다. 객체 간의 상호작용을 한다.
       3) 장점은 코드의 재사용이 쉽고, 코드 분석이 쉬우며 아키텍처로 바꾸기 쉽다. 
       4) 단점은 객체 간의 상호작용이 있기 때문에 설계에 많은 시간이 소요되고 설계가 잘못되면 전체적으로 바꿔야 한다.
    - 파이썬은 객체지향 프로그래밍(OOP : Object Oriented Programming) 패러다임을 기본적으로 지원하고 있다.
    - 함수형 프로그래밍
       1) 효율성, 버그없는 코드, 병렬 프로그래밍과 같은 장점이 있다.
       2) 함수형 프로그래밍은 함수로 문제를 분해한다.
       3) 함수형 프로그래밍이 데이터 사이언티스트에게 적합한 프로그래밍 패러다임이라 하는 이유는 순수성, 모듈성, 디버깅과 테스트 용이성 때문이다.
10. 파이써닉하게 코드를 짜보자
    - 파이썬의 어떤 점이 가장 좋은지를 묻는다면 아마 뛰어난 가독성이 좋다고 할 것이다.
    - 파이썬 코드가 쉽게 읽히고 잘 이해되는 이유는 비교적 완벽한 코드 스타일 가이드라인과 파이썬스러운 코드 작성법 때문이다.
    - 파이썬은 pep8이라는 코드 스타일 가이드가 있다. 이 스타일은 유지보수 측면에서 빠른 코드 이해로 개발 기간이 줄고 가독성 측면에서도 도움이 된다.
       1) 한 줄의 코드 길이가 79자 이하여야 한다.
       2) 함수와 클래스는 다른 코드와 빈 줄 두개로 구분한다.
       3) 클래스에서 함수는 빈 줄 하나로 구분한다.
       4) 변수 할당 앞뒤에 스페이스를 하나만 사용한다.
       5) 리스트 인덱스, 함수 호출에는 스페이스를 사용하지 않는다.
       6) 쉼표(,), 쌍점(:), 쌍반점(;) 앞에서는 스페이스를 사용하지 않는다.
       7) 주석 : 코드의 내용과 일치하지 않는 주석은 피하고, 불필요한 주석은 피한다.
       8) 변수명 앞에 _(밑줄)이 붙으면 함수 등의 내부에서만 사용되는 변수를 말한다.
       9) 변수명 뒤에 _(밑줄)이 붙으면 라이브러리 혹은 파이썬 기본 키워드와의 충돌을 피하고 싶을 때 사용한다.
       10) 소문자 L, 대문자  O, 대문자 I를 가능하면 사용하지 않는다. 특정 폰트에서는 가독성이 매우 안 좋다.
       11) 모듈명은 짧은 소문자로 구성되며, 필요하다면 밑줄로 나눈다.
       12) 클래스 명은 파스칼 케이스(PascalCase) 컨벤션으로 작성한다. (네이밍 컨벤션은 뒤에서 설명하겠음)
       13) 함수명은 소문자로 구성하되 필요하면 밑줄로 나눈다.
       14) 상수는 모듈 단위에서만 정의하며 모두 대문자에 필요하다면 밑줄로 나눈다.
    - 네이밍 컨벤션(Naming convention)
       1) snake_case : 모든 공백을 "_"로 바꾸고 모든 단어를 소문자로 쓴다. 함수, 변수 등을 명명할 때 사용한다.
       2) PascalCase : 모든 단어가 대문자로 시작한다. UpperCamelCase, CapWords라고 불리기도 한다. 클래스를 명명할 때 사용한다.
       3) camelCase : 처음은 소문자로 시작하고 이후의 모든 단어의 첫 글자는 대문자로 한다. lowerCamelCase라고 불리기도 한다. 파이썬에서는 거의 사용하지 않는다. (java 등에서 사용)