오늘은 빼빼로데이. 참 달달한 날이 아닐 수 없다. 여러분들도 오늘 하루 달달하게 지내셨길 바란다.
오늘도 계속해서 파이썬의 개념에 대해서 학습했다. SQL과는 다르게 뭔가 익숙해지는 데에 시간이 더 걸리는 것 같다. 아직 문제를 풀어보지 않아서 그런걸까?
어쨌든 계속 공부하고 있으니, 결국은 이해하고 잘 활용할 수 있을 것이다. 희망을 가지자.
오늘 학습한 내용을 나만의 언어로 정리하기
라이브 세션으로 파이썬의 컴프리헨션에 대해서 배웠다. 아직 다른 기초 단계도 떼지 못한 상황에서 당장 컴프리헨션을 이해하고 재현하는 것은 무리라고 느꼈다.
튜터님께서도 먼저 기본적인 걸 해낸 후에 컴프리헨션을 연습하는 게 더 좋을 것이라고 조언해주셨다.
자습으로는 파이썬의 반복문 중 하나인 while문에 대해서 학습했다. while문은 for문과는 달리 순회할 범위나 횟수가 딱히 정해져있지 않은 반복문이다. 따라서 반복할 조건을 신중히 설정해야 한다. 그렇지 않으면 무한 루프에 빠지게 된다.
학습 내용
컴프리헨션 : 컴프리헨션은 반복문을 한 줄로 줄이는 문법을 말한다. 원래는 3줄, 4줄로 작성해야 할 반복문을 한 줄로 짧게 코딩하는 것을 가능하게 만든다.
파이썬에 친화적으로 작성했기 때문에 굉장히 경제적이고 깔끔한 것이 특징이다. 가독성도 좋다.
예를 들어 보자.
ex 1)
result = []
for i in range(1, 5):
result.append(i)
print(result)
result = []
for i in range(1, 6):
result.append(i**2)
result = []
for i in range(1, 6):
if i % 2 == 0:
result.append(i**2)
예시 1 코드는 각각
"리스트에 1~4까지 순서대로 추가하기"
"1~5까지 제곱해서 추가하기"
"1~5까지 중 짝수만 제곱해서 추가하기"
를 의미한다. 코드 실행 결과는 아래와 같다.
이 코드들을 컴프리헨션을 사용해 한 줄로 줄일 수 있다.
ex 2)
[i for i in range(1, 5)]
[i**2 for i in range(1, 6)]
[i**2 for i in range(1, 6) if i % 2 == 0]
기존에 세 줄, 네 줄이었던 코드들이 획기적으로 줄어들었다! 실행도 함께 진행시켜보자.
기존의 코드들과 동일한 결과값을 출력했다.
컴프리헨션은 예시 1, 2 코드와 같이 리스트의 형태도 가능하지만, 더 나아가 딕셔너리(DIctionary)와 셋(Set)의 형태도 가능하다.
ex 3)
# 딕셔너리 컴프리헨션 -> 키, 값
# { 키표현식: 값표현식 for 변수 in 반복대상 if 조건 }
students = ['철수', '영희', '유선']
{ student: 0 for student in students }
# 셋 컴프리헨션
# 중복을 허용하지 않는 자료형 -> 중복 제거
names = ["Ha", "yh", "YH", "ha", "jh"] # 소문자, 대문자
unique = {name.lower() for name in names} # 셋 컴프리헨션, .lower()로 소문자 형태 출력
이처럼 컴프리헨션은 식을 최소화시켜주는 고마운 존재이지만, 주의점도 함께 가지고 있다.
컴프리헨션은 식 자체가 복잡해졌을 경우에는 사용하면 안 된다.
컴프리헨션의 핵심은 식을 한 줄로 표현하는 간결함에 있다. 그런데 식이 길어지고, 조건이 다수 붙게 되면 컴프리헨션이 오히려 코드의 가독성을 떨어트리고 만다.
또한 복잡한 로직을 수정하고자 할 때, 한 줄로 응축된 코드를 바꾸는 것은 여러 줄로 나뉘어 있는 코드를 수정할 때보다 오류를 발생시킬 가능성이 훨씬 높다.
# while문의 구조
while 조건: # 조건 -> 불리언(boolean) 값(True 또는 False)을 반환하는 표현식
코드_블록 # 조건이 True로 평가될 때까지 코드 블록이 반복적으로 실행
ex 4)
# 1부터 5까지 출력하기
i = 1
while i <= 5:
print(i)
i += 1
ex 5)
# 사용자 입력 받기
user_input = ''
while user_input != 'quit':
user_input = input("Type 'quit' to exit:")
print(f"You typed: {user_input}")
조건의 진위여부에 따라 코드가 실행되므로, 조건식의 조건을 참으로 설정할 지, 거짓으로 설정할 지에 따라서 작동 범위가 달라지기도 한다.
예시 4 코드에서는 "변수 i는 5 이하"가 참일 경우 반복문이 실행되게 코드를 설정했다.
반면 예시 5 코드에서는 "변수 user_input"에 'quit'가 적히지 않는 경우에만, 즉 조건이 거짓일 경우에만 반복문이 실행되게 설정했다.
이처럼 while문은 설정하기에 따라서 일정 범위만 반복되는 코드를 작성할 수도, 무한으로 루프하는 코드를 작성할 수도 있다.
이 때 주의할 점이 있다. 무한 루프 코드를 짤 때는 반드시 ‘break’와 같은 반복을 끝내는 장치를 잘 만들어 두어야 한다는 것이다.
ex 6)
while True:
users_input = input("Type 'quit' to exit:")
if users_input == 'quit':
break
print(f"You typed: {users_input}")
예시 6 코드에서 'break'라는 제어문을 통해서 while문의 반복을 멈추는 장치를 설치했다.
여기서 'break'를 빼면, 'quit'를 입력해도 코드가 계속해서 반복된다.
ex 7)
while True:
users_input = input("Type 'quit' to exit:")
if users_input == 'quit':
print(f"You typed: {users_input}")
이렇듯 while문을 작성할 때는 먼저 올바른 조건식을 작성할 것, 다음으로 문제가 발생했을 경우 코드를 제어할 수 있는 안전장치를 적절한 위치에 설치할 것을 명심해야 한다.
하지만 편리함을 추구하기 전에 먼저 코드를 정확하고 확실하게 짜는 법을 익혀야 한다. 코드가 어떻게 작동하는지도 모르는 상태로 코드 길이를 줄이거나 다른 기능을 활용하면 오히려 더 헷갈리게 될 터이니 말이다.
마치며 : 앞으로 캠프 학습량을 제대로 따라가기 위해서 간단하게라도 운동을 하기로 했다. 하루종일 컴퓨터를 사용해야 하기 때문에 시간을 오래 쓰지는 못하겠지만, 그래도 안 하는 것보다야 낫겠지 싶다.
더 미룰 것도 없이 오늘부터 바로 시작할 것이다. 이 글을 읽는 독자분들께서도 많은 응원 부탁드리며 이만 마치도록 하겠다.