Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python TypeError:'NoneType' 유형의 객체에 len()이 없습니다.

len() 메서드는 문자열, 목록 및 사전과 같은 반복 가능한 개체에서만 작동합니다. iterable 객체에는 값의 시퀀스가 ​​포함되어 있기 때문입니다. len()을 사용하려고 하면 None 값에 대한 메서드를 사용하면 "TypeError:'NoneType' 유형의 개체에 len()이 없습니다. ".

이 가이드에서는 이 오류의 의미와 작동 방식에 대해 설명합니다. 코드에서 이 오류를 해결하는 방법을 알아낼 수 있도록 이 오류의 두 가지 예를 살펴보겠습니다.

TypeError:'NoneType' 유형의 개체에 len()이 없습니다.

NoneType은 None 데이터 유형을 나타냅니다. len()과 같이 반복 가능한 객체에서 작동하는 메서드는 사용할 수 없습니다. , None 값에서. None에는 값 컬렉션이 포함되어 있지 않기 때문입니다. None에는 자식 값이 없기 때문에 None의 길이를 계산할 수 없습니다.

이 오류는 다음 두 가지 경우에 일반적입니다.

  • 내장 함수가 목록을 제자리에서 변경한다는 사실을 잊어버린 경우
  • 함수에서 return 문을 잊어버린 경우

각각의 원인에 대해 자세히 살펴보겠습니다.

원인 #1:내장 함수가 제자리에서 목록을 변경합니다.

우리는 학교의 학생에 대한 정보가 포함된 사전 목록을 정렬하는 프로그램을 만들 것입니다. 이 목록은 마지막 시험에서 학생의 성적이 오름차순으로 정렬됩니다.

시작하려면 학생과 가장 최근의 시험 ​​점수에 대한 정보가 포함된 사전 목록을 정의하십시오.

students = [
	{"name": "Peter", "score": 76 },
	{"name": "Richard", "score": 63 },
{"name": "Erin", "score": 64 },
{"name": "Miley", "score": 89 }
]

각 사전에는 두 개의 키와 값이 있습니다. 하나는 학생의 이름에 해당하고 다른 하나는 학생이 마지막 시험에서 얻은 점수에 해당합니다. 다음으로 sort()를 사용합니다. 학생 목록을 정렬하는 방법:

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

def score_sort(s):
	return s["score"]



sorted_students = students.sort(key=score_sort)

각 사전에 "score" 값을 반환하는 "score_sort"라는 함수를 선언했습니다. 그런 다음 이를 사용하여 sort()를 사용하여 사전 목록의 항목을 정렬합니다. 방법.

다음으로 목록의 길이를 인쇄합니다.

print("There are {} students in the list.".format(len(sorted_students)))

for 루프를 사용하여 콘솔에 새로운 사전 목록을 출력합니다:

for s in sorted_students:
	print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

이 코드는 "sorted_students" 목록에 있는 각 학생의 마지막 시험에서 학생이 얻은 점수를 알려주는 메시지를 출력합니다. 코드를 실행해 보겠습니다.

Traceback (most recent call last):
  File "main.py", line 13, in <module>
	print("There are {} students in the list.".format(len(sorted_students)))
TypeError: object of type 'NoneType' has no len()

코드가 오류를 반환합니다.

이 문제를 해결하려면 sort()의 결과를 할당하는 코드를 제거해야 합니다. 방법을 "sorted_students"로 지정합니다. sort() 메소드는 제자리에서 목록을 변경합니다. 새 목록을 만들지 않습니다.

"sorted_students" 목록의 선언을 제거하고 프로그램의 나머지 부분에서 "students"를 사용합니다.

students.sort(key=score_sort)

print("There are {} students in the list.".format(len(students)))

for s in students:
	print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

코드를 실행하고 어떤 일이 일어나는지 확인하세요:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

코드가 성공적으로 실행됩니다. 먼저 코드는 목록에 있는 학생 수를 알려줍니다. 그런 다음 코드는 각 학생에 대한 정보와 마지막 시험에서 얻은 점수를 출력합니다. 이 정보는 학생 학년의 오름차순으로 인쇄됩니다.

원인 #2:반환 문을 잊어버림

우리는 코드를 더 모듈화할 것입니다. 이를 위해 정렬 방법을 자체 기능으로 이동합니다. 또한 각 학생이 시험에서 얻은 점수에 대한 정보를 출력하는 함수를 정의할 것입니다.

먼저 학생 목록과 정렬 도우미 기능을 정의합니다. 튜토리얼의 앞부분에서 이 코드를 빌릴 것입니다.

students = [
	{"name": "Peter", "score": 76 },
	{"name": "Richard", "score": 63 },
{"name": "Erin", "score": 64 },
{"name": "Miley", "score": 89 }
]

def score_sort(s):
	return s["score"]

다음으로 목록을 정렬하는 함수를 작성합니다.

def sort_list(students):
	students.sort(key=score_sort)

마지막으로 각 학생의 성과에 대한 정보를 표시하는 함수를 정의합니다.

def show_students(new_students):
	print("There are {} students in the list.".format(len(students)))
	for s in new_students:
			 print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

코드를 실행하기 전에 함수를 호출해야 합니다.

new_students = sort_list(students)
show_students(new_students)

프로그램은 먼저 sort_list()를 사용하여 목록을 정렬합니다. 함수. 그런 다음 우리 프로그램은 각 학생에 대한 정보를 콘솔에 출력합니다. 이것은 show_students()에서 처리됩니다. 기능.

코드를 실행해 보겠습니다.

Traceback (most recent call last):
  File "main.py", line 21, in <module>
	show_students(new_students)
  File "main.py", line 15, in show_students
	print("There are {} students in the list.".format(len(new_students)))
TypeError: object of type 'NoneType' has no len()

코드가 오류를 반환합니다. 이 오류는 "sort_list" 함수에 "return" 문을 포함하는 것을 잊어버렸기 때문에 발생했습니다.

sort_list()를 호출할 때 함수에 대한 응답을 "new_students" 변수에 할당합니다. 해당 변수는 show_students()에 전달됩니다. 각 학생에 대한 정보를 표시하는 기능입니다. 이 오류를 해결하려면 sort_list()에 return 문을 추가해야 합니다. 함수:

def sort_list(students):
	students.sort(key=score_sort)
	return students

코드 실행:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

코드는 예상한 응답을 반환합니다.

결론

"TypeError:'NoneType' 유형의 개체에 len()이 없습니다. ” 오류는 len()을 사용하려고 할 때 발생합니다. 값이 None인 개체에 대한 메서드입니다.

이 오류를 해결하려면 sort()와 같은 내장 목록 메서드의 응답을 할당하지 않았는지 확인하십시오. , 변수에. 이렇게 해도 오류가 해결되지 않으면 프로그램이 성공적으로 작동하는 데 필요한 모든 "반환" 문이 있는지 확인하십시오.

이제 Python 전문가처럼 이 문제를 해결할 준비가 되었습니다!