이번 포스팅은 파이썬에 있는 문법 중 하나인 for-else, while-else 문에 대한 소개입니다.
대부분 프로그래밍 언어 상에서 'if' 키워드 다음에 'else'를 쓸 수 있는 것을 알고 계실겁니다.
하지만 파이썬에서는 'for', 'while' 키워드 뒤에도 'else'를 쓸 수 있습니다.
for, while과 함께 쓰이는 else는 반복문이 break 등으로 끊기지 않고 끝까지 수행되었을 때 실행됩니다.
아래는 예제 코드입니다.
num_list = [1, 2, 3, 4, 5]
isExist = False
for i in num_list:
if i < 0:
isExist = True
break
if isExist:
print('음수가 존재함')
else:
print('음수가 존재하지 않음')
0보다 작은 수가 있는지, 없는지를 파악하기 위해서 isExist라는 변수를 추가로 사용해야 했습니다.
위와 같은 코드를 for-else문으로 바꾸어본다면 아래와 같습니다.
num_list = [1, 2, 3, 4, 5]
for i in num_list:
if i < 0:
print('음수가 존재함')
break
else:
print('음수가 존재하지 않음')
(파이썬은 중괄호 없이 들여쓰기를 기준으로 블럭을 판단하기 때문에 들여쓰기 주의)
물론, 아래와 같이 리스트컴프리헨션을 사용할 수도 있습니다.
num_list = [1, 2, 3, 4, 5]
neg_nums = [x for x in num_list if x < 0]
if len(neg_nums) > 0:
print('음수가 존재함')
else:
print('음수가 존재하지 않음')
어떻게 보면 이 코드가 더 파이썬스러울 수도 있겠군요
하지만 이런 경우에는 어떨가요?
만약 16진수로 이루어진 flag의 길이를 모르는 상태로 브루트포스를 할 때를 예를 들어보겠습니다.
import requests
flag = ''
while True:
for c in '0123456789ABCDEF':
r = requests.get('www.example.com/?flag=' + flag + c)
if r.status_code == 200:
flag += c
break
else:
print(flag)
break
flag의 길이를 모르기 때문에 while True 안에서 브루트포스를 진행하고 있습니다.
만약 0부터 F까지 수행했는데도 break가 되지 않았다면 flag를 다 찾은 것이기에 while문을 탈출하도록 하였습니다.
블로그에 정리하면서 보니 그렇게 유용한가? 싶긴 하지만 그래도 사용한 적은 많은 것 같아 한 번 포스팅해봤습니다.
혹시나 모르셨던 분이 계신다면 한 번쯤 사용해보시는 것은 어떤가요?