Skip to content

Latest commit

 

History

History
260 lines (231 loc) · 7.56 KB

2021.07.05.md

File metadata and controls

260 lines (231 loc) · 7.56 KB

📝 오늘 배운 내용

파이썬의 성능

  1. 높은 생산성
    다양한 모듈을 라이브러리화 하고있고, pip를 이용해서 쉽게 설치하고 이용할 수 있다.
  2. 코드의 간결함
  3. 빠른 개발 속도
  4. 스크립트 언어
    실시간으로 코드가 실행이 된다.

파이썬 활용 문법

for문

  • 실행시간 측정
import time
start= time.time() # 시작 시간 저장
# 동작
print(time.time()-start)
  • enumerate() : iterator의 인덱스와 해당 값을 동시에 가져온다,
a = ['a','b','c','d']
for index, value in enumerate(a):
    print(f'{index} : {value}')
  • 이중 for문 : 2개 이상으로 for문을 중첩할 수 있지만 오히려 성능이 떨어지기 때문에 2개까지가 적당하다.
for i in range(2):
    for j in range(5):
        print(f'{i} : {j}')
  • 리스트 컴프리헨션 : 리스트를 생성하는 간결한 방법. 리스트, 튜플, 셋, 딕셔너리에도 적용 가능
my_list = [[1, 2], [3, 4], [5, 6]]
result_list = [value for i in my_list for value in i]
print(result_list)
  • 제너레이터 : yield를 이용해 iterator를 생성하는 함수.
def makeiterator():
    for i in range(10):
        yield i
        print('generator call')

for i in makeiterator():
    print(i)

""" 결과
0
generator call
1
generator call
2
generator call
3
generator call
4
generator call
5
generator call
6
generator call
7
generator call
8
generator call
9
generator call
"""

Try-Except

예외를 처리하기 위한 방법.
try 안 코드에서 에러(Exception)이 발생했을 때 except로 이동.

try:
    pass
except:
    print('error')

❗️try/except/else/finally
image https://gomguard.tistory.com/122

Multiprocessing

여러 작업을 동시에 처리하는 것

import multiprocessing # import 선언

def sqrt_(base, power=10):
    result = base
    for i in range(power):
        result *= result
    print(f'base: {base}, power: {power}, result: {result}')

src = [3, 5, 7]

if __name__ == '__main__': # 코드 시작점을 여기로 하라는 명령어
    pool = multiprocessing.Pool(processes=3) # 병렬 처리 할 프로세스 개수 설정
    pool.map(sqrt_, src) # 병렬화 함수와 값 설정
    pool.close() # 병렬화 끝나고 더이상 새로운 작업 추가하지 않을 때 사용
    pool.join() # 프로세스 종료될때까지 대기 

함수

반복적으로 해야하는 일을 하나의 함수로 만들어 실행하면 코드의 중복도 사라지고, 코드가 읽기 명확해진다.

def functing(input_value):
    # do something
    return output_value
  • pass : 아무 동작도 하지 않는 다는 의미. 함수를 만들어놓고 내부 구현은 미룰 떄 사용.
def empty():
    pass
  • 함수에 함수 사용 : 함수를 인자로 넘겨 함수 안에서 함수를 실행할 수 있다.
def say_hello(function, count):
    for i in range(count):
        print(function)


def get_name(name):
    return name


say_hello(get_name('hyelim'), 2)
# result : hyelim
#          hyelim
  • 함수 안의 함수 : 함수 안에서만 사용할 수 있는 함수
def min_max_sum(iterator):
    def find_min(src):
        src.sort()
        return src[0]

    def find_max(src):
        src.sort(reverse=True)
        return src[0]

    return sum([find_min(iterator), find_max(iterator)])


print(min_max_sum([10, 20, 30, 40]))

위 코드에서 find_minfind_maxdef안에서만 동작한다.

  • 여라 변수로 반환하기 ,를 이용해 여러개의 값을 반환할 수 있다.
def get_min_max(iterator):
    def find_min(src):
        src.sort()
        return src[0]

    def find_max(src):
        src.sort(reverse=True)
        return src[0]

    return find_min(iterator), find_max(iterator)


min_value, max_value = get_min_max([10, 20, 30, 40])
print(min_value, max_value)
  • 람다 표현식 : 런타임에 생성해 사용할 수 있는 이름 없는 함수
(lambda parameter : return)(args)
print((lambda x,y:x+y)(10,20))

이런 방식으로 사용하는 대표적인 예가 map

map(function, iterator)
result = map((lambda x: x**2), [10,20,30])

다른 예

  • reduce() : 원소들을 누적으로 함수에 적용
from functools import reduce
print(reduce(lambda x, y: x+y, [0, 1, 2, 3, 4]))
# 0+1+2+3+4
  • filter() : 원소들을 함수에 적용시켜 결과가 참인 새로운 리스트를 만든다.
print(list(filter(lambda x: x % 2 == 0, range(10))))
# [0, 2, 4, 6, 8]

클래스, 모듈, 패키지

클래스 : 비슷한 역할을 하는 함수의 집합

모듈: 함수, 클래스, 변수를 모아놓은 파일

import 모듈이름 as 별칭

패키지 : = 라이브러리. 여러 모듈을 하나로 모은 폴더

  • 설치 방법
pip install 패키지 이름

프로그래밍 패러다임

  • 절차지향 프로그래밍
    진행 순서대로 프로그래밍하는 방법

    • 장점 : 이해가 쉽다.
    • 단점 : 앞 단계에서 잘못되면 아래에도 문제가 생긴다.
  • 객체지향 프로그래밍
    프로그램을 객체로 나눠 상호작용하도록 하는 방법

    • 장점 : 코드 재사용이 쉽다.
    • 단점 : 설계에 많은 시간이 들고, 설계가 잘못되면 전체적으로 바꿔야 한다.
  • 함수프로그래밍 함수로 문제를 분해해 프로그래밍.

    • 특징
      1. 순수성 : 모든 함수의 출력은 입력에만 의존하게 만들어 부작용이 없는 함수를 사용한다. (부작용이 있는 함수 : 보이지 않는 변경사항을 만드는 함수)
      2. 모듈성 : 한가지 작업을 작은 작업을 수행하는 함수로 쪼개어 프로그래밍이 가능하다.
      3. 디버깅과 테스트 용이성 : 각각의 함수가 작고 명확하기 때문에 디버깅이 쉽다. 또 함수는 단위 테스트의 대상이기 때문에 테스트도 쉽다.

    https://docs.python.org/ko/3/howto/functional.html

파이써닉한 코드

pep8이라는 코드 스타일 가이드가 있어 많은 개발자들이 그 스타일에 따라 개발을 하고 있다. 이렇게 스타일이 정해져 있다면 빠른 코드 파악으로 개발 기간이 줄고, 가독성이 좋아진다.
가이드북

  • whitespace
    • 한줄의 코드는 79자 이하여야 한다.
    • 함수와 클래스는 빈줄 두개로 구분한다.
    class A():
        pass
    
    
    class B():
        pass
    
    
    def a():
        pass
    • 클래스 내부에서 함수는 빈 줄 하나로 구분
    class A():
    
        def a():
            pass
    
        def b():
            pass
    • 변수 할당 앞뒤에 스페이스 하나만 사용 x = 1
    • 인덱스, 함수 호출에는 스페이스 사용하지 않음.
    • ,, :, ; 앞에는 스페이스 사용하지 않음.
  • 이름 규칙
    • _변수명: private한 변수
    • 변수명_: 기본 키워드나 라이브러리와이 충돌을 피하고 싶을 때
    • 모듈은 짧은 소문자
      custom_module.py
    • class MyClass : 클래스 명은 파스칼 케이스
    • def my_function : 함수명은 소문자로 구성하고 띄어쓰기는 _로 나눈다.
    • MY_PI : 상수