TIL_220514_python

설탕유령·2022년 5월 14일
0

인덴트: 공백 4개

네이밍 컨벤션: 스네이크 케이스

[타입 힌트]

a: str = "1"
b: int = 1

def fn(a: int) -> bool

# 잘 지켜졌는지 검증 방법: mypy로 검사를 돌리면 설명과 일치하지 않는 변수를 찾을 수 있음
pip install mypy
mypy solution.py

[리스트 컴프리헨션]

list(map(lambda x: x + 10, [1, 2, 3]))
# 결과: [11, 12, 13]

# 홀수인 경우 2를 출력
[n * 2 for n in range(1, 10 + 1) if n % 2 ==1]
# 결과: [2, 6, 10, 14]

# 위 구문을 풀어서 작성한 경우
a = []
for n in range(1, 10 + 1):
	if n % 2 == 1:
    	a.append(n * 2)

# 딕셔너리도 가능
a = {key: value for key, value in original.items()}

# 위 구문을 풀어서 작성한 경우
a = {}
for key, value in original.items():
	a[key] = value

[제너레이터]

# return 대신 yield를 사용하며, 호출 시 값을 반환하고 대기 상태가 됨(내용이 유지 됨)
def get_natural_number():
	n = 0
    while True:
    n += 1
    yield n

# 생성한 제너레이터를 사용
g = get_natural_number()
for _ in range(0, 100):
	print(next(g)) # 매번 호출될 때마다 값이 1씩 증가함
    
# 제너레이터는 여러 타입의 값을 하나의 함수에서 생성 가능
def generator():
	yield 1
    yield 'string'
    yield True
    
g = generator()
next(g) # 1
next(g) # 'string'
next(g) # 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 구성 차이
a = [n for n in range(1000000)]
b = range(1000000)

# 길이 비교 시 동일함
len(a) # 1000000
len(a) # 1000000
len(a) == len(b) # True

a # 리스트 형식으로 값이 출력 됨 [0, 1, 2, 3...]
b # 범위와 같은 조건이 저장됨 range(0, 1000000)
type(a) # <class 'list'>
type(b) # <class 'range'>

sys.getsizeof(a) # 8697464
sys.getsizeof(b) # 48

# range로 선언하면 값이 아닌 생성 조건을 저장함
# range를 for in으로 펼치면 실제 데이터를 미리 출력해서 저장함
# range는 사용이 시작되면 값을 배정함

b[990000] # 인덱스 접근 시 바로 생성하도록 구현 되어 있음
sys.getsizeof(b) # 인덱스에 접근해도 용량 변화는 없음

[enumerate]

# 열거하다는 뜻으로 여러가지 자료형을 인덱스를 포함한 enumerate 객체로 리턴
a = [1,2,3,2,45,2,5]
a # [1,2,3,2,45,2,5]
enumerate(a) # <enumerate object at 0x1010f83f0>
list(enumerate(a))
# [(0, 1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)]

# 열거 방식
for i, v in enumerate(a):
	print(i, v)

[나눗셈 연산자]

# 파이썬 3+
5/3 # 1.6666666666667

# 파이썬 2 이하
5/3 # 1

# pep 238 이후 동작 방식 변경
5/3 # 1.6666666666667
type(5 / 3) # <class 'float'>

5//3 # 1
type(5 // 3) # <class 'int'>

int(5/3) # 1
type(int(5 / 3)) # <class 'int'>

# 나머지 연산
5 % 3 # 2

# 몫과 나머지를 동시에
divmod(5, 3) # (1, 2)

[print]

print('A1', 'B2')
# A1 B2

print('A1', 'B2', sep=',')
# A1,B2

print('aa', end=' ')
print('bb')
# aa bb

# 리스트 출력 시 join()으로 묶어서 처리
a = ['A', 'B']
print(' '.join(a))
# A B

idx = 1
fruit = "Apple"

print('{0}: {1}'.format(idx + 1, fruit))
# 2: Apple

print('{}: {}'.format(idx + 1, fruit))
# 2: Apple

# f-string(formated string literal)
print(f'{idx + 1}: {fruit}')

[pass]

# 함수이름을 정의해 두고 내용은 구현하지 않는 골격을 만들때 사용
# 내용 대신 pass를 달아 오류를 막음
class MyClass(object):
	def method_1(self):
    	pass # 내용 구현을 안하고 pass로 넘어감
	def method_b(self):
    	print("method B:)
            
c = MyClass()

# pass는 널 연산(Null Operation)으로 아무것도 하지 않는 기능

[locals]

# 로컬 심볼 테이블 딕셔너리를 가져오는 메소드
# 로컬에 선언된 모든 변수를 조회할 수 있는 명령


import pprint
pprint.pprint(locals())
# {'nums': [2, 7, 11, 15],
# 'pprint': <module 'pprint' from '/usr/lib/python3.8/pprint.py'>,
# 'self': <___main__.Solution object at 0x7f0994769d90>,
# 'target': 9}

[코딩 스타일]

[변수명과 주석]

변수명은 의미를 알 수 있도록 작성(변수는 스네이크 케이스로 작성)
파이썬에서는 간단한 주석을 부여하는 편이 가독성이 더 높이보임

[리스트 컴프리헨션]

# 파이썬을 대표하는 특징 중 하나지만 너무 남발하면 가독성을 떨어트림
# 예시
str1s = [str1[i:i +2].lower() for i in range(len(str1) -1) if re.findall('[a-z] {2}', str1[i:i + 2].lower())

# 가급적 표현식을 2개를 넘지 않게 해서 복잡도를 줄인 방법
str1s - p[
for i in range(lent(str1) - 1):
	if re.findall('[a-z]{2}', str1[i:i + 2].lower()):
    	str1s.append(str1[i:i].lower())

[구글 파이썬 스타일 가이드]

# 함수의 기본 값으로 가변 객체(Mutable Object)를 사용하지 말아야 함
# 함수가 객체를 수정하면 기본값이 변경됨
def foo(a, b=[]):
def foo(a, b: Mapping = {}):

# 대신 다음과 같이 불변 객체를 사용
def foo(a, b=None):
	if b is None:
    	b = []
def foo(a. b: Optional[Sequence] = None):
	if b is None:
    	b = []
profile
달콤살벌

0개의 댓글