목차
1. 인덴트
2. 네이밍 컨벤션
3. 타입 힌트
4. 리스트 컴프리헨션
5. 제너레이터
6. range
7. enumerate
8. 나눗셈 연산자
9. print
10. pass
11. locals
인덴트
공백 4칸을 원칙
IDE 쓰면 알아서
네이밍 컨벤션
snake case를 따른다. (각 단어를 밑줄(_)로 구분)
→ python의 PEP(Python Enhancement Proposals) 8 및 철학에 따라 스네이크 코딩을 지향
타입 힌트
동적 타이핑 언어임에도 타입을 지정할 수 있다.
a: str = "1"
b: int = 1
def fn(a:int) -> bool: ~
타입 선언을 할 수 있기는 하지만, 여전히 동적으로 할당 될 수 있음
a:str = 1
type(a)
출력 : <class 'int'>
⇒ 타입 지정은 정리할 때 해놓으면 좋다
온라인 코딩 테스트시에 mypy를 사용하면 타입힌트에 오류를 자동으로 확인해준다.
$ pip install mypy
⇒ 만약 오류가 날 경우 Incompatible return value type 오류가 발생한다.
리스트 컴프리헨션
파이썬은 map, filter와 같은 함수형 기능을 제공한다.
Lambda Expression(람다 표현식)도 지원한다.
하지만 이것보다 리스트 컴프리헨션을 쓰는것이 더 가독성이 높다.
- 리스트 컴프리헨션은 리스트외에도 딕셔너리도 가능하다.
제너레이터
: 루프의 반복(Iteration) 동작을 제어할 수 있는 루틴 형태
파이썬 yield와 return
yield는 제너레이터가 현재까지 실행 중이던 값을 내보낸다(함수 종료 x)
return은 값을 리턴하고 모든 함수의 동작을 종료한다.
def get_natural_number():
n=0
while True:
n+=1
yield n
g=get_natural_number()
print(g)
for _ in range(0,100):
print(next(g))
출력 :
<generator object get_natural_number at 0x7f8109a7d9a0> # g : 제너레이터
1
2
3
...
98
99
100
위처럼 get_natural_number와 같은 함수를 생성해놓으면 generator가 된다.
이제 next를 이용해 yield값을 반환하고 그 다음 yield값으로 차례를 넘기는 과정을 진행한다.
이를 range를 나눠서 한번씩 참조를 하면서 출력을 하는 것
- 여러 타입에 대해서도 가능
# different type yield
def generator():
yield 1
yield 'string'
yield True
g=generator()
print(g)
print(next(g))
print(next(g))
print(next(g))
출력:
<generator object generator at 0x7f534c0c2f10>
1
string
True
range
제너레이터 방식을 활용하는 대표적인 함수
list (range(5))
출력 : [0,1,2,3,4]
range(5)
출력 : range(0,5)
type(range(5))
출력 : <class 'range'>
for i in range(5):
print(i, end=' ')
출력 : 0 1 2 3 4
range()는 range 클래스를 리턴한다.
for문 안에서는 제너레이터의 next()를 호출하듯 매번 다음 숫자를 생성해내게 된다.
💡 generator를 쓰는 이유! ⇒ 메모리를 절약할 수 있다!
a=[i for i in range(1000000)]
b=range(1000000)
print(len(a))
print(len(b))
출력 : 1000000 1000000
print(b)
print(type(b))
출력 :
range(0, 1000000)
<class 'range'>
# 메모리 점유율 비교
import sys
print(sys.getsizeof(a))
print(sys.getsizeof(b))
출력 :
8448728 # 담고 있는 값의 크기에 따라 바뀜
48 # 생성 조건만 보관하고 있기 때문에 어떤 값이 오던지 48로 동일
# index를 통한 참조도 가능
print(b[999])
출력 : 999
enumerate
여러가지 자료형을 인덱스를 포함한 enumerate 객체로 반환
a=[1,2,3,4,2,45,12]
print(enumerate(a))
print(list(enumerate(a))) # 리스트로 결과를 추출
출력 :
<enumerate object at 0x7f544115f1c0>
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 2), (5, 45), (6, 12)]
인덱스와 값을 짝지어서 모두 추출
a=[1,2,3,4,2,45,12]
for i,v in enumerate(a):
print(i,v)
출력 : 0 1 1 2 2 3 3 4 4 2 5 45 6 12
나눗셈 연산자
python에서는 type에 따른 연산방식( 예시 : int/int = int )보다는
PEP 238에서 실제 값을 반환하도록 바뀌었음 ( python 3+)
그래서 몫을 구하고 싶으면 // 를 쓰고,
나머지를 구하고 싶으면 %을 사용한다.
몫과 나머지를 동시에 구하려면 divmod() 함수를 사용한다.
print(divmod(5,3))
출력 : (1, 2)
print()를 사용한 디버깅 활용
print("a","b")
출력:a b
print("a",'b',sep=',')
출력: a,b
# 리스트 출력
a=['a','b','c','d']
print(a)
print(' '.join(a)) #빈칸 공백으로 붙여서 출력
출력:
['a', 'b', 'c', 'd']
a b c d
# 여러 값 출력 방법
idx=1
fruit='apple'
print('{0}: {1}'.format(idx,fruit))
print('{}: {}'.format(idx,fruit))
print(f'{idx}: {fruit}')
출력:
1: apple
1: apple
1: apple
pass
코드의 골격을 잡아놓기 위해 아직 구현하지 않은 메소드에 pass를 넣어줘서
클래스가 실행가능하도록 해준다.
class MyClass(object):
def method_1(self):
pass # Null operation : 아무것도 하지 않는 연산
def method_2(self):
print("method 2")
locals
: 로컬에 선언된 모든 변수를 조회할 수 있는 명령 [참조]
# 기존 locals에 있었던 key:value들은 변경 불가하고 참조만 가능하다
def test():
a = 1
b = 1
print (locals())
locals()['a'] = 3
locals()['b'] = 4
print (locals())
test()
출력:
{'a': 1, 'b': 1} # 첫번째 locals()에서 출력한 값
{'a': 1, 'b': 1} # 두번째 locals()에서 출력한 값
# locals 딕셔너리 추가 가능
locals()['새로운 key'] = 새로운 값
locals()['새로운 key'] = 업데이트 값
# locals 딕셔너리에 새로 추가된 값에 한정하여 업데이트 가능
def test():
a = 1
b = 1
print (locals())
locals()['c'] = a + b
print (locals())
locals()['c'] = 10
print (locals())
test()
출력:
{'a': 1, 'b': 1} # 첫번째 locals()에서 출력한 값
{'a': 1, 'b': 1, 'c': 2} # 두번째 locals()에서 출력한 값
{'a': 1, 'b': 1, 'c': 10} # 세번째 locals()에서 출력한 값
'파이썬 알고리즘' 카테고리의 다른 글
딕셔너리 (0) | 2023.04.18 |
---|---|
파이썬 리스트 구조 (0) | 2023.04.18 |
자료형, 자료구조, 추상 자료형 (0) | 2023.04.18 |
빅 오 표기법 (0) | 2023.04.18 |