[Python] lambda

손종일·2020년 8월 26일
0

Python

목록 보기
1/13
post-thumbnail

람다 (lambda)

지금까지는 def로 함수를 정희해서 사용했으나 이번에는 함수를 딱 한줄만 사용하여 함수를 만들 수 있게 해주는 것이 람다(lambda) 입니다.

람다는 어떻게 만드는가?

아래의 함수는 3 이라는 매개변수에 1을 더하는 함수를 만들었습니다. 하지만 이 코드를 람다를 사용한다면
단 한줄로 함수를 만들 수 있습니다.

  • 실행을 하면 함수 객체가 나오는데, 이 상태로는 함수를 호출할 수 없다.
  • 람다 표현식은 이름이 없는 함수를 만들기 때문이다.
  • 람다 표현시을 익명 함수(anoymous function)로 부르기도 한다.
  • lambda로 만든 익명 함수를 호출하려면 다음과 같이 람다 표현식을 변수에 할당하면 된다.
def plus_one(x):
	return x + 1
plus_one(3)	# 4
print((lambda x : x+1))		# <function <lambda> at 0x7f8f899685e0>
print((lambda x : x+1)(3))	# 4

la = lambda x : x + 1
print(la(1))			# 1

람다를 사용할 때 주의할 점은?

  • 반환값 부분은 변수 없이 식 한줄로 표현할 수 있어야한다.
  • 변수가 필요한 코드일 경우에는 def로 함수를 작성하는 것이 좋다.
  • 람다 표현식 밖에 있는 변수는 사용할 수 있다.
  • 매개변수 x 와 람다 표현식 밖에 있는 변수 y를 더해서 반환한다.
print((lambda x : y+10; x+y)(1))	#SyntaxError: invalid syntax

y = 10
print((lambda x: x + y)(1))		# 11

람다 표현식을 인수로 사용하는 방법

  • 반환값 부분은 변수 없이 식 한줄로 표현할 수 있어야한다.
  • 변수가 필요한 코드일 경우에는 def로 함수를 작성하는 것이 좋다.
  • 람다 표현식 밖에 있는 변수는 사용할 수 있다.
  • 매개변수 x 와 람다 표현식 밖에 있는 변수 y를 더해서 반환한다.
def plus_one(x):
	return x+1
print(list(map(plus_one, [0, 2, 4])))		# [1, 3, 5]
print(list(map(lambda x : x+1, [1, 3, 5])))	# [2, 4, 6]

여기서 문제! 다음 types 모듈에 LambdaType외에 어떤 모듈이 있을까?

dir로 types를 확인해보면 아래와 같이 LambdaType외에도 많은 모듈이 존재한다.

import types
f = lambda x,y,z : x+y+z
print(dir(types))

#['AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType',
'CellType', 'ClassMethodDescriptorType', 'CodeType', 'CoroutineType',
'DynamicClassAttribute', 'FrameType', 'FunctionType', 'GeneratorType',
'GetSetDescriptorType', 'LambdaType', 'MappingProxyType',
'MemberDescriptorType', 'MethodDescriptorType', 'MethodType',
'MethodWrapperType', 'ModuleType', 'SimpleNamespace', 'TracebackType',
'WrapperDescriptorType', '_GeneratorWrapper', '__all__', '__builtins__',
'__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', '_calculate_meta', '_cell_factory',
'coroutine', 'new_class', 'prepare_class', 'resolve_bases']
profile
Allday

0개의 댓글