Найти - Пользователи
Полная версия: index out of range
Начало » Python для новичков » index out of range
1
robot_chickn
Ребят, вопрос в следующем, использую процедуру для обсчета некоторых данных, на выходе она должна давать 2 значения. Почему то иногда появляется следующая ошибка:

IndexError: index out of range: 3 in <script> at line number 230

Вот мой упрощенный кусок кода:
def GEO_attitude():
  lan1 = 2.3474
  lan2 = 5.049
  lat1 = 384.3
  lat2 = 384.3888
  lan0 = (lan1 + lan2) / 2
  lat0 = (lat1 + lat2) / 2
return lan0, lat0
#####################
lan, lat = GEO_attitude()                      # это и есть строчка 230

Из-за чего может периодически ломаться алгоритм в этом месте?
FishHook
Нужен код полностью
robot_chickn
вот полный кусок кода с процедурой

#####################################################################
# Процедура по определению GPS данных c двойной проверкой
def GEO_attitude():
	waiting = True
	lan0 = 0
	lat0 = 0
	lan1 = 0
	lat1 = 0
	lan2 = 0
	lat2 = 0
	while waiting:		# Цикл по выкачиванию данных с GPS модуля
		data = tn.read_until("*")
		lines = data.split("\n")
		for line in lines:		# Цикл обработки закаченной информации по строками
			values = line.split(',')	          # Разбиваем данные по запятым и ищем нужные строки 
			if values[0] == '$GPGGA' or values[0] == '$GPRMC':
				if values[0] == '$GPRMC':
					if lan1 < 0.0001 or lat1 < 0.0001:   # Записываем данные
						try:
    							lan1 = float(values[3])
    							lat1 = float(values[5])
							timeUTC = float(values[1])
						except ValueError:
							data = []						
					else:
						try:
    							lan2 = float(values[3])
    							lat2 = float(values[5])
							timeUTC = float(values[1])
						except ValueError:
							data = []						
					if lan1 > 0 and lan2 > 0:
# Сравниваем данные на актуальность
						if (abs(lan1 - lan2) < 60.00 / 10000) and (abs(lat1 - lat2) < 60.00/ 10000):
							lan0 = (lan1 + lan2) / 2		# Сохраняем усредненные данные
							lat0 = (lat1 + lat2) / 2
							print 'CurrentPosition:'
							print lan0
							print lat0
							print 'Time: '
							print timeUTC
							waiting = False
	#						break
						else :
							lat1 = lat2	  # Сохраняем вторичные данные и закачиваем данные снова
							lan1 = lan2
					data = ''
					lines = ''
				else:
					if lan1 < 0.0001 or lat1 < 0.0001:
						try:
    							lan1 = float(values[2])
    							lat1 = float(values[4])
							timeUTC = float(values[1])
						except ValueError:
							data = []						
					else:
						try:
    							lan2 = float(values[2])
    							lat2 = float(values[4])
							timeUTC = float(values[1])
						except ValueError:
							data = []				
					if lan1 > 0 and lan2 > 0:
						if (abs(lan1 - lan2) < 60.00 / 10000) and (abs(lat1 - lat2) < 60.00/ 10000):	# Сравниваем данные на актуальность (проблема отсева данных по времени)
							lan0 = (lan1 + lan2) / 2
							lat0 = (lat1 + lat2) / 2
							print 'CurrentPosition: '
							print lan0
							print lat0
							print 'Time: '
							print timeUTC
							waiting = False
	#						break
						else :
							lat1 = lat2	 # Сохраняем вторичные данные и закачиваем снова
							lan1 = lan2
					data = ''
					lines = ''
	return lan0, lat0
####################
# Полет к заданной точке
l = 0
FlightMode = True
while l < QuantityPoints :
	print 'NEW POINT POSITION'
	print pointLan[l]
	print pointLat[l]
	while FlightMode:
		lan, lat = GEO_attitude()
######## Дальше думаю код не нужен.
bismigalis
и полный Traceback
FishHook
сделай принт на values, 100% ошибка в данных
robot_chickn
Странно, ошибка просто не регулярная и перед тем как сохранить данные я их проверяю, что они действительно числовые и входят в определенный диапазон.

Попробую сделать принты. и кстати ошибка когда вылазит, то там разные цифры идут от 2х до 5ти точно.

IndexError: index out of range: 5 in <script> at line number 230
robot_chickn
а какие могут поступать данные, чтобы вызвать эту ошибку именно на этой строчке,а не внутри процедуры??
FishHook
index out of range возникает, когда программа пытается обратиться к элементу списка или кортежа, которого не существует. У тебя это может возникнуть в любом месте, где ты делаешь подобное
lan1 = float(values[2])
Если len(values)<3 то ты получишь index out of range. Поэтому я и настаиваю на том, чтобы очень внимательно проверить, что же у тебя попадает в values.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB