##
# -*- coding: utf-8 -*-
"""
https://wikidocs.net/64
http://www.dotnetperls.com/lambda-python

lambda 인자 : 표현식
map(함수, 리스트)
reduce(function, sequence data types)
filter(function, list)
sort(cmp=None, key=None, reverse=False)
"""


##
# ====================================================================================================
#
# Basic
#

# 두 수를 더하는 함수
def hap(x, y):
return x + y

print hap(10, 20)

# lambda expression
print (lambda x, y: x + y)(10, 20)


##
#
# map (function, list)
# 리스트에서 원소를 하나씩 꺼내서 함수를 적용시킨 다음 그 결과를 리스트에 담아줌
#

print map(lambda x: x ** 2, range(5)) # python 2
print list(map(lambda x: x** 2, range(5))) # python 2 & python 3


##
#
# reduce(function, sequence data types)
# 순서형 자료(문자열, 리스트, 튜플)의 원소들을 누적적으로 함수에 적용
#

# example 1
from functools import reduce # python 3 에서는 써줘야 함
data_a = [0, 1, 2, 3, 4]
print reduce(lambda x, y: x + y, data_a)

# example 2
# lambda 식의 결과는 다음 loop 에서 x 값의 input 으로 사용되는 듯.
# data_b 의 새로운 input y 에 순차적으로 들어감.
data_b = 'abcde'
print reduce(lambda x, y: y + x, data_b)


##
#
# filter(function, list)
# list 에 들어있는 원소들을 function 에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어줌.
#

# Example 1
print filter(lambda x: x < 5, range(10)) # python 2
print list(filter(lambda x: x < 5, range(10))) # python 2 & python 3

# Example 2
# 홀수만 남겨주는 lambda
print filter(lambda x: x % 2, range(10))
print list(filter(lambda x: x % 2, range(10)))

# Example 3
# 짝수만 남겨주는 lambda
print filter(lambda x: x % 2 == 0, range(10))
print list(filter(lambda x: x % 2 == 0, range(10)))


##
#
# sort(cmp=None, key=None, reverse=False)
#

a = [-1, -8, 3, -4, 2, 5, -7]
a_sorted = a.sort(key=lambda x: x * x, reverse=True)
print a_sorted

##
# ====================================================================================================
#
# http://www.dotnetperls.com/lambda-python
#

# Python program that uses lambda argument
def apply(f, n):
print(f(n))

# Create two lambdas.
square = lambda n: n * n
cube = lambda n: n * n * n

# Pass lambdas to apply method.
apply(square, 4)
apply(cube, 3)

# Output
# 16
# 27

##
# Python program that uses lambda, no arguments

# Assign variable to lambda expression.
x = lambda: sum(range(1, 4))

# Invoke lambda expression.
y = x()
print(y)

# Output
# 6

##
# # Python program that uses None, lambda
#
# # This lambda has a side effect.
# # ... Print returns None.
# p = lambda x: print(x) # Error
#
# p("Hello")
# p("World")
#
# # Output
# # Hello
# # World

##
# Python program that uses lambda in lambda

add_two = lambda n: n + 2
multiply_add_two = lambda n: add_two(n * 2) # Call lambda in lambda.

print(multiply_add_two(3))
print(multiply_add_two(5))

# Output
# 8
# 12

##
# Python program that times lambda expressions
# The results show that
# methods written with the def keyword and with the lambda keyword are close in performance.

import time

# Method.
def square1(n):
return n ** 2

# Lambda method.
square2 = lambda n: n ** 2

print(time.time())

# Use def method.
i = 0
while i < 10000000:
square1(1)
i += 1

print(time.time())

# Use lambda method.
i = 0
while i < 10000000:
square2(1)
i += 1

print(time.time())

# Output
# 1346613154.399
# 1346613158.919 (Def = 4.52 s)
# 1346613163.397 (Lambda = 4.48 s)


##
# Python program that uses lambda as macro

line1 = "A cat, a dog "
line2 = " a bird, a mountain"

# Use X as an alias for two methods.
x = lambda s: s.strip().upper()

# Call the lambda to shorten the program's source.
line1b = x(line1)
line2b = x(line2)

print line1b, len(line1b)
print line2b, len(line2b)

# Output
# A CAT, A DOG
# A BIRD, A MOUNTAIN

##
# ====================================================================================================


+ Recent posts