Python에서 슬라이싱이 아닌 Catch-All Unpacking을 사용해야 하는 이유

프로그래밍에 관해서는 올바른 방법이 있고 올바른 방법이 있습니다. 이것이 사실인 Python 언어 내에서 많은 경우가 있습니다.

목록은 다양한 사용 사례가 있는 Python의 기본 데이터 구조입니다. 목록을 "첫 번째"및 "나머지"쌍으로 분할하는 알고리즘이 필요한 경우가 많이 있습니다. 이는 일반적으로 인덱싱 및 슬라이싱을 사용하여 수행됩니다. 예를 들어:

names = ["Alice", "Bob", "Carol", "Dave", "Elon"]
alice = names[0]
bob = names[1]
everyone_else = names[2:]


위의 코드 조각은 정확하지만 여러 가지 이유로 옳지 않습니다.
  • 아주 간단한 것을 달성하기 위해 세 줄의 코드를 사용했습니다.
  • 주문을 미리 알아야 합니다

  • 하나씩 오류가 발생할 수 있으므로 오류가 발생하기 쉽습니다
  • .

    오류가 발생하기 쉬운 이유는 무엇입니까? 😔



    미래에 우리가 경계나 인덱스 값을 변경하고 싶을 수 있으며 다른 사람들을 위해 그렇게 하는 것을 잊어버릴 수 있습니다. 이것은 물론 오류나 예측할 수 없는 결과로 이어질 수 있습니다.

    구조를 위한 캐치올 언패킹 🔥



    이 상황을 해결하기 위해 Python은 별표 표시된 표현식을 사용하여 포괄적인 압축 풀기를 지원합니다. 이렇게 하면 인덱싱이나 슬라이싱을 사용하지 않고도 위와 동일한 결과를 얻을 수 있습니다.

    names = ["Alice", "Bob", "Carol", "Dave", "Elon"]
    alice, bob, *everyone_else = names
    


    🤯 이제는 그게 미인이 아니잖아요! 우리는 지금:
  • 한 줄로 줄였습니다
  • 읽기 쉽게 만들었습니다
  • 더 이상 라인 간에 동기화를 유지해야 하는 경계 인덱스의 오류가 발생하기 쉬운 취성을 처리할 필요가 없습니다.

  • 별표 표시된 표현에 대해 자세히 알아보기 ⭐️



    별표 표시된 표현식의 장점은 원하는 위치에 배치할 수 있다는 것입니다. 이렇게 하면 한 조각을 추출해야 할 때마다 포괄적인 압축 풀기의 이점을 얻을 수 있습니다.

    names = ["Alice", "Bob", "Carol", "Dave", "Elon"]
    alice, *everyone_else, elon = names
    


    🧐



    catch-all unpacking을 사용할 때 두 가지 문제가 있습니다. 첫 번째는 최소한 하나의 필수 부품이 있어야 한다는 것을 기억하는 것입니다. 그렇지 않으면 SyntaxError 에 직면하게 됩니다. 예를 들어:

    *everyone = names
    


    결과:

    SyntaxError: starred assignment target must be in a list or tuple
    


    두 번째는 단일 수준의 압축 풀기 구조에서 여러 포괄 표현식을 사용할 수 없다는 것입니다.

    alice, *some_people, *other_people, elon = names
    


    결과:

    SyntaxError: multiple starred expressions in assignment
    


    다단계 구조의 캐치올 언패킹 💪



    두 번째 문제는 단일 수준 구조(목록, 튜플)에 해당됩니다. 그러나 다단계 구조를 사용하는 경우에는 약간 다르게 작동합니다.
    예를 들어:

    classrooms = {
        "classroom 1": ["Alice", "Bob", "Carol"],
        "classroom 2": ["David", "Elon"],
    }
    (
        (class_1, (best_student_1, *other_students_1)),
        (class_2, (*other_students_2, best_student_2)),
    ) = classrooms.items()
    
    print(
        f"The best student in {class_1} is {best_student_1} not the other {len(other_students_1)}"
    )
    print(
        f"The best student in {class_2} is {best_student_2} not the other {len(other_students_2)}"
    )
    


    출력은 다음과 같습니다.

    The best student in classroom 1 is Alice not the other 2
    The best student in classroom 2 is Elon not the other 1
    


    이것은 대괄호를 사용하면 약간 이상하게 보일 수 있지만 슬라이싱 및 인덱싱을 사용하는 것보다 훨씬 더 읽기 쉽고 깨끗합니다.

    기타 주의사항 📝



    더 이상 포장 풀기



    올바르게 사용하면 별표 표시된 표현식은 항상 목록이 됩니다. 그러나 시퀀스에서 압축을 풀 항목이 더 이상 없으면 빈 목록이 생성됩니다[].

    books = ["Harry Potter", "Narnia"]
    harry_potter, narnia, *other_books = books
    print(harry_potter)
    print(narnia)
    print(other_books)
    


    산출

    Harry Potter
    Narnia
    []
    


    반복자에 대한 포괄적인 풀기



    Catch-All Unpacking의 또 다른 좋은 점은 반복자에서도 사용할 수 있다는 것입니다. 예를 들어:

    movies = iter(["Star Wars", "The Godfather", "The Matrix", "Goodfellas"])
    star_wars, the_godfather, *other_movies = movies
    


    위의 스니펫은 매우 기본적이며 실제로는 표준 목록으로 대체되어야 합니다. 그러나 아이디어는 CSV 파일(예:)을 처리하는 경우 이를 확장할 수 있다는 것입니다.

    최종 테이크아웃



    이것은 슬라이싱 및 인덱싱보다 Catch-All Unpacking을 선호해야 하는 이유를 대략적으로 요약합니다. 주요 내용은 다음과 같습니다.
  • catch-all은 슬라이싱 및 인덱싱에 비해 시각적으로 더 깔끔합니다
  • .
  • 오류가 훨씬 적습니다.

  • 별표 표시된 표현식은 모든 위치에 나타날 수 있으며 항상 0개 이상의 요소를 포함하는 list 가 발생합니다
  • .



    이 게시물을 즐겼다면. Twitter에서 나를 팔로우하십시오.
    GitHub: @sixfwa

    좋은 웹페이지 즐겨찾기