할당 표현식이란 무엇입니까("왈러스" 또는 ":=" 연산자 사용)?이 구문이 추가된 이유는 무엇입니까?
파이썬 3.8부터 코드는 소위 "왈러스" 연산자를 사용할 수 있습니다.:=
), 할당 표현식에 대해 PEP 572에 문서화되어 있습니다.
이것은 정말 실질적인 새로운 기능처럼 보입니다. 왜냐하면 이것은 이해와 이해 내에서 이러한 형태의 과제를 허용하기 때문입니다.lambda
s.
과제 표현식의 구문, 의미론 및 문법 사양은 정확히 무엇입니까?
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)
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
'programing' 카테고리의 다른 글
공백을 포함한 줄 길이별로 텍스트 파일 정렬 (0) | 2023.05.25 |
---|---|
각 루프에 대해 루프의 마지막 반복을 결정합니다. (0) | 2023.05.25 |
Winforms에서 컨트롤에 대한 속성 바인딩 (0) | 2023.05.25 |
쿼리를 사용하여 기존 테이블에 대한 SQL 생성 스크립트 생성 (0) | 2023.05.25 |
Eclipse 출력 콘솔의 용량을 늘리려면 어떻게 해야 합니까? (0) | 2023.05.25 |