Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2014 11:00:06

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

не правильно работает цикл

В следующем цикле я ожидаю получить в переменную список файлов в расширением img. Однако

listofimagesinfolder = []
def readrasterfolder():
	for root, dirs, files in os.walk(gvar.rasterfolder):
		# На каждой итерации получаем список элементов одного из каталогов и дсоставляем общий список
		# И фильтруем по расширению
		for filename in files:
			if filename.endswith('.img'):
				print filename
				listofimagesinfolder.extend(filename)
	print "Dir have next images:"
	print "================================START IMAGES LIST==============================="
	print listofimagesinfolder
	print "=================================END IMAGES LIST================================"

Однако вместо

я получаю следущующее:

================================START IMAGES LIST===============================

['1', '0', '1', '_', '0', '1', '8', '6', '9', '6', '_', '0', '_', '0', '_', '0',
'1', '_', 'b', 's', 'q', '.', 'i', 'm', 'g', '1', '0', '1', '_', '0', '1', '8',
'6', '9', '6', '_', '0', '_', '0', '_', '0', '2', '_', 'b', 's', 'q', '.', 'i',
'm', 'g', '1', '0', '1', '_', '0', '1', '8', '6', '9', '6', '_', '0', '_', '0',
'_', '0', '3', '_', 'b', 's', 'q', '.', 'i', 'm', 'g']
=================================END IMAGES LIST================================
Вроде бы все правильно делаю, что не так то? Почему он список не дополняет?

Офлайн

#2 Апрель 21, 2014 11:07:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

не правильно работает цикл

замени .extend() на .append()



Офлайн

#3 Апрель 21, 2014 12:49:47

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

не правильно работает цикл

А не могли бы объяснить суть? Почему так происходит?

Офлайн

#4 Апрель 21, 2014 13:06:30

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

не правильно работает цикл

И еще. У меня создается впечатление, что последний участок

print ('LIST OF IMAGES: {0}').format(listofimagesinfolder)
Не видит, то что в него выше мы поместили:

#Читаем растры которые есть в каталогеы
listofimagesinfolder = []
def readrasterfolder():
	for root, dirs, files in os.walk(gvar.rasterfolder):
		# На каждой итерации получаем список элементов одного из каталогов и дсоставляем общий список
		# И фильтруем по расширению
		for filename in files:
			if filename.endswith('.img'):
				#print filename
				listofimagesinfolder.append(filename)
	print "Dir have next images:"
	print "================================START IMAGES LIST==============================="
	for image in listofimagesinfolder:
		print image
	print "=================================END IMAGES LIST================================"
	print gvar.dbhost
print ('LIST OF IMAGES: {0}').format(listofimagesinfolder)
################TEMP######################################

т.е. в блоках START LIST и END LIST все выводится, а вот самый последний вывод показывает, что в переменной пусто.

add:
Если последний блок print сдвинуть немного, то выводится нормально, но не могу понять, почему он глобально не виден?

Отредактировано Suliman (Апрель 21, 2014 13:49:01)

Офлайн

#5 Апрель 21, 2014 13:12:00

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

не правильно работает цикл

Suliman
А не могли бы объяснить суть? Почему так происходит?
u_ist = []
s = "str"
u_ist.extend(s)
print u_ist

метод extend добавляет новый ! список
то есть
u_ist.extend(s)
можно написать так
u_ist.extend(list(s))

Офлайн

#6 Апрель 21, 2014 13:39:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

не правильно работает цикл

Suliman
Почему так происходит?
>>> print(list.append.__doc__)
L.append(object) -> None -- append object to end
>>> print(list.extend.__doc__)
L.extend(iterable) -> None -- extend list by appending elements from the iterable
>>>

Suliman
а вот самый последний вывод показывает, что в переменной пусто.
сначала надо вызвать функцию readrasterfolder()

vrabey
метод extend добавляет новый ! список …
>>> lst = []
>>> lst.extend('abc')
>>> lst
['a', 'b', 'c']
>>> lst.extend('def')
>>> lst
['a', 'b', 'c', 'd', 'e', 'f']
>>> 
>>> for i in 'ghi':
...   lst.append(i)
... 
>>> lst
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>> 
это такой .append() в цикле



Отредактировано py.user.next (Апрель 21, 2014 13:41:28)

Офлайн

#7 Апрель 21, 2014 13:59:05

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

не правильно работает цикл

Спасибо! Более или менее понял, однако не могу разобраться с областями видимости.

Мне мне нужна переменная, которую я смогу использовать в нескольких функциях. Как ее определить?

listofimagesinfolder = []
def readrasterfolder():
	#КУСОК КОДА ВЫКИНУТ
		listofimagesinfolder.append(filename)
print listofimagesinfolder # получается, что тут listofimagesinfolder будет пустым, так?

Как мне сделать его видимым глобально?

Офлайн

#8 Апрель 21, 2014 14:04:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

не правильно работает цикл

>>> lst = []
>>> def f1():
... lst.append(1)
...
>>> def f2():
... lst.append(2)
...
>>> f1()
>>> f2()
>>> f1()
>>> f2()
>>> lst
[1, 2, 1, 2]
>>>



Отредактировано py.user.next (Апрель 21, 2014 14:06:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version