Python

파이썬 코드의 모범 사례

찐남 2022. 11. 12. 00:27

이번 포스팅에서는 파이썬 초보자가

효율적이고 깔끔한 코드를 작성하는 데

도움이 되는 모범 사례를 제시할 예정입니다.

 

파이썬의 중급 프로그래머이더라도

이번 포스팅을 통해 새로운 트릭과

팁을 찾을 수 있을 것으로 기대합니다.

 

 

List Comprehensions:

List Comprehensions는 기존의 for 문보다

효율적인 파이썬 고유의 코드입니다.

 

for 문을 작성하는 더 짧고, 더 빠릅니다.

파이썬에서 for 문을 사용하는 대신

List Comprehensions를 사용해야 합니다.

 

# List Comprehensions 기본 코드
[표현 for 항목 in 반복구문]

# List Comprehensions 기본 코드 + if 문 사용
[표현 for 항목 in 반복구문 if 조건]

# List Comprehensions 기본 코드 + if else문 사용
[표현 if 조건 else 표현 for 항목 in 반복구문]

# list 구문 이외에 set과 dictionary에서도 가능
{표현 for 항목 in 반복구문} # set
{key:value for 항목 in 반복구문} # dictionary

 

Generator Expressions:

이미지 리스트를 저장해야 하는 경우를 고려해 보면,

어떤 데이터 구조가 떠오르나요?


분명히 값 리스트를 저장하려면

먼저 파이썬 리스트에 값을 저장해야 하지만

이 접근 방식은 많은 양의 데이터를

저장해야 할 때 메모리를 매우

비효율적으로 사용합니다.

대신 Generator를 사용하면 리스트보다

훨씬 더 메모리를 효율적으로

사용할 수 있습니다.

 

# Generator expressions 구문
(표현 for 항목 in 반복구문)

import sys

lst = [i * 10 for i in range(100)]
print("메모리 사용 : ", sys.getsizeof(lst))

gen = (i * 10 for i in range(100))
print("메모리 사용 : ", sys.getsizeof(gen))

 

Type Hinting:

데이터 유형과 반환 유형을 지정하면 

다른 프로그래머가 코드를 더 잘 이해할 수 있습니다. 

 

파이썬이 동적으로 유형이 지정되지만

여전히 데이터 유형을 지정해도

아무것도 변경되지 않아요.

 

이는 단지 코드의 가독성을

향상하기 위한 것입니다.

 

def add(x: int, y: int) -> int : 
    return x + y

 

정렬: 

파이썬은 sort() 및 sorted()를 사용하여 정렬합니다.

sort는 내부 알고리즘인 반면

sorted는 정렬된 요소 리스트를 반환합니다.

 

또한 sort()는 파이썬의 리스트에서만

사용할 수 있는 반면

sorted는 파이썬의 모든 이터러블에

적용할 수 있습니다.


각 튜플에 학생 명부 번호와

해당 점수가 포함된 튜플 리스트가 있다고 가정하고,

 

번호 기준으로

리스트를 정렬하는 예시를 살펴보겠습니다.

 

lst = [(5, 65), (1, 80), (4, 90), (2, 67), (3, 99)]

# sorted 사용
print(sorted(lst))

# sort 함수 사용
lst.sort()
print(lst)

# 점수 기준으로 내림차순 정렬하기
sorted(lst, key = lambda x: x[1], reverse = True)

 

key 인수와 reverse 인수 모두

sort() 함수에서 인수로 사용할 수도 있습니다.

 

 

Copy and Deepcopy: 

파이썬에서 객체는 함수에 대한 참조로 전달됩니다.

따라서 함수 내부에서 수행된

모든 변경 사항도 다시 반영됩니다.

lst  = [[1,2], [3,4], [5,6], [7,8], [9,10]]

def change(var):
    var[0] = [11, 12]
    var[1][0] = 20

print(lst)

change(lst)
print(lst)

 

위의 결과에서 알 수 있듯이 change 함수가 

원래 리스트를 변경했습니다.

 

이러한 상황을 피하기 위해 copy 함수를

사용할 수 있습니다.

lst  = [[1,2], [3,4], [5,6], [7,8], [9,10]]

def change(var):
    var = var.copy()
    var[0] = [11, 12]
    var[1][0] = 20

print(lst)

change(lst)
print(lst)

뭔가 이상하네요!!!

copy 함수는 리스트의 얕은 복사본을 만듭니다.

 

따라서 중첩된 요소는 change 함수에 의해 변경됩니다.

 

이것을 방지하기 위해서는

deepcopy를 사용해야 합니다.

 

from copy import deepcopy

lst  = [[1,2], [3,4], [5,6], [7,8], [9,10]]

def change(var):
    var = deepcopy(var)
    var[0] = [11, 12]
    var[1][0] = 20

print(lst)

change(lst)
print(lst)

 

deepcopy를 사용하면 실제 매개변수의 변경에 대해 

걱정할 필요가 없습니다.

 

The f-문자열:

코드를 작성하려면 다른 형식 대신 

f-문자열을 더 깔끔하고 간결하게 사용하세요.

a = 7
b = 5

print("a = %s b = %s a + b = %s"%(a, b, a+b))

# 다른 표현 1
print("a = {} b = {} a + b = {}".format(a, b, a+b))

# 추천 표현 - f 문자열
print(f"a = {a} b = {b} a + b = {a+b}")

 

리스트 초기화 - 간단한 방법:

많은 경우에 상수 값으로 리스트를 초기화해야 합니다.

이러한 작업을 대부분의 사람들은 리스트를 선언한 다음

리스트에 값을 추가하는 for 문을 사용하는 방법을

생각합니다.

하지만 이러한 작업을 위한

훨씬 더 효율적인 방법이 있습니다.

value = 10
length = 10

# 방법 1
lst1 = []
for i in range(length):
    lst1.append(value)

# 방법 2
lst2 = [value for i in range(length)]

# 방법 3
lst3 = [value] * length

# 결과는 모두 동일하지만, 방법 3이 가장 빠릅니다.

print(lst1)
print(lst2)
print(lst3)

 

큰 숫자의 가독성 향상:

파이썬에서는 밑줄 '_'을 사용하여

큰 숫자를 더 읽기 쉽게 만들 수 있습니다.

 

print(10_000)
print(100_000_000)

 

Reversing list or strings:

문자열이나 리스트를 뒤집기 위해

매번 함수를 작성하는 대신

슬라이싱을 사용하면

한 줄로 이를 수행할 수 있습니다.

lst = [1, 2, 3, 4, 5]
string = "Python"

print(lst[::-1])
print(string[::-1])

 

'is'와 '=='의 차이점 이해:

둘 사이에는 약간의 차이가 있습니다.
'is'는 두 변수가 동일한 위치를 가리키는지 

여부를 확인하고,

"=="는 값이 동일한지 여부를 확인합니다.

a = [1, 2, 3]
b = [1, 2, 3]

print(a is b) # False, a와 b의 메모리 주소가 다르기 때문

print(id(a), id(b))

print(a == b) # True, a와 b의 값이 동일하기 때문

c = a
print(c is a) # True, c와 a는 같은 메모리 주소를 공유하기 때문

 

 

Iterable 풀기:

파이썬은 '*' 연산자를 사용하여

이터러블을 압축 해제하는 쉬운 방법을 제공합니다.

name, age, occupation = ["John", "24", "Engineer"]
print(name)
print(age)
print(occupation)

# * 연산자 사용
a, *b = [1, 2, 34]
# a에는 리스트의 첫 번째 요소가 저장되고,
# b에는 리스트의 나머지 요소가 저장됩니다.

print(a,b)

unpacking은 for 루프를 사용하지 않고 

리스트의 공백으로 구분된 요소를

출력하는 데에도 사용할 수 있습니다.

 

lst = [1, 2, 3, 4]

print(*lst)

 

Dictionary merge operator(‘|’):

이 연산자는 python 3.9 이상에서 사용 가능합니다.

이 연산자를 사용하면
두 개의 딕셔너리를 병합할 수 있습니다.

두 딕셔너리에 동일한 키가 있으면,

값이 오른쪽 딕셔너리에서 업데이트됩니다.

dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'b':4, 'd':4}

# 파이썬 3.9 버전
print(dict1|dict2)

# 오래된 파이썬 버전
print({**dict1, **dict2})

 

딕셔너리 get 함수:

딕셔너리에서 값을 검색하기 위해

dct[key] 구문을 사용하지 마세요.

 

이 메서드는 key가 딕셔너리에 없으면

예외를 반환합니다.

dct.get(key) 메서드는 키가 존재하지 않는 경우,

예외를 발생시키지 않습니다.

 

 key가 존재하지 않는 경우

해당 값을 사용하도록 이 함수에

두 번째 인수를 제공할 수 있습니다.

dict1 = {'a':1, 'b':2, 'c':3}

print(dict1.get('e', 'Key does not exist'))
print(dict1.get('a', 'Key does not exist'))

dict1['e']

 

리스트를 문자열로, 문자열을 리스트로 변환:

리스트를 단일 문자열로 변환하려면,

join() 함수를 사용하시면 됩니다.

lst = ["Python", "is", "widely", "used", "in", "Data", "Science"]

# 공백으로 문자열 결합
print(" ".join(lst))

# 쉼표(',')로 문자열 결합
print(",".join(lst))

 

split() 함수를 사용하여 문자열을 리스트로

변환할 수 있습니다.

기본적으로 split() 함수는 문자열을 공백으로 분할하고,

다른 문자로 분할하려면 split 함수에서

해당 문자를 작성하시면 됩니다.

# 방법 1
string = "Python is widely used in Data Science"
print(string.split())

# 방법 2
string = "Python"
print(list(string))

# 이건 어떨까?
stringList = "[[1,2,3], [4,5,6]]"
print(list(stringList))

위의 3번째 리스트 생성자는
문자열에서 문자 리스트를 만듭니다.

 

우리가 원하는 리스트 형식이 아니네요.
원하는 결과, 즉 리스트의 리스트를 얻으려면

json.loads() 함수를 사용해야 합니다.

import json

stringList = "[[1,2,3], [4,5,6]]"
lst = json.loads(stringList)

print(lst)
print(type(lst))

 

 

반응형