Cześć, więc stworzyłem tę funkcję zwaną RunLoopg (X, Y, Z), który wytwarza listę, ale nie mogę zadzwonić do pozycji na liście:

p=runloopg(10,0.1,6)
<generator object rtpairs at 0x000000000BAF1F78>
[(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1), (-0.00222521,0.00974928,0,0,0,1), (-0.00900969,0.00433884,0,0,0,1), (0.0549583,-0.0712712,0,0,0,1), (0.0627244,-0.0645419,0,0,0,1), (0.0696727,-0.0569711,0,0,0,1), (0.0757128,-0.0486577,0,0,0,1), (0.0807659,-0.0397099,0,0,0,1), (0.084766,-0.0302444,0,0,0,1), (0.0876611,-0.0203847,0,0,0,1), (0.0894134,-0.0102592,0,0,0,1)]

Jednak kiedy nazywam przedmiotem na mojej liście, tak jak:

p[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-240-a69904524460> in <module>()
----> 1 p[0]

TypeError: 'NoneType' object has no attribute '__getitem__'

To jest kod RUNLOOPG:

import numpy
import raytracer29

def rtpairs(R, N):
    for i in range(len(R)):
        r=R[i]
        n=N[i]
        for j in range(n):
            t = j*2*numpy.pi/n
            yield r,t

def rtuniform(n, rmax, m):
    R=numpy.arange(0,rmax,rmax/n)
    N=numpy.arange(1, n*m, m)
    return rtpairs(R, N)

def runloopg(n, rmax, m):
    #print  rtuniform(n, rmax, m)
    bund = []
    for r,t in rtuniform(n, rmax, m):
        myRay = raytracer29.Ray(r * numpy.cos(t), r * numpy.sin(t),0,0,0,1)        
        bund.append(myRay)
    return bund
0
user3065619 4 grudzień 2013, 15:43

4 odpowiedzi

Najlepsza odpowiedź

Zwracany jest obiekt generatora. Po użyciu generatora jest wyczerpany i nie możesz go ponownie użyć.

Ale możesz wziąć wszystkie jego wartości jako lista:

p = list(runloopg(10,0.1,6))
-2
aIKid 4 grudzień 2013, 11:51

Nie publikowałeś odpowiedniego kodu - definicji funkcji - ale oczywiście ta funkcja powraca None.

Edytuj: OK od fragmentu Wysłany {x0}} rzeczywiście zwróci listę, więc problem jest gdzie indziej. Widzę, że twój fragment zaczyna się od komentarzu {X1}} Oświadczenie drukowania Wartość zwrotu połączenia do {x2}}, a to pasuje do tego, co opublikowałeś swoją interaktywną sesję. Domyślam się, że wykonujesz starszą wersję funkcji, która właśnie drukowała i wyszedłeś natychmiast (domyślnie powrócił None), a następnie edytowałeś kod, ale nie udało się poprawnie przeładować funkcję.

1
bruno desthuilliers 4 grudzień 2013, 16:19

Ponieważ twoja metoda zwraca generator, musisz go spożywać:

for i in runloopg(10,0.1,6):
   print(i)

p = list(runloopg(10,0.1,6))

# If you just want the first item:

first_item = next(runloopg(10,0.1,6))
0
Burhan Khalid 4 grudzień 2013, 11:52

Wygląda na to, że brakuje funkcji runloopg return. Tak robi coś takiego:

def runloopg():
   [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest

Albo to:

def runloop():
    x = [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest

Zamiast tego:

def runloopg():
    return [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest

W pierwszej wersji, ta linia jest uruchamiana, jego wynik jest następnie natychmiast odrzucany, a funkcja trwa. W drugim wynik jest przechowywany w zmiennej, a funkcja trwa. W obu przypadkach funkcja odpada, a Python powróci dla Ciebie None, kiedy to się dzieje. W ostatniej wersji, w którym obliczony jest wynik, a kończy się przypisany do p - więc p będzie listą, a p[0] będzie działać.

0
lvc 4 grudzień 2013, 12:13