코딩/Python

파이썬 for-else, while-else

Namchun 2024. 1. 18. 21:31

이번 포스팅은 파이썬에 있는 문법 중 하나인 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문을 탈출하도록 하였습니다.

 


 

블로그에 정리하면서 보니 그렇게 유용한가? 싶긴 하지만 그래도 사용한 적은 많은 것 같아 한 번 포스팅해봤습니다.

혹시나 모르셨던 분이 계신다면 한 번쯤 사용해보시는 것은 어떤가요?