### 람다 사용
"""
1. 아규먼트는 제한 없이 사용 가능, 단 평가식은 한 개만
2. 함수 객체가 쓰이는 곳이면 대용 가능 (람다는 함수 객체를 반환)
"""
def main():
IsEvenOrOdd = \
lambda n : "Even number" if n % 2 == 0 else "Odd number"
print(IsEvenOrOdd(19))
print(IsEvenOrOdd(20))
if __name__ == '__main__':
main()
#결과
Odd number
Even number
### 람다 평가식의 활용
def main():
choice_nums = \
lambda s : ''.join([n for n in s if n.isdigit()])
print(choice_nums('apple101'))
print('\t')
find_sum = \
lambda s : sum([int(n) for n in str(s)])
print(find_sum('101'))
if __name__ == '__main__':
main()
#결과
101
2
### 함수에 람다 사용
def main():
l = ['1', '2', '9', '0', '-1', '-2']
print('Sorted numerically:', sorted(l, key=lambda n : int(n)))
print('Filtered positive even numbers:', \
list(filter(lambda n : (int(n) % 2 == 0 and int(n) > 0), l)))
print('Operation on each item using lambda and map:', \
list(map(lambda s : str(int(s) + 1), l)))
if __name__ == '__main__':
main()
#결과
Sorted numerically: ['-2', '-1', '0', '1', '2', '9']
Filtered positive even numbers: ['2']
Operation on each item using lambda and map: ['2', '3', '10', '1', '0', '-1']
### map의 사용예 (지정된 함수로 시퀀스 객체를 처리)
def main():
nums = 5
even_result = list(map(mymod, range(nums)))
ds = dict(zip(range(nums), even_result))
print('Is even? =>', ds)
pass
def mymod(n):
if n % 2 == 0:
return True
else:
return False
if __name__ == '__main__':
main()
# 결과
Is even? => {0: True, 1: False, 2: True, 3: False, 4: True}
### 리스스의 star 개수를 읽어 index, len(star) dict 생성
import random
max_star_len = 10
def main():
ls = []
d = {}
for i in range(10):
ls.append('*' * random.randint(0, max_star_len))
### for - enum을 통한 첨자 할당
for i, l in enumerate(ls):
d[i] = len(ls[i])
print(ls)
print(d)
print('\t')
### map, zip을 통한 묶음 dict 생성
l = list(map(len, ls))
d = dict(zip(range(max_star_len), l))
print(ls)
print(d)
if __name__ == '__main__':
main()
#결과
['**********', '**********', '', '*********', '***', '********', '***', '****', '*******', '*']
{0: 10, 1: 10, 2: 0, 3: 9, 4: 3, 5: 8, 6: 3, 7: 4, 8: 7, 9: 1}
['**********', '**********', '', '*********', '***', '********', '***', '****', '*******', '*']
{0: 10, 1: 10, 2: 0, 3: 9, 4: 3, 5: 8, 6: 3, 7: 4, 8: 7, 9: 1}
### map 클래스에 원하는 객체 타입을 지정해 변환
def main():
m = map(str, [1, 2, 3])
ls = list(m)
print(ls)
print(type(ls[0]))
print('\t')
s = map(int, ['1', '2', '3'])
li = list(s)
print(li)
print(type(li[0]))
if __name__ == '__main__':
main()
#결과
['1', '2', '3']
<class 'str'>
[1, 2, 3]
<class 'int'>
# 클래스에 range 객체도 던질 수 있다.
m = map(str, range(1, 11))
s = ''.join(m)
print(type(s), "s: {}".format(s))
# 결과
<class 'str'> s: 12345678910
# map, lambda 혼용
ls = list(range(1, 6))
lm = map(lambda x: x+1, map(int, ls))
print(list(lm))
# 결과
[2, 3, 4, 5, 6]
### list comprehension과 zip의 사용
### 두 개의 쌍 중에서 더 큰 값을 리턴
def main():
lx = [5, 2, 3]
ly = [1, 2, 4]
ls = [max(x, y) for x, y in zip(lx, ly)]
print(ls)
if __name__ == '__main__':
main()
#결과
[5, 2, 4]
### 람다를 이용 짝 중 큰수를 리턴
def main():
a = [5, 2, 3]
b = [1, 2, 4]
r = map(lambda pair : max(pair), zip(a, b))
print(list(r))
if __name__ == '__main__':
main()
#결과
[5, 2, 4]
### 람다, max 함수를 이용해 두 개의 쌍 중에서 더 큰 값을 리턴
def main():
l1 = [1, 3, 5, 7]
l2 = [2, 4, 6, 8]
l = list(map(lambda x, y : max(x, y), l1, l2))
print(l)
if __name__ == '__main__':
main()
#결과
[2, 4, 6, 8]
### filter
### 이터러블에서 특정 조건의 함수 결과가 True인 것만 추림
def getEvens(n):
if n % 2 ==0:
return True
def main():
r1 = list(filter(getEvens, [1, 2, 3, 4, 5]))
print('r1:', r1)
print('\t')
r2 = list(filter(lambda n : n % 2 == 0, [1, 2, 3, 4, 5]))
print('r2:', r2)
print('\t')
r3 = list(filter(lambda n : True if n % 2 == 0 else False, [1, 2, 3, 4, 5]))
print('r3:', r3)
if __name__ == '__main__':
main()
#결과
r1: [2, 4]
r2: [2, 4]
r3: [2, 4]
### reduce의 결과는 single value
import functools
def main():
ls = [1, 2, 3]
r = functools.reduce(lambda x, y: x + y, ls)
print(type(r))
print(r)
if __name__ == '__main__':
main()
#결과
<class 'int'>
6
### reduce 이터러블을 받아 연산 후에 연산 결과의 누적을 리턴
### pair에 대한 연산을 전체 이터러블로 확대할 때 사용
### 명시적인 loop 구현 없이 이터러블 처리
### 단일값만 리턴 (객체 리턴 X)
import functools
def main():
data = [{'name' : 'a', 'age' : 1},
{'name' : 'b', 'age' : 2}, {'name' : 'c', 'age' : 3}]
# 초기값이 없으면 에러 발생
r = functools.reduce(lambda x, y : x + y['age'], data, 0)
print(r)
if __name__ == '__main__':
main()
#결과
6
### reduce가 for-loop 없이 비슷한 효과를 낸다.
### 이런 특성을 이용해 문자열 합치기
import functools
def main():
ls = ['a', 'p', 'p', 'l', 'e']
s = functools.reduce(lambda x, y : x + y, ls)
print(type(s))
print(s)
if __name__ == '__main__':
main()
#결과
<class 'str'>
apple
### flattening a list of lists into a single list
import functools
def main():
list_2D = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
r = functools.reduce(lambda x, y : x + y, list_2D)
print(type(r))
print(r)
if __name__ == '__main__':
main()
#결과
<class 'list'>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
### for-loop 없이 reduce를 사용해 함수 적용
import functools
def main():
ls = [11, 9, 12, 15, 7, 13]
r = functools.reduce(lambda x, y : min(x, y), ls)
print(type(r))
print('min:', r)
r = functools.reduce(lambda x, y : max(x, y), ls)
print(type(r))
print('max:', r)
if __name__ == '__main__':
main()
#결과
<class 'int'>
min: 7
<class 'int'>
max: 15
# ord(c, /)
# Return the Unicode code point for a one-character string.
o = (list(map(ord, 'hello')))
print(list(map(chr, o)))
# 결과
['h', 'e', 'l', 'l', 'o']
### 문자열 리스트를 받아 그중 가장 긴 문자열 출력
def makePairs(ls):
return dict(zip(ls, map(len, ls)))
def main():
pairs, ret = [], []
inList = ['aaa', 'bb', 'cccc', 'd', 'eeeeeeeeee']
pairs = makePairs(inList)
maxlen = max(pairs.values())
for k, v in pairs.items():
if v == maxlen:
ret.append(k)
print(ret)
pass
if __name__ == '__main__':
main()
# 결과
['eeeeeeeeee']
댓글 영역