본문 바로가기
Data Engineering/파이썬

파이썬 enumerate, with, is, R-String, F-String (파이썬 클린 코드 #1)

by 무언가 하는 소소 2022. 10. 7.
728x90
반응형

 

 

파이썬 클린코드 (Pythonic Code)

"Pythonic" 코딩이란 말 그래도 파이썬 답게 코딩을 한다는 것이다. 쉽게 말하면 파이썬 버전 클린코드라고 할 수 있다. 

오늘 포스팅부터 이후 몇 포스팅에서는 어떻게 하면 "Pythonic"한 코드를 짤 수 있는지 가이드라인을 알려줄 것이다. 이번 포스팅에서 다룰 내용은 enumerate, with 구문, is 오퍼레이터, R-String, F-String이다. 

 

 

1. range() 대신 enumerate()를 써라

다른 언어를 쓰다 온 사람이라면 배열에 있는 원소를 접근 할 때 정수 인덱스를 사용하는 것이 익숙할 것이다. 파이썬에서도 많은 사람들이 다음과 같은 코드를 짠다. 

arr = ['a', 'b', 'c']
for i in range(len(arr)):
	print(arr[i])

 

하지만 파이썬에서는 enumerate() 함수를 쓰면 같은 코드를 보다 깔끔하게 짤 수 있다. 

arr = ['a', 'b', 'c']
for i, element in enumerate(arr):
	print(element)

 

만약 리스트에 있는 아이템만 필요하고 인덱스는 필요 없다면 리스트에 대해 직접 이터레이션을 도는 것이 좋다.

arr = ['a', 'b', 'c']
for element in arr:
	print(element)

 

 

2. open()과 close() 대신 with 구문을 써라

open() 함수는 파일을 읽고 쓰기 위한 메소드를 가진 파일 객체를 반한환다. open()을 써서 파일 객체를 얻었다면 후에 파일 객체에 대해 close() 함수를 호출해 다른 프로그램이 파일을 읽고 쓸 수 있도록 해야한다. 

fileObj = open('sample.txt', 'w')
fileObj.write('Hello, world!')
# do sth
fileObj.close()

 

하지만 open(), close() 쌍을 쓰는 경우 실수로 close()를 호출하는 것을 까먹을 수 있다. 또한 아래 코드처럼 try 블락에서 open(), close() 쌍을 사용하는 경우에는 close() 함수가 호출이 안될 수도 있다. 

try:
	fileObj = open('sample.txt', 'w')
	div_zero = 10 / 0    # A zero divide error happens here.
	fileObj.close()  # This line never runs.
except:
	print('close() is never called.')

 

따라서 파이썬에서는 open(), close() 쌍을 쓰는 것보다는 with 구문을 써서 with 구문을 빠져나갈 때 자동으로 close()가 호출되게 하는 것이 좋다. 

with open('sample.txt', 'w') as fileObj:
	fileObj.write('Hello, world!')

 

 

3. None과 비교할 때는 "==" 대신 "is"를 써라

"=="는 값을 비교하는 오퍼레이터고 "is"는 객체의 아이덴티티를 비교하는 오퍼레이터이다. 따라서 어떤 객체가 None 객체인지 판별하기 위해서는 "is" 오퍼레이터를 써야한다. 한가지 더 명심할 것은 True/False와 비교할 때는 "==" 오퍼레이터를 써야한다는 점이다. 

 

 

4. 문자열에 백래쉬(\)가 많다면 raw 문자열을 써라

문자열에서 백래쉬("\")는 이스케이프 캐릭터로 사용된다. 따라서 문자열에 그냥 백래쉬를 포함시키고 싶다면 아래 코드와 같이 백래쉬를 두번 연달아 써야 한다.

print('The file is in C:\\Users\\Programmer\\Desktop\\Archive\\Sample')
>> The file is in C:\Users\Programmer\Desktop\Archive\Sample

 

하지만 윈도우의 경로와 같이 백래쉬가 많이 포함된 경우에는 raw 문자열(R-String)을 쓰는 것이 낫다. Raw 문자열은 따옴표 전에 r이 있는 문자열로 백래쉬를 이스케이프 시퀀스로 취급하지 않는다. 따라서 raw 문자열을 쓰면 위의 코드가 아래와 같이 간결하게 바뀐다.

print(r'The file is in C:\Users\Programmer\Desktop\Archive\Sample')
>> The file is in C:\Users\Programmer\Desktop\Archive\Sample

 

 

5. F-String을 적극적으로 활용해라

보통 여러 문자열을 연결하거나 문자열 중간에 다른 값을 문자열로 바꿔서 넣고 싶은 경우에는 아래 코드와 같이 "+"  혹은 "%" 오퍼레이터를 많이 사용한다. 

activity = 'jump'
count = 28
print('You ' + activity + str(count) + ' times!')
print("You %s %d times!' % (activity, count))

 

하지만 F-String을 활용하면 같은 작업을 훨씬 간단히 할 수 있다. F-String은 따옴표 전에 f가 있는 문자열로 "{}"를 활용한다. F-String을 사용하면 위의 코드를 아래처럼 간결하게 적을 수 있다. 

activity = 'jump'
count = 28
print(f'You {activity} {count} times!')

다만 F-String은 파이썬 3.6부터 도입되었기 때문에 그 이전 버전을 사용한다면 format() 함수나 "%" 오퍼레이터를 사용해야 한다. 

728x90
반응형

댓글