filter(함수, 반복 대상)
def func(num):
return num % 3 == 0
mul_3 = filter(func, range(20))
for i in mul_3:
print(i, end = " ") #0 3 6 9 12 15 18
filter(함수, 반복대상)에서
대상이 3의 배수인지 True/False로 구분해서
True인 경우에만 출력한다.
똑같은 기능으로
mul_3 = [x for x in range(20) if func(x)]
를 사용해도 된다.
def is_prime(num):
if num <=1:
return False
for i in range(2, int(num ** (1/2)) + 1):
if num % i == 0:
return False
return True
nums = [i+1 for i in range(30)]
primes = []
for i in nums:
if is_prime(i):
primes.append(i)
print(primes) #[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
이 때 filter를 이용해서 코드를 줄여보자.
primes = []
for i in nums:
if is_prime(i):
primes.append(i)
의 코드를 한줄로 줄일 수 있다.
primes = list(filter(is_prime,nums))
사실 필터를 사용하지 않아도 되긴한다...
primes = [i for i in nums if is_prime(i)]
필터보다 list comprehension을 사용하는 게 더 파이썬스러운 (Pythonic code) 코드이다.
nums = [1,2,3,4,5,6,7,8,9,10]
result = []
def is_even(n):
return True if n % 2 == 0 else False
for value in nums:
if is_even(value):
result.append(value)
print(result)
이 코드를 계속 줄여보자.
리스트 컴프리헨션을 사용해서 이렇게 줄일 수 있다.
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_even(n):
return True if n % 2 == 0 else False
result = [value for value in nums if is_even(value)]
print(result)
그런데 필터를 사용하면 이렇게 표현할 수 있다.
nums = [1,2,3,4,5,6,7,8,9,10]
result = []
def is_even(n):
return True if n % 2 == 0 else False
result = filter(is_even, nums)
print(list(result))
필터와 람다를 같이 사용해서 더 줄일 수도 있을 것 같다.
nums = [1,2,3,4,5,6,7,8,9,10]
result = filter(lambda x : x%2==0, nums)
print(list(result))
사실 필터와 람다 둘 다 안써도 되긴 한다
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = [value for value in nums if value % 2 == 0]
print(result) # 출력: [2, 4, 6, 8, 10]
Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not None and (item for item in iterable if item) if function is None.
출처: 파이썬 공식문서
filter(function, iterable) 은
item for item in iterable if function(item)과 같은 의미이니
건방지게 필터 쓰지말자
REFERENCE
PYTHON DOCS
코딩빌런 유튜브