Python에서 슬라이싱이 아닌 Catch-All Unpacking을 사용해야 하는 이유
9637 단어 pythondjangotutorialdevelopment
목록은 다양한 사용 사례가 있는 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을 선호해야 하는 이유를 대략적으로 요약합니다. 주요 내용은 다음과 같습니다.
별표 표시된 표현식은 모든 위치에 나타날 수 있으며 항상 0개 이상의 요소를 포함하는
list
가 발생합니다이 게시물을 즐겼다면. Twitter에서 나를 팔로우하십시오.
GitHub: @sixfwa
Reference
이 문제에 관하여(Python에서 슬라이싱이 아닌 Catch-All Unpacking을 사용해야 하는 이유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sixfwa/why-you-should-use-catch-all-unpacking-and-not-slicing-in-python-4l5a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)