⏹ 기본 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
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는 다음 요소로 넘어감
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줄로 구현
⏹ 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)
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
📌 에러가 발생하지 않을 값을 바꿔서 결과 출력!
▶ 컴퓨터가 작업을 처리하는 속도를 높여주는 방법 중 하나
내가 짠 코드를 실행시킬 때 얼마나 시간이 소요되는 지 측정
import time
start = time.time()
a = 1
for i in range(100):
a += 1
print("time :", time.time() - start)
[out] time : 0.0
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
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 순서가 다르게 나올 수도 있음
⏹ 함수 사용 전 코드
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
📌 코드의 효율성 & 코드의 재사용성 & 코드의 가독성 ↑
1) pass
→ pass문 : 기타 제어 흐름 도구
→ 문장이 필요하지만 프로그램이 특별히 할 일이 없을 때 사용
→ 함수 내부, if 내부, while 내부 등 다양한 곳에서 쓰임
def empty_funtion():
pass
2) 함수 연달아 사용
send(say_something("안녕!"), 2)
▶ say_something(”안녕!”) 함수의 반환값인 “안녕!”이 send의 print() 안에 들어감
3) 함수 안의 함수 & 2개 이상의 return
4) 여러 변수로 반환하기
⏹ 일반 함수 사용
def add(x, y):
return x + y
✅ 람다(lambda) 함수 사용
print( (lambda x,y: x + y)(10, 20) )
map 함수를 사용하면 요소에 적용할 함수 하나만 넘겨주면 알아서 리스트를 함수에 적용하여 map 객체로 반환해줌. 이것을 list로 형 변환해서 사용하면 됨.
❗map 함수를 사용하지 않으면❗
for 반복문 같은 것을 이용해 일일이 리스트 요소에 접근 및 계산하고 리스트에 하나씩
append를 해주어야 함.
result = list(map(lambda i: i * 2 , [1, 2, 3]))
print(result)
[out] [2, 4, 6]
1) 클래스 : 비슷한 역할을 하는 함수들의 집합
2) 모듈(Module) : 함수, 변수, 클래스를 모아 놓은 파일 / 코드의 저장소
3) 패키지 : 여러 모듈을 하나로 모아둔 폴더
💡 if__name__==”__main__”:의 의미 (모듈)▶ 모듈에 if name=="main"이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것
📌 절차 지향 프로그래밍
📌 객체 지향 프로그래밍
📌 순수성 : 내부 상태를 수정하거나 함수의 반환값에서 보이지 않는 다른 변경사항을 만드는 부작용이 있는 함수를 사용하지 않음
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))
📌 모듈성
📌 디버깅과 테스트 용이성