파이썬 문법 :: 개념정리(iterable, iterator) / 한줄 공식(if, lambda, for)

 프로그래머스 기초 코딩문제를 복습 하면서 정리한 [개념정리 및 기본공식]


목차

· 개념정리
    1. iterable
    2. iterator

· 기본공식
    1. 한 줄 if문 
    2. 한 줄 함수 (lambda)
    3. 한 줄 for문 (리스트 컨프리헨션)





 


개념정리 

1. iterable 

iterator을 얻을 수 있는 객체
반복 가능한 객체로 리스트, 튜플, 문자열, 딕셔너리, 세트 등이 해당됨
for문에서 범위자리에 넣을 수 있는 애들 (for i in "범위") 이면서도, 인덱스를 가지고 있는 애들이라고 생각하면 쉽다.  


2. iterator 

iterator는 next() 메서드를 가지고 있어서, 순차적으로 iterable의 값에 접근할 수 있는 객체
iterable이 인덱스를 가진 전체 몸통이라고 할 때, iterator는 iterable 몸통의 팔 하나, 다리 하나,, 이렇게 값을 하나씩 뽑아서 쓸 수 있게하는 녀석이다. 


list = [1, 2, 3, 4, 5] 
for i in list : 
  print(i)           

for문은 다들 알다시피, 리스트나 문자열과 같은 iterable의 값의 범위에서 값을 하나씩 추출해 조건문을 실행해준다. 여기서, iterable 이라는 몸통의 값을 첫번째부터 끝까지 돌아가는건 for문의 각 반복마다 내부적으로 __next__() 메서드를 실행하기 때문에 다음 요소로 넘어가는 것이다. 

iterator는 다음 요소로 넘기는 __next__() 메서드를 가지고 있어서, iterable의 값을 순차적으로 뽑을 수 있게한다. 


iterator 객체 중에는 위에 간략하게 적은 함수인 map(function, iterable) 함수가 있다. 

이 함수의 리턴값은 map object로 iterator이다. iterable의 값을 순차적으로 추출할 역할은 가지고만 있어서, 추가로 list형 변환을 해줘야 추출한 값이 list로 저장이 된다. 

def double(x):
    return x * 2

numbers = [1, 2, 3, 4, 5]
doubled = list(map(double, numbers))
print(doubled)  # 출력: [2, 4, 6, 8, 10]          

또는 순서대로 바로 변수에 저장을 해서 쓸 수 있다. 

a, b = map(int, input().strip().split(" ")) 

ㄴ 이 코드는 프로그래머스 Day 1 - a와 b출력하기 문제에서 제공되는 첫 줄




기본공식 

1. 한 줄 if문 

목적 : if문을 한 줄로 간결하게 생성하기 위해서 사용함 
상황 : 리스트 컴프리헨션(한줄 for문)을 쓸때나, 간단한 if문 조건을 사용할 때
효과 : 평범한 if문과 동일한 역할을 하는데, 코드는 간결해 가독성 높음 

문법 : Result  =  A  if  조건1  else  B  if  조건2  else  C
if문의 조건1이 참이면 왼쪽(A) 실행이 되고, 
조건1이 거짓이고, 조건2가 참이면 첫번째 else의 B가 실행이 된다. 
조건1과 조건2 둘다 거짓일때, C가 실행이되는 것


예시 

#홀짝 판별 
num = 7
parity = "Even" if num % 2 == 0 else "Odd"

#리스트의 iterable을 기반으로, 새로운 리스트 리턴 
numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers if x % 2 == 0]          



2. 한 줄 함수 - lambda 

목적 : 함수를 한 줄로 간결하게 생성하기 위해서 사용함 
상황 : def를 사용할 정도로 복잡하지 않거나, def를 사용할 수 없는 곳에 주로 쓰임 
효과 : def 함수 선언과 동일한 역할을 하는데, 한 줄로 가능한 능력

문법 : 함수이름 = lambda 매개변수1, 매개변수2, ,,, : 표현식

리스트 2개의 요소 값을 차례로 더하는 코드를 lambda를 사용해 작성한 것이다. 
list1 = [1, 2, 3]
list2 = [4, 5, 6]
sum_list = list(map(lambda x, y: x + y, list1, list2))
print(sum_list)          


lambda를 쓰지않고, def 함수선언을 해서 사용하면 아래처럼 코드가 길어진다. 

def add_lists(list1, list2):
    result = []
    for x, y in zip(list1, list2):
        result.append(x + y)
    return result

list1 = [1, 2, 3]
list2 = [4, 5, 6]
sum_list = add_lists(list1, list2)
print(sum_list)          



def solution(myString):
    return myString.upper()
아주 간단한 코드를 아래처럼 lambda를 써서 만들수있는데, return 값을 주지 않아도 출력됨
solution = lambda myString: myString.upper()
   




3. 한 줄 for문 - 리스트 컴프리헨션

list = [표현식 for 요소 in 범위] 

gene = (표현식 for 요소 in 범위)  

둥근 괄호로 만들면, 제너레이터 표현식으로 만들어진다. 
※ 둥근 괄호라고 해서, 튜플이라고 생각하면 안됨. 제너레이터 표현식은 변수로 별도 저장되서 메모리를 쓰는게 아니라, 잠깐 만들어져서 일회성으로 사용하는 것

리스트 컴프리헨션(한줄 for문) 안에 lambda나 한줄 if문을 쓰는 경우가 많음 

i) 간단한 예시
even_numbers = [x for x in range(10) if x % 2 == 0]          
if문이 리스트 컴프리헨션에 들어가면, else 문이 없을때는 위에 코드처럼 뒤에 위치하지만
else 문도 오면은 for의 앞자리에 if, else를 써야함 


ii) lambda, for, if를 한줄에 쓴 경우 
numbers = [1, 2, 3, 4, 5]
transformed = [(lambda x: x**2 if x % 2 == 0 else x)(x) for x in numbers]
# 출력: [1, 4, 3, 16, 5]          
여기서 lambda 함수와 for 사이에 있는 (x)는 lambda 함수를 호출하는 부분이다. 
for문의 numbers에서 받은 매개변수 x를 lambda 함수에게 전달해 실행하게 하는 역할













댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 핀테크 아이디어 공모전

KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계