파이썬 바다코끼리 연산자
Beautiful is better than ugly.
Python은 버전 3.8.0에서 변수에 값을 할당하는 완전히 새로운 방법을 도입했습니다. 새 구문은
:=
이며 한 쌍의 눈과 한 쌍의 엄니처럼 보이기 때문에 "바다코끼리 연산자"라고 합니다. 바다코끼리 연산자는 더 큰 표현식의 일부로 값을 할당하며 많은 영역에서 가독성을 크게 높일 수 있습니다.명명된 표현식
바다코끼리 연산자를 사용하여 명명된 표현식을 만들 수 있습니다. 명명된 표현식의 형식은
NAME := expression
또는 x := 34
와 같이 numbers := list(range(10))
입니다. Python 코드는 expression
를 사용하여 더 큰 표현식(예: if
문)을 평가할 수 있으며 변수 NAME
에는 표현식의 값이 할당됩니다.이전에 Swift 코드를 작성한 적이 있다면 Python의 walrus 연산자는 Swift의 Optional Chaining 과 유사합니다. 선택적 연결을 사용하면
if
문의 조건부 내에서 변수에 값을 할당합니다. 새 변수의 값이 nil
(Python의 None
처럼)가 아니면 if
블록이 실행됩니다. 변수 값이 nil
이면 블록이 무시됩니다.let responseMessages = [
200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"
]
let response = 444
if let message = responseMessages[response] {
// This statement won't be run because message is nil
print("Message: " + message)
}
이익
코드에서 바다코끼리 연산자를 사용하면 많은 이점이 있습니다. 그러나 그것을 위해 내 말을 받아들이지 마십시오! 아이디어 작성자가 제안서에서 말한 내용은 다음과 같습니다.
Naming the result of an expression is an important part of programming, allowing a descriptive name to be used in place of a longer expression, and permitting reuse.
몇 가지 예를 살펴보겠습니다.
자신을 반복하지 마십시오
바다코끼리 연산자를 사용하면 DRY principle을 더 쉽게 고수하고 코드에서 자신을 반복하는 빈도를 줄일 수 있습니다. 예를 들어 목록이 너무 긴 경우 오류 메시지를 인쇄하려는 경우 실수로 목록 길이를 두 번 얻을 수 있습니다.
my_long_list = list(range(1000))
# You get the length twice!
if len(my_long_list) > 10:
print(f"List is too long to consume (length={len(my_long_list)}, max=10)")
walrus 연산자를 사용하여 목록의 길이를 한 번만 찾고 그 길이를
if
문의 범위 내에서 유지해 보겠습니다.my_long_list = list(range(1000))
# Much better :)
if (count := len(my_long_list)) > 10:
print(f"List is too long to consume (length={count}, max=10)")
위의 코드 블록에서
count := len(my_long_list)
는 1000
값을 count
에 할당합니다. 그런 다음 if
문은 if len(my_long_list) > 10
로 평가됩니다. 바다코끼리 연산자는 여기에 두 가지 이점이 있습니다.count
문의 범위 내에서 if
변수를 사용할 것임을 명확하게 보여줍니다. 변수 재사용
또 다른 일반적인 예는 Python의 정규식 라이브러리
re
를 사용하는 것입니다. 전화번호 목록을 보고 지역 번호가 있는 경우 해당 지역 번호를 인쇄하려고 합니다. 바다코끼리 연산자를 사용하여 지역 코드가 있는지 여부를 확인하고 한 줄로 변수에 할당할 수 있습니다.import re
phone_numbers = [
"(317) 555-5555",
"431-2973",
"(111) 222-3344",
"(710) 982-3811",
"290-2918",
"711-7712",
]
for number in phone_numbers:
# The regular expression "\(([0-9]{3})\)" checks for a substring
# with the pattern "(###)", where # is a 0-9 digit
if match := re.match("\(([0-9]{3})\)", number):
print(f"Area code: {match.group(1)}")
else:
print("No area code")
읽기 쉬운 코드 블록
일반적인 프로그래밍 패턴은 작업을 수행하고 결과를 변수에 할당한 다음 결과를 확인하는 것입니다.
result = parse_field_from(my_data)
if result:
print("Success")
많은 경우에 이러한 유형의 블록은 walrus 연산자로 정리하여 하나의 들여쓰기된 코드 블록이 될 수 있습니다.
if result := parse_field_from(my_data):
print("Success")
이러한 블록을 함께 연결하여 중첩된 검사 문을 if/elif/else 문 한 줄로 변환할 수 있습니다. 예를 들어 사전에서 몇몇 학생을 살펴보겠습니다. 각 학생의 졸업 날짜(있는 경우) 또는 학생 ID(가능한 경우)를 인쇄해야 합니다.
sample_data = [
{"student_id": 200, "name": "Sally West", "graduation_date": "2019-05-01"},
{"student_id": 404, "name": "Zahara Durham", "graduation_date": None},
{"student_id": 555, "name": "Connie Coles", "graduation_date": "2020-01-15"},
{"student_id": None, "name": "Jared Hampton", "graduation_date": None},
]
for student in sample_data:
graduation_date = student["graduation_date"]
if graduation_date:
print(f'{student["name"]} graduated on {graduation_date}')
else:
# This nesting can be confusing!
student_id = student["student_id"]
if student_id:
print(f'{student["name"]} is currently enrolled with ID {student_id}')
else:
print(f'{student["name"]} has no data")
바다코끼리 연산자를 사용하여 졸업 날짜와 학생 ID 확인을 나란히 놓고 각 학생에 대해 하나 또는 다른 것을 확인하고 있음을 더 잘 보여줄 수 있습니다.
sample_data = [
{"student_id": 200, "name": "Sally West", "graduation_date": "2019-05-01"},
{"student_id": 404, "name": "Zahara Durham", "graduation_date": None},
{"student_id": 555, "name": "Connie Coles", "graduation_date": "2020-01-15"},
{"student_id": None, "name": "Jared Hampton", "graduation_date": None},
]
for student in sample_data:
# Much cleaner
if graduation_date := student["graduation_date"]:
print(f'{student["name"]} graduated on {graduation_date}')
elif student_id := student["student_id"]:
print(f'{student["name"]} is currently enrolled with ID {student_id}')
else:
print(f'{student["name"]} has no data")
마무리
해마 연산자와 명명된 표현식을 사용하면 명령문을 단순화하고 변수를 재사용하고 들여쓰기를 줄여 코드의 가독성을 크게 높일 수 있습니다. 더 좋은 예를 보려면 original proposal 및 Python 3.8release notes 을 확인하십시오.
Reference
이 문제에 관하여(파이썬 바다코끼리 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nickymarino/python-s-walrus-operator-4ba3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)