파이썬 문법 :: 개념정리(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
조건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 함수에게 전달해 실행하게 하는 역할
댓글
댓글 쓰기