Python «TypeError»: объект «Генератор» не подлежит подписке

Я пытаюсь выполнить простой пример Евклида в Python, но получаю сообщение об ошибке, упомянутое в заголовке. Код выглядит следующим образом:

def gcd1(a,b):
        """ the euclidean algorithm """
        while a:
                a, b = b%a, a
        return b

Я вызываю код следующим образом (я думаю, это может иметь какое-то отношение к этому):

for x in set1:
    print(gcd1(x, set2[x]))

Изменить: текущая ситуация (работает)


set1 = list(range(start, end))
""" otherrange() behaves just like range() however returns a fixed list"""
set2 = list(otherrange(start, end))

for x in set1:
    print(gcd1(x, set2[x]))

person Ropstah    schedule 07.09.2014    source источник
comment
Можете ли вы сказать нам, в какой строке была ошибка и что такое set2?   -  person tdelaney    schedule 07.09.2014
comment
Что здесь otherrange()?   -  person Martijn Pieters    schedule 07.09.2014
comment
просто диапазон с другими параметрами   -  person Ropstah    schedule 07.09.2014
comment
@Ropstah: range() в Python не является генератором, но ваша проблема указывает на то, что у вас есть такой объект. Пожалуйста, дайте нам что-нибудь, что позволит нам воспроизвести проблему. Только тогда мы сможем дать вам оптимальное решение, а не просто нанести list() штукатурку.   -  person Martijn Pieters    schedule 07.09.2014
comment
@MartijnPieters: otherrange — это настраиваемый метод, который в основном возвращает список чисел. В то время как остальная часть моей реализации могла бы значительно выиграть от оптимизации, на мой вопрос здесь дан ответ. Я хотел бы продолжить и поговорить о проблеме.   -  person Ropstah    schedule 07.09.2014
comment
@Ropstah: Тогда * покажите нам определение otherrange, потому что оно, кажется, возвращает генератор, где вам может не понадобиться возвращать его вообще.   -  person Martijn Pieters    schedule 08.09.2014


Ответы (1)


Это означает, что set2 является генератором, чтобы обойти это, просто превратите его в список.

set2_list = list(set2)
for x in set1:
    print(gcd1(x, set2_list[x]))
person randomusername    schedule 07.09.2014
comment
@Ropstah Подождите, то, что я поставил ранее, может не работать должным образом. Используйте мой обновленный ответ. - person randomusername; 07.09.2014
comment
Я уже использовал переменные, но они указывали на функции. Я просто завернул все в список, так что все было хорошо (правильно?) - person Ropstah; 07.09.2014
comment
@Ropstah да, наверное да - person randomusername; 08.09.2014