[Python] Lambda expression (람다 표현식)
2021. 12. 13. 16:42ㆍProgramming/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 |