파이썬 바다코끼리 연산자

17129 단어 pythontutorial
이 게시물은 원래 my website에 게시되었습니다. 더 멋진 콘텐츠를 확인하세요!

Beautiful is better than ugly.

The Zen of Python



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.

PEP 572 – Assignment Expressions



몇 가지 예를 살펴보겠습니다.

자신을 반복하지 마십시오



바다코끼리 연산자를 사용하면 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 을 확인하십시오.

    좋은 웹페이지 즐겨찾기