2009-10-17 18 views
5

Próbuję dostać moje stopy mokre z python na Project Euler, ale mam problem z pierwszym problemem (znaleźć sumę wielokrotności od 3 lub 5 do 1000) . powodzeniem mogę wydrukować wielokrotności trzech do pięciu, ale gdy próbuję włączyć funkcję sumy pojawia się następujący błąd:Python: Int iterable error

TypeError: 'int' object is not iterable

Każda pomoc będzie mile widziane.

n = 100 
p = 0 
while p<n: 
    p = p + 1 
x = range(0, p) 

# check to see if numbers are divisable by 3 or 5 
def numcheck(x): 
    for numbers in x: 
     if numbers%3==0 and numbers%5==0: 
      sum(numbers) 
numcheck(x) 
+1

Właśnie prowadził kod pisał i nie dostać tego błędu. Widzę, że edytowałeś swój kod, aby usunąć linię, która spowodowała błąd. Jakie jest twoje pytanie? –

+0

Woops, nie zdawałem sobie sprawy, że to zredagowałem, sekundę. – TheOneTrueMorty

Odpowiedz

7

w pętli for

for numbers in x: 

„Numery” kroków przez elementy x po jednym na raz, w każdym cyklu pętli for. Być może lepiej byłoby nazwać zmienną "liczba", ponieważ otrzymuje się tylko jedną liczbę na raz. "liczby" oznaczają liczbę całkowitą za każdym razem w pętli.

sum(numbers) 

rzuca TypeError ponieważ suma function() oczekuje iterable obiektu (jak lista numerów), a nie tylko jedna liczba całkowita.

Więc może spróbuj:

def numcheck(x): 
    s=0 
    for number in x: 
     if number%3==0 and number%5==0: 
      s+=number 
    print(s) 
numcheck(range(1000)) 
+0

Zmieniono Zaakceptowanych odpowiedź do Ciebie za dostarczenie wyjaśnień, a także, dzięki (tutaj jest nadzieją mogę dostać następny problem na własną rękę). – TheOneTrueMorty

+0

+1 za sugerowanie, że nazwy zmiennych pasują do tego, czym faktycznie są. To zadziwiające, jak wiele błędów można zapobiec, po prostu mając jasne nazwy. –

1

Funkcja sum oczekuje listy, a nie pojedynczej liczby.

Po wykonaniu for numbers in, zmienna numbers ma pojedynczy obiekt liczby całkowitej. Dodaj oświadczenie print, zobaczysz, że numbers jest pojedynczą liczbą.

Możesz chcieć zgromadzić wszystkie wielokrotności 3 i 5 na liście. Po uzyskaniu listy możesz użyć funkcji sum na tej liście.

5

numery muszą być listą lub podobną, gdy zostaną przekazane do sumy(). W powyższym przykładzie kodu jest to liczba całkowita - jedna z liczb całkowitych zx.

spróbować czegoś jak:

numbers = [num for num in x if num%3==0 and num%5 ==0] 
print sum(numbers) 
+1

'sum' trwa iterowalny więc działa zbyt: 'suma (n dla n xi jeśli n == 0% 3% 5 a n == 0)' –

+0

który jest zdecydowanie najbardziej pythonowy roztworu i jedną wkładkę . Przekształcenie kod imperatyw do listowe jest cały godny temat sam w sobie. – smci

1

Myślę, że chcesz coś podobnego, co następuje.

def numcheck(x): 
    total = 0 
    for number in x: 
     if number % 3 == 0 or and number % 5 == 0: 
      total += number 
    print total 

Alternatywnie, możesz dodać każdą z dzielących się liczb do listy, a następnie wywołać sumę() na tej liście.

+4

Wstydź się za dostarczenie rozwiązania. –

1

pomocy (suma) Pomoc na wbudowanym sumy funkcji w module wbudowane:

suma (...) suma (sekwencja [, start]) -> wartość

Returns the sum of a sequence of numbers (NOT strings) plus the value 
of parameter 'start' (which defaults to 0). When the sequence is 
empty, returns start. 

(END)

Podajesz liczby, które są typu int do sum(), ale suma przyjmuje sekwencję.

1

Oto jak to zrobić to:

n = 100 

# the next 4 lines are just to confirm that xrange is n numbers starting at 0 
junk = xrange(n) 
print junk[0] # print first number in sequence 
print junk[-1] # print last number in sequence 
print "================" 

# check to see if numbers are divisable by 3 or 5 
def numcheck(x): 
    for numbers in x: 
     if numbers%3==0 and numbers%5==0: 
      print numbers 

numcheck(xrange(n)) 

Może się okazać, że to dziwne, że mijam XRange (n) jako parametr. To jest iterator, który w końcu utworzy listę numerów n podczas przechodzenia przez pętlę w trybie numcheck. To trochę jak przechodzącą wskaźnik do funkcji w C Kluczową rzeczą jest to, że za pomocą XRange, nie trzeba przeznaczyć dowolną pamięć do listy numerów, dzięki czemu można łatwiej uruchomić sprawdzanie na pierwszych miliard liczb całkowitych, na przykład.

+0

Nie jestem pewien, czy całkowicie rozumiem xrange (nie jestem zbyt dobrze zaznajomiony ze wskaźnikami), tak nagie ze mną. Więc gdy zakres generuje listę, powiedzmy, 100 numerów, na miejscu, by XRange generować jeden numer, należy sprawdzić, czy liczba ta odpowiada cokolwiek warunki dałeś go i kontynuować przejściem do następnego numeru, aż osiągnie 100? – TheOneTrueMorty

+0

'xrange()' zostało wymyślone, ponieważ czasami nazywamy 'range()' i tak naprawdę nie chcemy całej listy. Pętla 'for' w Pythonie zawsze ustawia zmienną na elementy z listy (lub coś innego niż lista, która jest" iterable "). Załóżmy, że chcesz zrobić coś milion razy. Z 'dla x w zakresie (1000000):' tworzysz listę miliona obiektów całkowitych, a następnie używasz go raz i odrzucasz. 'xrange()' zamiast zwracania listy zwraca iterator, a pętla 'for' wie jak zapytać iterator o jedną wartość naraz. Nie ma potrzeby budowania i niszczenia ogromnej listy. – steveha

+1

'xrange()' działało bardzo dobrze, aw Pythonie 3.x nie ma już 'range()', który zwraca pełną listę; 'range()' w Pythonie 3.x działa jak 'xrange()' w Pythonie 2.x. W Pythonie 3.x, jeśli rzeczywiście chcesz tę listę, po prostu to wykonaj: 'list (range (1000))' Typ 'list' przyjmuje iterator i zamienia go na pełną listę. W rzeczywistości wszystkie funkcje metody w języku Python, które zwróciły pełne listy, zwracają iteratory w języku Python 3.x. Możesz zmusić ich do rozwinięcia do pełnej listy, jeśli chcesz, a gdy nie masz nic na uwadze, iterator jest bardziej wydajny. – steveha