[Python] Lambda expression (람다 표현식)

2021. 12. 13. 16:42Programming/Python

    목차
반응형

lambda param : body

 

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

 

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

 

>>> (lambda : 1)()
1



Python lambda expression 내에서는 변수 선인이 불가능

 

>>> y = 10
>>> (lambda arg : arg + y)(1)
11

 

>>> def plus(x):
...     return x + 10

>>> list(map(plus, [1]))
[11]
>>>
>>> list(map(plus, [1, 2]))
[11, 12]

 

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



map, filter, reduce 함수 사용

 

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

 

>>> a = [1, 2, 3, 4, 5]
>>> list(map(lambda x : str(x) if x % 3 == 0 else float(x) if x == 2 else x, a))
[1, 2.0, '3', 4, 5]

 

>>> 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

filtering 하는 함수

return이 True인 것의 param을 출력하는 함수

 

>>> 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]

 

>>> b = [2, 4, 6, 8, 10]
>>> list(filter(lambda x : x > 5 and x < 10, b))
[6, 8]



reduce

이전 결과와 누적해서 리턴

2nd 인자의 list 내 원소를

(([0] + [1]) + [2]) + [3] … 와 같은 순서로 합하여 반환

 

>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(f, a)

 

위 filter(lambda x : x > 5 ….를 list expression으로도 가능

 

>>> 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]

 

reduce(lambda x, y : x + y, a) 는 아래의 코드와 같은 결과

 

>>> a = [1, 2, 3, 4, 5]
>>> val = a[0]
>>> for i in range(len(a) - 1):
...     val+= a[i + 1]
...
>>> val
15



7로 끝나는 숫자만 다른 list로 재구성

 

>>> a = [1, 2, 7, 4, 14, 17]
>>> list(filter(lambda x : x % 10 == 7, a))
[7, 17]



32.4 연습문제: 이미지 파일만 가져오기

lambda expression을 사용해야 하며, 결과는 list 형태여야 함

 

files = ['font', '1.png', '10.jpg', '11.gif', '2.jpg', '3.png', 'table.xslx', 'spec.docx']

exts = ['jpg', 'png']

print(list(filter(lambda name : name.split('.')[-1] == 'jpg' or name.split('.')[-1] == 'png', files)))
print(list(filter(lambda name : if name.find('jpg') != -1 or name.find('png') != -1, files)))

 

['1.png', '10.jpg', '2.jpg', '3.png']
['1.png', '10.jpg', '2.jpg', '3.png']



32.5: 심사문제: 파일 이름을 한번에 바꾸기

파일 이름이 숫자3개 이면서 앞에 0이 들어가는 형식으로 출력되게 하시오.

ex. 1.png는 001.png로 출력, 100.xlsx는 100.xlsx로 출력

lambda expression을 사용하고 결과는 list로 출력

 

입력:
1.jpg, 10.png, 11.png, 2.jpg, 3.png

 

2가지 방식으로 풀이 (1. 함수, 2. lambda)

 

infiles  = ['1.jpg', '10.png', '11.png', '2.jpg', '3.png']
infiles2 = ['097.xlsx', '098.docx', '099.docx', '100.xlsx', '101.docx', '102.docx']

def pad_zeros(pad_len, word):
   word_chunks = word.split('.')
   name = word_chunks[-2]
   ext = word_chunks[-1]
   len_to_pad = 0 if pad_len <= len(name) else pad_len - len(name)
   return len_to_pad*'0' + name + '.' + ext

output = []
for infile in infiles:
   output.append(pad_zeros(3, infile))
print(output)

output = []
for infile in infiles2:
   output.append(pad_zeros(3, infile))
print(output)

print(list(map(lambda x : (3 - len(x.split('.')[-2]))*'0' + x if len(x.split('.')[-2]) < 3 else x, infiles)))

print(list(map(lambda x : (3 - len(x.split('.')[-2]))*'0' + x if len(x.split('.')[-2]) < 3 else x, infiles2)))

 

['001.jpg', '010.png', '011.png', '002.jpg', '003.png']
['097.xlsx', '098.docx', '099.docx', '100.xlsx', '101.docx', '102.docx']
['001.jpg', '010.png', '011.png', '002.jpg', '003.png']
['097.xlsx', '098.docx', '099.docx', '100.xlsx', '101.docx', '102.docx']

 

 

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: 원소의 중복 제거  (0) 2021.12.15
Python instance check  (0) 2021.12.13
Python access member as string  (0) 2021.12.10
Python access member with string  (0) 2021.12.10
openpyxl sheet  (0) 2021.12.10