티스토리 뷰

본 글의 코드는 여기에서 보실 수 있습니다.

 

Q. 0부터 99까지 정수의 제곱수로 구성된 리스트를 생성하시오.

 

A. 방법은 여러 가지가 있다. 우선 range 객체와 함수를 하나 만들어놓고 시작한다.

 

def sq(x):
  return x**2

r = range(100)

 

처음 배우는 방법은 아래와 같이 리스트에 append를 하는 방식이다.

 

# 쌩 for문 사용

l = []
for i in r:
  l.append(i**2)

 

리스트 컴프리헨션을 사용하면 훨씬 간단해진다.

 

# list comprehension

l = [i**2 for i in r]

 

만들어둔 함수 sq를 쓸 수도 있다.

 

# 직접 연산 대신 함수 사용

l = [sq(i) for i in r]

 

map은 이터러블의 각 요소에 함수를 적용시킬 수 있다.

 

# map 사용

l = list(map(sq, r))

 

위 코드에서 map(sq, r)은 (sq(r[0]), sq(r[1]), sq(r[2]), ..., sq(r[99]))를 만들어낸다.

함수를 만들어두기 귀찮다면 람다를 써도 된다.

 

# map + lambda 사용

l = list(map(lambda x: x**2, r))

 

속도는? 그때그때 달라서 뭐가 제일 낫다고 말하기가 좀 어려웠다. 일반적으로 리스트 컴프리헨션이 가장 빠른 듯한데, 아래처럼 오히려 가장 느릴 때도 있었다. 이유는 잘 모르겠다.

 

 


 

반복문과 조건문을 같이 쓰는 방법도 여러 가지가 있다.

 

Q. 0부터 99까지의 정수 중, 3의 배수만의 제곱수로 구성된 리스트를 만드시오.

 

A. 역시 가장 먼저 배우는 방법은 for 안에 if를 쓰는 것이다.

 

l = []
for i in r:
  if i%3 == 0:
    l.append(i**2)

 

리스트 컴프리헨션을 쓰고 싶다면 리스트 컴프리헨션 표현 뒤에 if 문을 붙인다.

 

l = [i**2 for i in r if i%3 == 0]

 

filter는 주어진 함수를 이터러블의 각 요소에 적용하여, 결과가 True인 것만 남긴다.

 

l = filter(lambda x: x%3 == 0, r)
l = [i**2 for i in l]

 

 

결론: 제너레이터 씁시다. (응?)

 

참고: 본 글은 medium의 어떤 글을 읽고 반박하기 위해 쓴 글입니다(...).

 

- 게으른

댓글