문제

저는 지금 수업을 위해 Python을 배우고 있는데 데이터 유형 중 하나로 튜플을 다루었습니다.Wikipedia 페이지를 읽었지만 그러한 데이터 유형이 실제로 어디에 유용할지 알 수 없었습니다.불변의 숫자 집합이 필요한 Python에서 몇 가지 예를 들어볼 수 있나요?이것이 목록과 어떻게 다른가요?

도움이 되었습니까?

해결책

  • 튜플은 함수에서 여러 결과를 반환하려고 할 때마다 사용됩니다.
  • 불변이기 때문에 사전의 키로 사용할 수 있습니다(목록은 사용할 수 없음).

다른 팁

튜플은 두 개 이상의 데이터를 키에 결합해야 하고 이에 대한 클래스를 만들고 싶지 않을 때 좋은 사전 키가 됩니다.

a = {}
a[(1,2,"bob")] = "hello!"
a[("Hello","en-US")] = "Hi There!"

저는 이 기능을 주로 메시 정점의 좌표인 키가 포함된 사전을 만드는 데 사용했습니다.그러나 내 특별한 경우에는 관련된 부동 소수점의 정확한 비교가 잘 작동했는데 이는 귀하의 목적에 항상 해당되지 않을 수도 있습니다. [이 경우 들어오는 부동 소수점을 일종의 고정 소수점 정수로 변환할 것입니다.]

좋아요 이 설명.

기본적으로 상수 구조(첫 번째 위치는 항상 한 유형의 값을 보유하고 두 번째 위치는 다른 유형의 값 등)가 있는 경우 튜플을 사용해야 하며, 동종 값 목록에는 목록을 사용해야 합니다.

물론 항상 예외가 있지만 이는 좋은 일반적인 지침입니다.

튜플과 리스트는 일반적으로 동일한 용도로 사용됩니다.일반적으로 불변 데이터 유형에는 동시성 문제와 관련하여 많은 이점이 있습니다.

따라서 본질적으로 휘발성이 아닌 목록이 있고 이를 변경하는 소비자가 없다는 것을 보장해야 하는 경우 튜플을 사용할 수 있습니다.

일반적인 예로는 회사 부서, 카테고리 등과 같은 애플리케이션의 고정 데이터가 있습니다.이 데이터가 변경되면 일반적으로 단일 생산자가 튜플을 다시 작성합니다.

그것에 대해 생각하는 가장 좋은 방법은 다음과 같습니다.

  • 튜플은 기록 필드에 이름이 없습니다.
  • 필드 이름을 지정하는 것이 귀찮을 때 레코드 대신 튜플을 사용합니다.

따라서 다음과 같은 내용을 작성하는 대신:

person = {"name": "Sam", "age": 42}
name, age = person["name"], person["age"]

또는 훨씬 더 자세한 내용은 다음과 같습니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Sam", 42)
name, age = person.name, person.age

다음과 같이 작성할 수 있습니다.

person = ("Sam", 42)
name, age = person

이는 필드가 몇 개만 있는 레코드나 소수의 장소에서만 사용되는 레코드를 전달하려는 경우에 유용합니다.이 경우 필드 이름으로 완전히 새로운 레코드 유형을 지정하는 것은(Python에서는 위와 같이 객체나 사전을 사용합니다) 너무 장황할 수 있습니다.

튜플은 함수형 프로그래밍의 세계에서 유래되었습니다. (Haskell, OCaml, Elm, F# 등), 이러한 목적으로 일반적으로 사용됩니다.Python과 달리 대부분의 함수형 프로그래밍 언어는 정적으로 유형이 지정됩니다(변수는 한 가지 유형의 값만 보유할 수 있으며 해당 유형은 컴파일 타임에 결정됩니다).정적 유형 지정은 튜플의 역할을 더욱 분명하게 만듭니다.예를 들어 Elm 언어에서는 다음과 같습니다.

type alias Person = (String, Int)

person : Person
person = ("Sam", 42)

이는 특정 유형의 튜플이 항상 고정된 순서로 고정된 수의 필드를 가져야 하며 각 필드가 항상 동일한 유형이어야 한다는 사실을 강조합니다.이 예에서 사람은 항상 두 필드의 튜플입니다. 하나는 문자열이고 다른 하나는 정수입니다.

위의 내용은 목록과 완전히 대조됩니다., 이는 가변 길이로 간주되며(항목 수는 일반적으로 각 목록에서 다르며 항목을 추가 및 제거하는 함수를 작성합니다) 목록의 각 항목은 일반적으로 동일한 유형입니다.예를 들어 사람 목록 하나와 주소 목록 하나가 있을 수 있습니다. 동일한 목록에 사람과 주소를 혼합할 수는 없습니다.동일한 튜플 안에 다양한 유형의 데이터를 혼합하는 것이 튜플의 핵심입니다.튜플의 필드는 일반적으로 다른 유형입니다(그러나 항상 그런 것은 아닙니다.당신은 가질 수 있습니다 (Float, Float, Float) x,y,z 좌표를 나타내는 튜플).

튜플과 리스트는 중첩되는 경우가 많습니다. 튜플 목록을 갖는 것이 일반적입니다.Person 객체 목록뿐만 아니라 Person 튜플 목록도 가질 수 있습니다.값이 목록인 튜플 필드를 가질 수도 있습니다.예를 들어, 한 사람이 여러 주소를 가질 수 있는 주소록이 있는 경우 다음 유형의 튜플을 가질 수 있습니다. (Person, [String]).그만큼 [String] type은 일반적으로 함수형 프로그래밍 언어에서 문자열 목록을 나타내는 데 사용됩니다.Python에서는 유형을 기록하지 않지만, 이와 같은 튜플을 동일한 방식으로 사용할 수 있습니다. Person 튜플의 첫 번째 필드에는 객체가 있고 두 번째 필드에는 문자열 목록이 있습니다.

Python에서는 혼란이 발생합니다. 언어가 안 되니까. 억지로 시키다 정적으로 유형이 지정된 기능 언어에서 컴파일러에 의해 시행되는 이러한 관행 중 하나입니다.해당 언어에서는 서로 다른 종류의 튜플을 혼합할 수 없습니다.예를 들어, 다음을 반환할 수 없습니다. (String, String) 유형이 다음을 반환한다고 말하는 함수의 튜플 (String, Integer) 튜플.유형에 튜플을 반환할 계획이라고 나와 있는 경우에도 목록을 반환할 수 없으며 그 반대의 경우도 마찬가지입니다.목록은 항목 컬렉션을 늘리는 데에만 사용되며 튜플은 고정 크기 레코드에만 사용됩니다.Python은 원하는 경우 이러한 규칙을 위반하는 것을 막지 않습니다.

Python에서는 목록이 사전 키로 사용하기 위해 튜플로 변환되는 경우가 있습니다. Python 사전 키는 변경할 수 없어야 하기 때문입니다(예:상수) 값인 반면 Python 목록은 변경 가능합니다(언제든지 항목을 추가하고 제거할 수 있음).이는 컴퓨터 과학 개념으로서의 튜플의 속성이 아니라 Python의 특정 제한 사항에 대한 해결 방법입니다.

따라서 Python에서는 목록은 변경 가능하고 튜플은 변경 불가능합니다.그러나 이것은 단지 디자인 선택일 뿐 컴퓨터 과학의 목록과 튜플의 본질적인 속성은 아닙니다.불변 목록과 가변 튜플을 가질 수도 있습니다.

Python(기본 CPython 구현 사용)에서 튜플은 대부분의 목적에서 객체나 사전보다 빠르므로 객체나 사전을 사용하여 필드 이름을 지정하는 것이 더 명확할 때에도 종종 그런 이유로 사용됩니다.

마지막으로, 튜플이 (다른 종류의 목록이 아닌) 다른 종류의 레코드로 의도되었다는 점을 더욱 분명하게 하기 위해 Python에는 다음과 같은 기능도 있습니다. 명명된 튜플:

from collections import namedtuple

Person = namedtuple("Person", "name age")

person = Person("Sam", 42)
name, age = person.name, person.age

이는 종종 최선의 선택입니다. 새 클래스를 정의하는 것보다 짧지만 필드에 이름이 없는 일반 튜플을 사용할 때보다 필드의 의미가 더 분명합니다.

불변 목록은 다양한 목적에 매우 유용합니다., 그러나 여기서 답변하기에는 주제가 너무 복잡합니다.중요한 점은 변할 수 없는 것들은 변할 수 있는 것보다 추론하기가 더 쉽다는 것입니다.대부분의 소프트웨어 버그는 예상치 못한 방식으로 변경되는 사항에서 발생하므로 변경 가능한 방식을 제한하는 것이 버그를 제거하는 좋은 방법입니다.관심이 있으시면 Elm, Haskell 또는 Clojure(Elm이 가장 친숙합니다)와 같은 함수형 프로그래밍 언어에 대한 튜토리얼을 읽어 보시기 바랍니다.해당 언어의 설계자는 불변성을 매우 유용하다고 생각했습니다. 모두 목록은 변경할 수 없습니다.(항목을 추가하거나 제거하기 위해 목록을 변경하는 대신 항목을 추가하거나 제거하여 새 목록 만들기.불변성은 목록의 이전 복사본이 절대 변경되지 않음을 보장하므로 컴파일러와 런타임은 이전 목록의 일부를 새 목록에서 재사용하고 더 긴 경우 남은 부분을 가비지 수집하여 코드가 잘 작동하도록 할 수 있습니다. 필요합니다.)

나는 항상 두 개 이상의 객체를 세트로 다룰 때 유용하다고 생각합니다.

튜플은 값의 시퀀스입니다.값은 모든 유형이 될 수 있으며 정수로 인덱싱되므로 튜플은 목록과 다릅니다.가장 중요한 차이점은 튜플은 변경할 수 없습니다.

튜플은 쉼표로 구분된 값 목록입니다.

t = 'p', 'q', 'r', 's', 't'

튜플을 괄호로 묶는 것이 좋습니다.

t = ('p', 'q', 'r', 's', 't') 

목록은 기능과 관련하여 항상 튜플을 대체할 수 있습니다(명백히 dict의 키인 경우는 제외).그러나 튜플을 사용하면 작업 속도가 더 빨라질 수 있습니다.예를 들어 Java의 불변 문자열에도 마찬가지입니다. 언제 문자열을 변경할 수 없어야 할까요?절대!

나는 더 나은 프로그램을 만들기 위해 할 수 있는 일을 제한하는 것에 대한 괜찮은 토론을 읽었습니다. 함수형 프로그래밍이 중요한 이유

튜플은 여러 값을 저장하는 데 유용합니다.아시다시피 튜플은 불변의 목록과 같습니다.일단 생성되면 요소를 추가/제거/교체할 수 없습니다.

불변성의 한 가지 이점은 튜플의 크기가 고정되어 있으므로 런타임에서 특정 최적화를 수행할 수 있다는 것입니다.이는 반환 값이나 함수에 대한 매개 변수의 맥락에서 튜플을 사용할 때 특히 유용합니다.

문자열 % 연산과 여러 반환 값과 같이 구문상 필요한 위치 외에도 튜플을 경량 클래스의 형태로 사용합니다.예를 들어, 한 메서드의 호출자에게 불투명 쿠키를 전달한 다음 다른 메서드로 전달하는 개체가 있다고 가정합니다.튜플은 여러 값을 포함하기 위해 별도의 클래스를 정의할 필요 없이 해당 쿠키에 여러 값을 압축하는 좋은 방법입니다.

하지만 나는 이 특정한 용도에 대해 신중하게 생각하려고 노력합니다.쿠키가 코드 전반에 걸쳐 자유롭게 사용되는 경우 사용을 문서화하는 데 도움이 되므로 클래스를 만드는 것이 좋습니다.한 곳에서만 사용되는 경우(예:한 쌍의 메서드) 그런 다음 튜플을 사용할 수 있습니다.어쨌든 Python이기 때문에 튜플로 시작한 다음 호출자의 코드를 변경할 필요 없이 이를 사용자 정의 클래스의 인스턴스로 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top