:=
Python 3.8에 추가 된 할당 표현식 연산자 는 람다 표현식 내부의 할당을 지원합니다. 이 연산자는 구문상의 이유로 괄호 (...)
, 괄호 [...]
또는 괄호 로 묶인 {...}
표현식 내에 만 나타날 수 있습니다 . 예를 들어 다음과 같이 작성할 수 있습니다.
import sys
say_hello = lambda: (
message := "Hello world",
sys.stdout.write(message + "\n")
)[-1]
say_hello()
Python 2에서는 목록 이해의 부작용으로 로컬 할당을 수행 할 수있었습니다.
import sys
say_hello = lambda: (
[None for message in ["Hello world"]],
sys.stdout.write(message + "\n")
)[-1]
say_hello()
그러나 변수 flag
가의 범위가 아닌 외부 범위에 있기 때문에 예제에서 이들 중 하나를 사용할 수 없습니다 lambda
. 이것은와 관련이 없습니다. 이것은 lambda
Python 2의 일반적인 동작입니다. Python 3를 사용하면 s nonlocal
내부의 키워드 로이 문제를 해결할 수 def
있지만 s 내부에서는 nonlocal
사용할 수 없습니다 lambda
.
해결 방법이 있지만 (아래 참조) 주제를 다루는 동안 ...
어떤 경우에는 이것을 사용하여 lambda
.
(lambda: [
['def'
for sys in [__import__('sys')]
for math in [__import__('math')]
for sub in [lambda *vals: None]
for fun in [lambda *vals: vals[-1]]
for echo in [lambda *vals: sub(
sys.stdout.write(u" ".join(map(unicode, vals)) + u"\n"))]
for Cylinder in [type('Cylinder', (object,), dict(
__init__ = lambda self, radius, height: sub(
setattr(self, 'radius', radius),
setattr(self, 'height', height)),
volume = property(lambda self: fun(
['def' for top_area in [math.pi * self.radius ** 2]],
self.height * top_area))))]
for main in [lambda: sub(
['loop' for factor in [1, 2, 3] if sub(
['def'
for my_radius, my_height in [[10 * factor, 20 * factor]]
for my_cylinder in [Cylinder(my_radius, my_height)]],
echo(u"A cylinder with a radius of %.1fcm and a height "
u"of %.1fcm has a volume of %.1fcm³."
% (my_radius, my_height, my_cylinder.volume)))])]],
main()])()
반지름이 10.0cm이고 높이가 20.0cm 인 원통의 부피는 6283.2cm³입니다.
반지름이 20.0cm이고 높이가 40.0cm 인 실린더의 부피는 50265.5cm³입니다.
반지름이 30.0cm이고 높이가 60.0cm 인 실린더의 부피는 169646.0cm³입니다.
하지 마십시오.
... 원래 예제로 돌아가서 : flag
외부 범위 변수에 함수를 사용하여 이전에 할당 된 값을 수정할 수 있습니다.
예를 들어 다음을 사용하여 설정 flag
한 객체 일 수 있습니다 ..value
setattr
flag = Object(value=True)
input = [Object(name=''), Object(name='fake_name'), Object(name='')]
output = filter(lambda o: [
flag.value or bool(o.name),
setattr(flag, 'value', flag.value and bool(o.name))
][0], input)
[Object(name=''), Object(name='fake_name')]
위의 테마에 맞추고 싶다면 setattr
다음 대신 목록 이해력을 사용할 수 있습니다 .
[None for flag.value in [bool(o.name)]]
그러나 실제로 심각한 코드에서는 lambda
외부 할당을 수행 하려는 경우 대신 항상 정규 함수 정의를 사용해야 합니다.
flag = Object(value=True)
def not_empty_except_first(o):
result = flag.value or bool(o.name)
flag.value = flag.value and bool(o.name)
return result
input = [Object(name=""), Object(name="fake_name"), Object(name="")]
output = filter(not_empty_except_first, input)