programing

할당 표현식이란 무엇입니까("왈러스" 또는 ":=" 연산자 사용)?이 구문이 추가된 이유는 무엇입니까?

testmans 2023. 5. 25. 21:37
반응형

할당 표현식이란 무엇입니까("왈러스" 또는 ":=" 연산자 사용)?이 구문이 추가된 이유는 무엇입니까?

파이썬 3.8부터 코드는 소위 "왈러스" 연산자를 사용할 수 있습니다.:=), 할당 표현식에 대해 PEP 572에 문서화되어 있습니다.

이것은 정말 실질적인 새로운 기능처럼 보입니다. 왜냐하면 이것은 이해와 이해 내에서 이러한 형태의 과제를 허용하기 때문입니다.lambdas.

과제 표현식의 구문, 의미론 및 문법 사양은 정확히 무엇입니까?

PEP 379("할당 표현 추가"에 대한 유사한 아이디어를 제안함)가 철회되었음에도 불구하고 이 새로운(그리고 상당히 급진적으로 보이는) 개념이 도입된 이유는 무엇입니까?

PEP 572에는 특히 첫 번째 질문에 대한 많은 세부 정보가 포함되어 있습니다.PEP의 가장 중요한 부분 중 몇 가지를 간결하게 요약/인용해 보겠습니다.

이론적 근거

기존 할당이 금지된 람다 함수 및 목록 이해와 같은 이해 내에서 이 형식의 할당을 허용합니다.또한 코드 리팩터링 없이 대화형 디버깅을 쉽게 수행할 수 있습니다.

권장 사용 사례 예

조건부 값 가져오기

예(Python 3의 경우):

command = input("> ")
while command != "quit":
    print("You entered:", command)
    command = input("> ")

다음이 될 수 있습니다.

while (command := input("> ")) != "quit":
    print("You entered:", command)

마찬가지로 문서에서:

이 예에서 할당 식을 사용하면 len()을 두 번 호출하지 않아도 됩니다.

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

목록 이해 단순화

예:

[(lambda y: [y, x/y])(x+1) for x in range(5)]

다음이 될 수 있습니다.

[[y := x+1, x/y] for x in range(5)]

구문 및 의미론

임의의 Python 표현식을 사용할 수 있는 모든 컨텍스트에서 명명된 표현식이 나타날 수 있습니다.이것은 형식입니다.name := expr어디에expr는 올바른 Python 식이며, name은 식별자입니다.

이러한 명명된 식의 값은 통합된 식과 동일하며 대상에 해당 값이 할당된다는 추가적인 부작용이 있습니다.

일반 할당 문과의 차이점

PEP에는 문이 아닌 표현식일 뿐만 아니라 몇 가지 차이점이 있습니다. 표현식 할당은 오른쪽에서 왼쪽으로 이동하고 쉼표를 중심으로 우선 순위가 다르며 지원하지 않습니다.

  • 다중 대상

    x = y = z = 0  # Equivalent: (z := (y := (x := 0)))
    
  • 단일 이름이 아닌 할당:

    # No equivalent
    a[i] = x
    self.rest = []
    
  • 참을 수 있는 포장/포장 해제

    # Equivalent needs extra parentheses
    loc = x, y  # Use (loc := (x, y))
    info = name, phone, *rest  # Use (info := (name, phone, *rest))
    
    # No equivalent
    px, py, pz = position
    name, phone, email, *other_info = contact
    
  • 인라인 유형 주석:

    # Closest equivalent is "p: Optional[int]" as a separate declaration
    p: Optional[int] = None
    
  • 증강 할당은 지원되지 않습니다.

    total += tax  # Equivalent: (total := total + tax)
    

할당 표현식이 코드를 더 간결하고 읽기 쉽게 만들 수 있는 몇 가지 예:

if

이전:

match = pattern.match(line)
if match:
    return match.group(1)

이후:

if match := pattern.match(line):
    return match.group(1)

while

이전:

while True:
    data = f.read(1024)
    if not data:
        break
    use(data)

이후:

while data := f.read(1024):
    use(data)

PEP에는 다른 좋은 예들이 있습니다.

3.8이 공식적으로 출시된 이후 몇 가지 예와 이유가 더 있습니다.

표현식의 결과 이름을 지정하는 것은 긴 표현식 대신 설명적인 이름을 사용하고 재사용할 수 있도록 하는 프로그래밍의 중요한 부분입니다.현재 이 기능은 문 형식으로만 사용할 수 있으므로 목록 이해 및 기타 식 컨텍스트에서는 사용할 수 없습니다.

출처: 라이센스가 부여된 전문가의 레딧 댓글

일치하는 정규식 처리

if (match := pattern.search(data)) is not None:
    # Do something with match

2-argiter()를 사용하여 간단히 다시 쓸 수 없는 루프

while chunk := file.read(8192):
   process(chunk)

계산 비용이 많이 드는 가치 재사용

[y := f(x), y**2, y**3]

이해 필터 절과 출력 사이에 하위 표현식 공유

filtered_data = [y for x in data if (y := f(x)) is not None]

= 연산자란 무엇입니까?

간단히 말해 =는 식 + 할당 연산자입니다.식을 실행하고 해당 식의 결과를 단일 변수에 할당합니다.

= 연산자가 필요한 이유는 무엇입니까?

단순한 유용한 사례는 재지정성을 유지하면서 포괄적인 함수 호출을 줄이는 것입니다.

목록 이해도를 고려하여 하나를 추가하고 := 연산자 없이 결과가 0보다 클 경우 필터링합니다.여기서 add_one 함수를 두 번 호출해야 합니다.

[add_one(num) for num in numbers if add_one(num) > 0]

사례 1:

def add_one(num):
    return num + 1

numbers = [1,2,3,4,-2,45,6]


result1 = [value for num in numbers if (value := add_one(num)) > 0]
>>> result1
[2, 3, 4, 5, 46, 7]

결과는 예상대로이며 add_one 함수를 호출하여 두 번 호출할 필요가 없으며, 이는 다음과 같은 이점을 보여줍니다:= 연산자

walarus를 사용할 때 주의:= 연산자는 목록 이해를 사용합니다.

아래의 사례는 다음과 같은 경우를 사용하여 := 연산자의 사용을 더 잘 이해하는 데 도움이 될 수 있습니다.

사례 2:

def add_one(num):
    return num + 1

numbers = [1,2,3,4,-2,45,6]

>>> result2 = [(value := add_one(num)) for num in numbers if value > 0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
NameError: name 'value' is not defined

사례 3: 전역 변수가 양수로 설정된 경우

def add_one(num):
    return num + 1

numbers = [1,2,3,4,-2,45,6]

value = 1

result3 = [(value := add_one(num)) for num in numbers if value > 0]
>>> result3
[2, 3, 4, 5, -1]

사례 4: 전역 변수가 음수로 설정된 경우

def add_one(num):
    return num + 1

numbers = [1,2,3,4,-2,45,6]

value = -1

result4 = [(value := add_one(num)) for num in numbers if value > 0]
>>> result4
[]

언급URL : https://stackoverflow.com/questions/50297704/what-are-assignment-expressions-using-the-walrus-or-operator-why-was-t

반응형