개발/Python

"return list.sort ()"가 목록이 아닌 None을 반환하는 이유는 무엇입니까?

MinorMan 2020. 9. 18. 11:45
반응형

<질문>

findUniqueWords가 정렬 된 목록을 생성하는지 확인할 수있었습니다. 그러나 목록을 반환하지 않습니다. 왜?

def findUniqueWords(theList):
    newList = []
    words = []

    # Read a line at a time
    for item in theList:

        # Remove any punctuation from the line
        cleaned = cleanUp(item)

        # Split the line into separate words
        words = cleaned.split()

        # Evaluate each word
        for word in words:

            # Count each unique word
            if word not in newList:
                newList.append(word)

    answer = newList.sort()
    return answer

<답변1>

list.sort는 목록을 제자리에 정렬합니다. 즉, 새 목록을 반환하지 않습니다. 그냥 써

newList.sort()
return newList

<답변2>

문제는 여기에 있습니다.

answer = newList.sort()

정렬은 정렬 된 목록을 반환하지 않습니다. 오히려 목록을 제자리에 정렬합니다.

사용하다:

answer = sorted(newList)

<답변3>

다음은 Python의 개발 목록에있는 Guido van Rossum이 객체에 영향을 미치는 작업에 대해 자신을 반환하지 않고 새 작업을 반환하지 않는 이유를 설명하는 이메일입니다.

이것은 하나의 객체에 대한 일련의 부작용이 다음과 같이 연결될 수있는 코딩 스타일 (다른 다양한 언어에서 인기가 있으며 특히 Lisp가 그것을 좋아한다고 생각합니다)에서 비롯됩니다 : x.compress (). chop (y) .sort ( z) x.compress ()와 동일합니다. x.chop (y) x.sort (z) 체인이 가독성에 위협이된다고 생각합니다. 독자가 각 방법에 대해 잘 알고 있어야합니다. 두 번째 형식은 이러한 각 호출이 동일한 객체에 대해 작동 함을 명확하게하므로 클래스와 해당 메서드를 잘 모르더라도 두 번째 및 세 번째 호출이 x에 적용된다는 것을 이해할 수 있습니다. 모든 호출은 부작용에 대한 것입니다.) 문자열 처리 작업과 같이 새 값을 반환하는 작업에 대한 연결을 예약하고 싶습니다. y = x.rstrip ( "\ n"). split ( ":"). lower ()


<답변4>

파이썬은 list.sort, list.append 및 random.shuffle과 같이 데이터를 변경하는 함수 및 메서드에서 None을 습관적으로 반환하며, 변경되었다는 사실을 암시한다는 생각을 가지고 있습니다.

iterable을 가져 와서 새로운 정렬 된 항목 목록을 반환하려면 정렬 된 내장 함수를 사용하십시오.


<답변5>

파이썬에는 정렬 방법 (또는 "멤버 함수")과 정렬 함수의 두 가지 종류가 있습니다. 정렬 방법은 이름이 지정된 객체의 내용에 대해 작동합니다. 객체가 자신을 재정렬하기 위해 수행하는 작업이라고 생각하면됩니다. 정렬 함수는 개체가 나타내는 데이터에 대한 작업이며 정렬 된 순서로 동일한 내용을 가진 새 개체를 반환합니다.

l이라는 정수 목록이 주어지면 l.sort ()를 호출하면 목록 자체가 재정렬됩니다.

>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]

이 메서드에는 반환 값이 없습니다. 하지만 l.sort ()의 결과를 할당하려고하면 어떨까요?

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None

r은 이제 실제로 아무것도 같지 않습니다. 이것은 프로그래머가 파이썬에서 한동안 부재 한 후 잊을 수있는 이상하고 다소 성가신 세부 사항 중 하나입니다 (이것이 제가 이것을 작성하는 이유이므로 다시 잊지 않습니다).

반면에 sorted () 함수는 l의 내용에 대해 아무것도하지 않지만 l과 동일한 내용을 가진 새로운 정렬 된 목록을 반환합니다.

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = sorted(l)
>>> l
[1, 5, 2341, 467, 213, 123]
>>> r
[1, 5, 123, 213, 467, 2341]

반환 된 값은 딥 카피가 아니므로 평소와 같이 목록에 포함 된 요소에 대한 부작용에주의하십시오.

>>> spam = [8, 2, 4, 7]
>>> eggs = [3, 1, 4, 5]
>>> l = [spam, eggs]
>>> r = sorted(l)
>>> l
[[8, 2, 4, 7], [3, 1, 4, 5]]
>>> r
[[3, 1, 4, 5], [8, 2, 4, 7]]
>>> spam.sort()
>>> eggs.sort()
>>> l
[[2, 4, 7, 8], [1, 3, 4, 5]]
>>> r
[[1, 3, 4, 5], [2, 4, 7, 8]]

<답변6>

목록을 반환하지 않는 이유를 이해하려면 :

sort ()는 어떤 값도 반환하지 않는 반면 sort () 메서드는 주어진 목록의 요소를 특정 순서 (값을 반환하지 않고 오름차순 또는 내림차순)로 정렬합니다.

따라서 문제는 answer = newList.sort ()입니다. 여기서 answer는 none입니다.

대신 newList.sort ()를 반환 할 수 있습니다.

sort () 메서드의 구문은 다음과 같습니다.

list.sort(key=..., reverse=...)

또는 동일한 목적으로 Python의 내장 함수 sorted ()를 사용할 수도 있습니다.

sorted(list, key=..., reverse=...)

참고 : sort ()와 sorted ()의 가장 간단한 차이점은 sort ()는 값을 반환하지 않는 반면 sorted ()는 반복 가능한 목록을 반환한다는 것입니다.

따라서 귀하의 경우 답변 = sorted (newList).


<답변7>

정렬 된 목록을 반환하려면 sorted () 메서드를 사용할 수 있습니다. 더 편리합니다.

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
sorted(l1,reverse=True)

list.sort () 메서드는 목록을 제자리에서 수정하고 None을 반환합니다.

여전히 정렬을 사용하려면이 작업을 수행 할 수 있습니다.

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
반응형