[LMS] 8. 파이썬 잘하는 척

송아람·2022년 1월 9일
0

LMS

목록 보기
3/3

8-3. for문 잘 사용하기

1) enumerate()

  • 순서와 리스트의 값을 함께 반환해주는 기능

기본 for문 사용

my_list = ['a', 'b', 'c', 'd']

for i in my_list:
    print("값 :", i)

[out]: a
값 : b
값 : c
값 : d

enumerate() 사용

my_list = ['a', 'b', 'c', 'd']

for i, value in enumerate(my_list):
    print("순번 :", i, "값 : ", value)

[out]
순번 : 0:  a
순번 : 1:  b
순번 : 2:  c
순번 : 3:  d

2) 이중 for문

my_list = ['a', 'b', 'c', 'd']
result_list = []

#이중 for문
for i in range(2):
    for j in my_list: 
        result_list.append((i, j))
        
print(result_list)

[out] [(0, 'a'), (0, 'b'), (0, 'c'), (0, 'd'), (1, 'a'), (1, 'b'), (1, 'c'), (1, 'd')]

📌 i 안에 j가 있기 때문에 j가 다 돌 때까지 i는 첫번째 요소에 고정

📌 j가 다 돌면 i는 다음 요소로 넘어감

3) 리스트 컴프리헨션(list Comprehension)

  • 반복문을 별도로 작성하지 않고 리스트 내부에 작성하여 반복!
my_list = ['a', 'b', 'c', 'd']

result_list = [(i, j) for i in range(2) for j in my_list]

print(result_list)

[out] [(0, 'a'), (0, 'b'), (0, 'c'), (0, 'd'), (1, 'a'), (1, 'b'), (1, 'c'), (1, 'd')]
fruit = ["사과", "딸기", "바나나"]
fruit = [len(i) for i in fruit]
print(fruit)

[out] 2,2,3
for i in a:
print(len(i))

📌 리스트 컴프리헨션을 통해 이중 for문을 1줄로 구현

점프 투 파이썬

4) 제너레이터(Generator)

for문을 사용해서 데이터를 공급하는 코드

my_list = ['a', 'b', 'c', 'd']

def get_dataset_list(my_list):
    result_list = []
    for i in range(2):
        for j in my_list:
            result_list.append((i, j))
    print('>> {} data loaded..'.format(len(result_list)))
    return result_list

for X, y in get_dataset_list(my_list):
    print(X, y)
    
# 반환된 result_list 값에 대해 또 for문을 돌려야 함 → 느림

[out] 
>> 8 data loaded..
0 a
0 b
0 c
0 d
1 a
1 b
1 c
1 d

제너레이터의 개념을 이용하여 데이터를 공급하는 코드

my_list = ['a', 'b', 'c', 'd']

def get_dataset_generator(my_list):
    result_list = []
    for i in range(2):
        for j in my_list:
            yield(i, j)            # 실행의 순서를 밖으로 양보
            print('>> 1 data loaded..')

dataset_generator = get_dataset_generator(my_list)
for X, y in dataset_generator:
    print(X, y)
    
# 메모리에 데이터를 전부 올려놓고 처리할 필요 없음
# 제너레이터 : 현재 처리해야 할 데이터를 1개씩 로드해서 사용할 수 있다.

[out] 
0 a
>> 1 data loaded..
0 b
>> 1 data loaded..
0 c
>> 1 data loaded..
0 d
>> 1 data loaded..
1 a
>> 1 data loaded..
1 b
>> 1 data loaded..
1 c
>> 1 data loaded..
1 d
>> 1 data loaded..

파이썬의 yield 키워드와 제너레이터(generator)

8-4. Try - Except 예외 처리하기

  • 예외(exception)란 코드를 실행하는 중에 발생한 에러
  • 예외 처리는 코드를 수행하다가 발생한 에러를 무시하거나 적절한 처리를 해주는 작업
a = 10
b = 0
try:
    print(a/b)
    
except:
    print("에러가 발생했습니다.")
a = 10
b = 0
try:
    print(a/b)
    
except:
    print("에러가 발생했습니다.")
    b = b + 1
    print("값 수정 : ", a/b)

[out] 에러가 발생했습니다.
값 수정 :  10.0

📌 에러가 발생하지 않을 값을 바꿔서 결과 출력!

8-5. Multiprocessing

▶ 컴퓨터가 작업을 처리하는 속도를 높여주는 방법 중 하나

  • 실행시간 측정

내가 짠 코드를 실행시킬 때 얼마나 시간이 소요되는 지 측정

import time
start = time.time()

a = 1
for i in range(100):
    a += 1
    
print("time :", time.time() - start)

[out] time : 0.0
  • 순차처리 (serial processing)
import time

num_list = ['p1', 'p2', 'p3', 'p4']
start = time.time()

def count(name):
    for i in range(0, 100000000):
        a = 1 + 2
        
    print("finish:"+name+'\n')
    
for num in num_list:
    count(num)
    
print("time:", time.time() - start)

[out]
finish:p1

finish:p2

finish:p3

finish:p4

time: 18.54592537879944
  • 병렬처리 (parallel processing)
import multiprocessing
import time

num_list = ['p1', 'p2', 'p3',' p4']
start = time.time()

def count(name):
    for i in range(0, 100000000):
        a = 1 + 2
    print("finish:"+name+'\n')
    
if __name__ == '__main__':            #코드 시작점을 여기로 하라는 명령
    pool = multiprocessing.Pool(processes = 4) # 병렬 처리 시 4개의 프로세스 사용하도록
    pool.map(count, num_list)                  # 병렬화 시키는 함수
    pool.close()                               # 더이상 pool을 통해 새로운 작업을 추가하지 않을 때 사용
    pool.join()                                # 프로세스가 종료될 떄까지 대기하도록 지시
    
print("time :", time.time() - start)

[out]
finish:p1

finish:p2

finish:p3

finish:p4

time : 7.26323676109314

📌 순차처리보다 병렬처리가 2배 이상 빨라짐

📌 p1, p2, p3, p4 순서가 다르게 나올 수도 있음

8-6. 함수 사용하기

함수 사용 전 코드

list_data = [10, 20, 30, 40]
list_data2 = [20, 30, 40, 50]

length = len(list_data)
max_result = list_data[0]
for i in range(length):
    if max_result < list_data[i]:
        max_result = list_data[i]

print("최댓값은 ", max_result)

lenth = len(list_data2)
max_result = list_data2[0]
for i in range(length):
    if max_result < list_data2[i]:
        max_result = list_data2[i]

print("최댓값은 ", max_result)

[out] 최댓값은  40
최댓값은  50

함수 사용 후 코드

list_data = [10, 20, 30, 40]
list_data2 = [20, 30, 40, 50]

def max_function(x):
    length = len(x)
    max_result = x[0]
    for i in range(length):
        if max_result < x[i]:
            max_result = x[i]
    return max_result

print("최댓값은 ", max_function(list_data))
print("최댓값은 ", max_function(list_data2))

[out] 최댓값은  40
최댓값은  50

📌 코드의 효율성 & 코드의 재사용성 & 코드의 가독성 ↑

8-7. 함수 사용 팁

1) pass

→ pass문 : 기타 제어 흐름 도구

→ 문장이 필요하지만 프로그램이 특별히 할 일이 없을 때 사용

→ 함수 내부, if 내부, while 내부 등 다양한 곳에서 쓰임

def empty_funtion():
    pass

2) 함수 연달아 사용

send(say_something("안녕!"), 2)

▶ say_something(”안녕!”) 함수의 반환값인 “안녕!”이 send의 print() 안에 들어감

3) 함수 안의 함수 & 2개 이상의 return

4) 여러 변수로 반환하기

8-8. 람다 표현식

1) 람다(lambda)

  • 익명 함수(함수 이름이 없는 함수)
  • lambda 인자 : 표현식

일반 함수 사용

def add(x, y):
    return x + y

람다(lambda) 함수 사용

print( (lambda x,y: x + y)(10, 20) )

2) map()

  • map 함수를 사용하면 요소에 적용할 함수 하나만 넘겨주면 알아서 리스트를 함수에 적용하여 map 객체로 반환해줌. 이것을 list로 형 변환해서 사용하면 됨.

  • ❗map 함수를 사용하지 않으면❗

     for 반복문 같은 것을 이용해 일일이 리스트 요소에 접근 및 계산하고 리스트에 하나씩           
    
     append를 해주어야 함.
result = list(map(lambda i: i * 2 , [1, 2, 3]))
print(result)

[out] [2, 4, 6]

[python] 파이썬 map 함수 사용법과 예제

8-9. 클래스, 모듈, 패키지

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

2) 모듈(Module) : 함수, 변수, 클래스를 모아 놓은 파일 / 코드의 저장소

3) 패키지 : 여러 모듈을 하나로 모아둔 폴더

💡 if__name__==”__main__”:의 의미 (모듈)

▶ 모듈에 if name=="main"이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것

[Python]if name == "main"

8-10. 프로그래밍 패러다임과 함수형 프로그래밍

1) 프로그래밍 패러다임

📌 절차 지향 프로그래밍

  • 일이 진행되는 순서대로 프로그래밍하는 방법
  • 순서대로 읽기만 하면 이해 가능!
  • but! 위에서 하나가 잘못되면 연쇄적으로 문제 생김...유지보수 어려움...

📌 객체 지향 프로그래밍

  • 개발자가 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 함
  • 코드를 재사용하기 쉬움
  • but! 상호작용이 있기에 설계 시간이 많이 소요되며 설계를 잘못하면 전체적으로 바꿔야 함...
  • 파이썬은 객체 지향 프로그래밍 패러다임을 지원!

2) 함수형 프로그래밍

  • 장점 : 효율성, 버그없는 코드, 병렬 프로그래밍

📌 순수성 : 내부 상태를 수정하거나 함수의 반환값에서 보이지 않는 다른 변경사항을 만드는 부작용이 있는 함수를 사용하지 않음

  • 순수성이 없는 코드
A = 5

def impure_mul(b):
    return b * A

print(impure_mul(6))
  • 순수성이 있는 코드
def pure_mul(a, b):
    return a * b

print(pure_mul(4, 6))

📌 모듈성

  • 문제를 작은 조각으로 분해하도록 함! (작은 함수가 코딩하기 쉬움)

📌 디버깅과 테스트 용이성

  • 각각의 함수가 작고 명확하게 명시되기에 디버깅을 쉽게 할 수 있음
  • 각 함수는 잠재적으로 단위 테스트의 대상이기에 테스트가 더 쉬움
profile
아직은 예비 데이터분석가

0개의 댓글