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

Python TypeError:'NoneType' 개체는 반복할 수 없습니다. 해결 방법

Python을 사용하면 해당 객체에 값이 있는 경우에만 객체를 반복할 수 있습니다. iterable 객체에는 값이 None이 아닌 경우 액세스할 수 있는 다음 항목만 있기 때문입니다. None 개체에 대해 반복하려고 하면 TypeError: ‘NoneType’ object is not iterable가 발생합니다. 오류.

이 가이드에서는 이 오류의 의미와 오류가 발생할 수 있는 이유에 대해 설명합니다. 이 일반적인 Python 오류를 해결하는 방법을 해결하는 데 도움이 되는 예를 살펴보겠습니다.

TypeError:'NoneType' 개체를 반복할 수 없습니다.

객체가 반복 가능하려면 값을 포함해야 합니다. None 값은 객체를 포함하지 않기 때문에 반복할 수 없습니다. 없음은 null 값을 나타냅니다.

None 객체와 빈 iterable 사이에는 차이가 있습니다. 빈 목록이나 문자열이 있는 경우 이 오류가 발생하지 않습니다.

이는 목록과 문자열에 반복 가능한 데이터 유형이 있기 때문입니다. Python 인터프리터가 빈 목록을 만나면 값이 없기 때문에 반복하지 않습니다. Python은 None 값을 반복할 수 없으므로 인터프리터는 오류를 반환합니다.

이 오류는 함수를 선언하고 값을 반환하는 것을 잊었을 때 흔히 발생합니다.

예시 시나리오

학생 이름 목록을 가져와서 "E"로 시작하는 이름을 걸러내는 프로그램을 작성해 보겠습니다. 우리는 그 값들을 콘솔에 출력할 것입니다.

먼저 학생의 이름을 필터링하는 함수를 정의합니다.

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

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

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)

이 함수는 for 루프를 사용하여 "class_names" 목록의 모든 항목을 반복합니다. 각 항목에 대해 루프는 항목이 문자 "E"로 시작하는지 확인합니다. 그렇다면 해당 이름이 "new_class_names" 목록에 추가됩니다.

다음으로 새 목록을 살펴보고 각 값을 콘솔에 출력하는 함수를 작성하십시오.

def show_students(class_names):
	for c in class_names:
		print(c)

여기에서 우리 프로그램이 검색해야 하는 학생 목록을 선언합니다. filter_students 함수를 통해 이 학생 목록을 전달합니다.

students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

이 코드는 이름이 "E"로 시작하는 모든 학생을 찾는 filter_students 함수를 실행합니다. 이름이 "E"로 시작하는 학생 목록을 Students_e_name이라고 합니다. 다음으로 show_students 함수를 호출하여 새 학생 목록을 표시합니다.

show_students(students_e_name)

코드를 실행하고 어떤 일이 일어나는지 봅시다:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
	show_students(students_e_name)
  File "main.py", line 8, in show_students
	for c in class_names:
TypeError: 'NoneType' object is not iterable

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

솔루션

show_students 함수에서 class_name 변수를 반복하려고 하면 코드에서 None 값을 감지하고 오류가 발생합니다. "class_names"로 전달한 값이 None이기 때문입니다.

이 오류는 filter_students 함수가 값을 반환하지 않기 때문에 발생합니다. filter_students 함수의 결과를 Students_e_name 변수에 할당하면 None 값이 설정됩니다.

이 오류를 해결하려면 filter_students 함수에서 값을 반환해야 합니다.

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
      # We have added a return statement here
	return new_class_names
        
def show_students(class_names):
	for c in class_names:
		print(c)
    
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

이 코드는 new_class_names의 값을 다시 메인 프로그램으로 반환합니다.

코드를 실행하여 작동하는지 확인해 보겠습니다.

Elena

이제 우리 코드는 이름이 "E"로 시작하는 학생의 이름을 성공적으로 출력합니다.

NoneType 예외 방지

기술적으로 해당 값을 반복하기 전에 값이 None인지 확인하여 NoneType 예외를 피할 수 있습니다. 다음 코드를 고려하십시오.

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
	return new_class_names

def show_students(class_names):
	if class_names is not None:
		for c in class_names:
			print(c)
            
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

"show_students()" 함수는 반복을 시도하기 전에 class_names가 None 값인지 확인하기 때문에 성공적으로 실행됩니다. NoneType 오류의 원인이 코드의 다른 부분에서 문제가 될 수 있기 때문에 이것은 대부분의 경우 모범 사례가 아닙니다.

전체 프로그램에 "is not None" 체크를 추가하면 다른 함수에서 return 문을 놓쳤는지 알 수 없습니다. 그렇기 때문에 이 오류가 표시되면 "is not None" 체크를 사용하여 예외를 처리하는 것보다 예외를 수락하는 것이 가장 좋습니다.



결론

TypeError: ‘NoneType’ object is not iterable 값이 None인 객체를 반복하려고 하면 오류가 발생합니다.

이 오류를 해결하려면 반복하려는 값에 문자열이나 목록과 같은 반복 가능한 객체가 할당되었는지 확인하십시오. 이 예에서 함수에 "return" 문을 추가하는 것을 잊었습니다. 이로 인해 함수는 목록 대신 None을 반환했습니다.

이제 코드에서 이 일반적인 Python 오류를 해결할 준비가 되었습니다.