- 높은 생산성
다양한 모듈을 라이브러리화 하고있고,pip
를 이용해서 쉽게 설치하고 이용할 수 있다. - 코드의 간결함
- 빠른 개발 속도
- 스크립트 언어
실시간으로 코드가 실행이 된다.
- 실행시간 측정
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 안 코드에서 에러(Exception)이 발생했을 때 except로 이동.
try:
pass
except:
print('error')
❗️try/except/else/finally
https://gomguard.tistory.com/122
여러 작업을 동시에 처리하는 것
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_min
과 find_max
는 def
안에서만 동작한다.
- 여라 변수로 반환하기
,
를 이용해 여러개의 값을 반환할 수 있다.
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 패키지 이름
-
절차지향 프로그래밍
진행 순서대로 프로그래밍하는 방법- 장점 : 이해가 쉽다.
- 단점 : 앞 단계에서 잘못되면 아래에도 문제가 생긴다.
-
객체지향 프로그래밍
프로그램을 객체로 나눠 상호작용하도록 하는 방법- 장점 : 코드 재사용이 쉽다.
- 단점 : 설계에 많은 시간이 들고, 설계가 잘못되면 전체적으로 바꿔야 한다.
-
함수프로그래밍 함수로 문제를 분해해 프로그래밍.
- 특징
- 순수성 : 모든 함수의 출력은 입력에만 의존하게 만들어 부작용이 없는 함수를 사용한다. (부작용이 있는 함수 : 보이지 않는 변경사항을 만드는 함수)
- 모듈성 : 한가지 작업을 작은 작업을 수행하는 함수로 쪼개어 프로그래밍이 가능하다.
- 디버깅과 테스트 용이성 : 각각의 함수가 작고 명확하기 때문에 디버깅이 쉽다. 또 함수는 단위 테스트의 대상이기 때문에 테스트도 쉽다.
- 특징
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
: 상수