2017-02-22 43 views
0

Я знаю, что аналогичный вопрос задавался здесь раньше, но мой немного отличается. Я хочу написать функцию, которая берет список положительных целых чисел и возвращает сумму элементов, расположенных на нечетных индексах. Уловка, я хочу использовать только цикл for или while. Вот что я до сих пор:Как найти сумму элементов, расположенных по нечетным индексам в Python

def getSumOdds(aList): 
for i in range(0, len(aList)): 
    if i%2 == 0: 
     pass 
    if i%2 != 0: 
     sum = sum + aList[i] 
     return sum 

Однако, когда я ввожу этот код в Python, я получаю сообщение об ошибке говорящего builtins.UnboundLocalError: локальная переменная «сумма», на который ссылается перед тем заданием. Кто-нибудь знает лучший способ найти сумму или как исправить сообщение об ошибке? Заранее спасибо.

+0

Берегитесь именования переменных, чтобы быть таким же, как встроенные функции. Это будет означать, что вы скрываете эту функцию. –

ответ

1

Чтобы устранить проблему, вы должны инициализировать sum до нуля после def. Другое дело - returnsum после for, не в течение последних if.

(Поскольку этот вопрос, очевидно, о домашней работе, я предпочел бы не обсуждать современные методы для решения самой проблемы.)

+0

Я бы сказал, что нормально отвечать на домашние вопросы, если ОП продемонстрировал некоторые усилия. Ясно, что они здесь. –

+0

@PaulRooney Абсолютно, я имею в виду, что код может быть сильно оптимизирован, но это вряд ли поможет OP в данный момент. –

1

Вы можете использовать генератор (или список понимание для этого):

def getSumOdds(aList): 
    return sum(aList[i] for i in range(1,len(aList),2)) 

(данный поддерживается индекс (list поддерживает это)).

или вы можете, как @MSeifert говорит, используйте нарезка:

def getSumOdds(aList): 
    return sum(aList[1::2]) 

(данный нарезка поддерживается, не все коллекции это сделать)

, что все, что вам нужно: sum является встроенной функцией ,

В случае aList является генератор (вы не можете получить доступ к I его элемента, например), вы можете использовать itertools.islice:

from itertools import islice 

def getSumOdds(aList): 
    return sum(islice(aList,1,None,2)) 

Вы также можете использовать этот метод для списков и т.д. (как длинный как aList итерируем).

Или - опять-таки с учетом индексации поддерживается - вы можете поместить его в for цикле:

def getSumOdds(aList): 
    result = 0 
    for i in range(1,len(aList),2): 
     result += aList[i] 
    return result 
+2

Почему не просто 'sum (aList [1 :: 2])'? – MSeifert

+0

@MSeifert: да, поскольку это список, нарезка также является вариантом. Будет редактировать. –

+0

«Я хочу использовать только цикл for или цикл while» говорит OP –

 Смежные вопросы

  • Нет связанных вопросов^_^