AI 부트캠프/챕터3(11.08~12.04)

TIL 44

musukie 2024. 11. 20. 21:03

강의 외부에서 추가로 알게 된 내용

리스트 컴프리헨션에서 사용하지 못하는 것들

할당 연산자

  • +=, -=, *=, /=, %=, 등 변수나 객체의 값을 직접 변경하는 연산은 허용되지 않는다.
  • 예: [arr[i] += 1 for i in range(10)]는 문법 오류다.
더보기
리스트 컴프리헨션에서는 +=, -=, *=, %=와 같은 할당 연산자를 사용할 수 없다. 리스트 컴프리헨션은 새로운 리스트를 생성하기 위한 구문이며, 기존 데이터를 수정하거나 부수적인 효과(side effect)를 발생시키는 작업에는 적합하지 않다. 리스트 컴프리헨션은 값을 생성해서 반환하는 것이 목적이지, 기존 데이터를 수정하는 작업에는 설계되지 않았기 때문이다. 따라서 arr[i] += 1처럼 기존 리스트를 수정하려는 시도는 문법적으로 허용되지 않는다.

다중 문(statement)

  • 리스트 컴프리헨션 내부에서 여러 문장을 작성할 수 없다. 파이썬은 리스트 컴프리헨션을 간결하게 유지하기 위해 표현식(expression)만 허용한다.
# 잘못된 예시 
[print(i); i * 2 for i in range(5)]

break와 continue

  • 리스트 컴프리헨션 내부에서는 반복문을 중단하거나 다음 반복으로 넘어가기 위한 break와 continue를 사용할 수 없습니다.
# 잘못된 예시 
[i for i in range(10) if i == 5: break] # SyntaxError

블록 문장

  • 리스트 컴프리헨션은 단일 표현식만 허용하기 때문에 if, else, 함수 호출 등을 사용할 수는 있지만, 여러 줄의 블록 문장은 사용할 수 없습니다.
# 잘못된 예시
[if i > 5: i else: i*2 for i in range(10)] # SyntaxError

중첩된 재할당

  • 리스트 컴프리헨션 내부에서 같은 변수나 리스트를 중첩으로 수정하거나 재할당하는 작업은 적합하지 않다.
arr = [1, 2, 3] [arr.append(x) for x in range(3)]
# 부작용 발생, 권장되지 않음

 

리스트 컴프리헨션의 목적에 맞는 사용 사례

새로운 리스트 생성

  • 기존 데이터를 기반으로 완전히 새로운 리스트를 만드는 경우다. 리스트 컴프리헨션을 통해 반복문과 비슷한 방식으로 데이터를 가공해서 새로운 리스트를 만들 수 있다.
  • 예) 리스트의 모든 값 제곱

 

squares = [x**2 for x in range(10)]
print(squares)  # 출력: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

range(10)에서 가져온 값(x)의 제곱(x**2)을 새로운 리스트에 담는다. 결과적으로 [0, 1, 4, ...]과 같은 새로운 리스트가 생성된다.

기존 리스트에서 조건에 맞는 원소 필터링

  • 리스트 컴프리헨션에서 조건문을 사용해 특정 조건을 만족하는 원소만 선택할 수 있다.
  • 예) 조건에 맞는 값 필터링
evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # 출력: [0, 2, 4, 6, 8]

 

range(10)에서 가져온 값 중 짝수(x % 2 == 0)인 원소만 리스트에 추가한다. 조건을 만족하지 않는 원소는 리스트에 포함되지 않는다.

 

 

원소를 변형하여 새로운 리스트 생성

  • 리스트의 원소를 변형하는 작업을 할 수 있다. 변형은 간단한 연산이거나, 삼항 연산을 활용하여 조건에 따라 다른 값을 생성할 수도 있다.
  • 예) 삼항 연산으로 변형
modified = [x if x % 2 == 0 else -x for x in range(10)]
print(modified)  # 출력: [0, -1, 2, -3, 4, -5, 6, -7, 8, -9]

삼항 연산을 사용하여 원소가 짝수(x % 2 == 0)라면 그대로 두고, 홀수라면 부호를 반전(-)한다. 결과적으로 [0, -1, 2, -3, ...]과 같은 리스트가 만들어진다.

 

<참고> modified = [x for x in range(10) if x % 2 == 0 else -x] 는 문법 오류(SyntaxError)를 발생시킨다!

더보기

이유는 if ... else의 위치 차이때문이다. 리스트 컴프리헨션에서는 조건문삼항 연산자의 위치가 엄격하게 정해져 있다.

 if ... else (삼항 연산자)

  • 삼항 연산자는 표현식 내부에서 사용하며, 모든 값을 가공하는 데 사용된다.
  • 구문 형식
[<값> if <조건> else <다른 값> for <변수> in <반복 가능한 객체>]
  • 예시
modified = [x if x % 2 == 0 else -x for x in range(10)]
# 결과: [0, -1, 2, -3, 4, -5, 6, -7, 8, -9]

if (필터링 조건)

  • 단일 if는 리스트 컴프리헨션에서 필터링 역할만 수행하며, 조건에 맞지 않는 값을 제외한다.
  • 구문 형식
[<값> for <변수> in <반복 가능한 객체> if <조건>]
  • 예시
filtered = [x for x in range(10) if x % 2 == 0]
# 결과: [0, 2, 4, 6, 8]

 

삼항 연산자 예시 코드와 <참고> 코드의 차이

삼항 연산자 예시 코드

  • 이 코드는 모든 값을 처리하며, 짝수인 경우 x, 홀수인 경우 -x를 결과 리스트에 추가한다.
# 삼항 연산자
modified = [x if x % 2 == 0 else -x for x in range(10)]

 

<참고> 코드

  • 이 코드는 파이썬 문법에서 허용되지 않는다. 이유는 아래 2가지다.
  • if ... else는 표현식 내부에서만 사용할 수 있다.
  • 리스트 컴프리헨션의 if는 필터링 조건으로만 사용된다.
# 잘못된 코드: 필터링과 삼항 연산자 혼합 (문법 오류)
modified = [x for x in range(10) if x % 2 == 0 else -x]

all 함수

all 함수는 파이썬 내장 함수로, 주어진 반복 가능한 객체(iterable)의 모든 요소가 True인 경우 True를 반환한다. 만약 하나라도 False인 값이 있으면 False를 반환한다. 기본 구문은 아래와 같다.

all(iterable)

 

동작 원리를 알아보자. 반복 가능한 객체의 요소를 하나씩 확인하고, 모든 요소가 True일 때만 True를 반환한다. 빈 반복 가능 객체를 입력하면 True를 반환한다.

 

예시를 통해 자세히 알아보자.

all(ch in '05' for ch in str(num))

 

위 코드의 동작 단계는 다음과 같다.

  1. str(num)
    주어진 숫자 num을 문자열로 변환하여 각 자리 숫자를 문자로 다룬다.
    예를 들어, num = 50이면 str(num)은 '50'이 된다.
  2. for ch in str(num)
    문자열을 순회하며 각 문자를 ch로 가져온다.
    예: '50'을 순회하면 ch는 순서대로 '5', '0'가 된다.
  3. ch in '05'
    각 문자가 '0' 또는 '5'인지 확인한다.
    • '5' in '05' → True
    • '0' in '05' → True
  4. all(...)
    모든 문자가 조건(ch in '05')을 만족하면 True를 반환한다.
    만약 하나라도 만족하지 않으면 False를 반환한다.
    예를 들면 아래와 같다.
    • '50'은 모든 문자가 '0' 또는 '5'로 이루어져 있으므로 True.
    • '51'은 '1'이 조건을 만족하지 않으므로 False.

'AI 부트캠프 > 챕터3(11.08~12.04)' 카테고리의 다른 글

TIL 46 팀 프로젝트  (1) 2024.11.22
TIL 45  (0) 2024.11.21
TIL 43 도전 과제  (2) 2024.11.19
TIL 42  (1) 2024.11.18
TIL 41  (0) 2024.11.17