32. 람다표현식

Joy·2020년 4월 1일
0

람다 표현식(lambda expression)

함수 간편하게 작성 가능 -> 타 함수 인수로 넣을 때 주로 사용

lambda 매개변수들: 식

일반함수

>>> def plus_ten(x):
...     return x + 10
...
>>> plus_ten(1)
11

람다표현식

>>> lambda x: x + 10
<function <lambda> at 0x02C27270>

아직 호출은 불가 -> 이름이 없는 함수 만들기 때문(익명함수 anonymous funtion)

람다표현식 호출 : 표현식을 변수에 할당

>>> plus_ten = lambda x: x + 10
>>> plus_ten(1)
11

람다 표현식 자체를 호출

(lambda 매개변수들: 식)(인수들)

>>> (lambda x: x + 10)(1)
11

** 주의: 람다표현식 안에는 새 변수를 만들 수 없음

람다표현식을 인수로

람다표현식 사용의 이유: 함수의 인수부분에서 간단하게 함수 만들기 위해. (대표 예: map)

def로 함수만들기

>>> def plus_ten(x):
...     return x + 10
...
>>> list(map(plus_ten, [1, 2, 3]))
[11, 12, 13]

** map 사용할 때 자료형 int, str 대신 함수 직접 만들어 넣기 가능

람다 표현식으로

>>> list(map(lambda x: x + 10, [1, 2, 3]))
[11, 12, 13]

람다 표현식과 map, filter, reduce 함수

람다 표현식 + 조건부 표현식

lambda 매개변수들: 식1 if 조건식 else 식2
lambda 매개변수들: 식1 if 조건식1 else 식2 if 조건식2 else 식3
!! if, else에 : 붙이지 않음
if 사용했으면 반드시 else 도 있어야해
elif 불가 - 식1 if 조건식1 else 식2 if 조건식2 else 식3 형식처럼 if를 연속으로 사용 -- 보기 안좋으니 그냥 def로 하길 권장

예시,,

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: str(x) if x % 3 == 0 else x, a))
[1, 2, '3', 4, 5, '6', 7, 8, '9', 10]

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: str(x) if x == 1 else float(x) if x == 2 else x + 10, a))
['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

=

>>> def f(x):
...     if x == 1:
...         return str(x)
...     elif x == 2:
...         return float(x)
...     else:
...         return x + 10
...
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(f, a))
['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

map에 객체 여러가 넣기

>>> a = [1, 2, 3, 4, 5]
>>> b = [2, 4, 6, 8, 10]
>>> list(map(lambda x, y: x * y, a, b))
[2, 8, 18, 32, 50]

filter

filter(함수, 반복가능한객체)

반복가능한 객체에서 filter 에 지정현 함수의 반환값이 true일때만 요소 가져오기

>>> def f(x):
...     return x > 5 and x < 10
...
>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> list(filter(f, a))
[8, 7, 9]

람다

>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> list(filter(lambda x: x > 5 and x < 10, a))
[8, 7, 9]

reduce

반복가능한 객체의 요소를 지정함수로 처리하고 이전 결과와 누적해서 반환 (모듈에서 함수가져와야함)

from functools import reduce
reduce(함수, 반복가능한객체)

예시

>>> def f(x, y):
...     return x + y
...
>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(f, a)
15

람다

>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(lambda x, y: x + y, a)
15

리스트 표현식

람다보다 리스트표현식 사용 권유
reduce 대신 for, while반복문 권유

list(filter(lambda x: x > 5 and x < 10, a))
>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> [i for i in a if i > 5 and i < 10]
[8, 7, 9]
>>> a = [1, 2, 3, 4, 5]
>>> x = a[0]
>>> for i in range(len(a) - 1):
...     x = x + a[i + 1]
...
>>> x
15

문제: 파일이름 한꺼번에 바꾸기

표준 입력으로 숫자.확장자 형식으로 된 파일 이름 여러 개가 입력됩니다. 다음 소스 코드를 완성하여 파일 이름이 숫자 3개이면서 앞에 0이 들어가는 형식으로 출력되게 만드세요. 예를 들어 1.png는 001.png, 99.docx는 099.docx, 100.xlsx는 100.xlsx처럼 출력되어야 합니다. 그리고 람다 표현식을 사용해야 하며 출력 결과는 리스트 형태라야 합니다. 람다 표현식에서 파일명을 처리할 때는 문자열 포매팅과 문자열 메서드를 활용하세요.

list(map(lambda x:'{0:03d}.{1}'.format(int(x.split('.')[0]), x.split('.')[1]), files))
  1. 문자열 포메팅 기준 만들어주기
    {0:03d}.{1}
    파일이름 부분은 세자리 숫자로 빈자리는 0으로 체우기, {1}은 확장자 부분으로 문자열이 그대로.

2-1. 파일이름 부분 구분하기
x.split('.')[0]
x로 받은 거를 .를 기준으로 구분하고 인덱스 0에 오는 값

2-2. 확장자 부분도 똑같이
x.split('.')[1]

  1. format에 넣어주기
    format(2-1, 2-2) 인데 앞 부분은 숫자여야 하니까 int 적용해주기

4.람다식으로 표현해주기

  1. map 묶기 : files의 모든 요소를 처리야해 하니까.
profile
roundy

0개의 댓글