2016-01-05 2 views
1

Je tente d'utiliser la fonction suivante pour simuler des charges sur une poutre:Python: TypeError: objet « NoneType » est pas Iterable

def simulateBeamRun(personList, beam, times): 

Je suis venu avec le code suivant à ce jour:

def createPersonList(fileName): 
    """Function will go through each line of file and 
    create a person object using the data provided in 
    the line and add it to a list 
    """ 
    theFile = open(fileName) 
    next(theFile) 
    #array = [] 
    for line in theFile: 
     aList = line.split(',') 
     bList = map(lambda s: s.strip('\n'), aList) 
     cList = [float(i) for i in bList] 
     print cList 

def simulateBeamRun(personList, beam, times): 
    """Takes a list of times covering the duration of 
    the simulation (0-35 s), the list of person 
    objects and a beam object to simulate a beam run 
    """ 
    dList = [] 
    for time in times: 
     eList = [] 
     for person in personList: 
      loadTuples = personModel.person.loadDisplacement(time) 
      if beamModel.beam.L > loadTuples[1] > 0: 
       eList.append(loadTuples) 
      else: 
       return None 
     beamModel.beam.setLoads(eList) 
     dList.append(beamModel.beam.getMaxDeflection()) 

Cependant, je reçois l'erreur suivante lorsque vous essayez d'exécuter la fonction (avant que je lui donne des entrées:

for person in personList: 
TypeError: 'NoneType' object is not iterable 
+5

'personList' est' None'. Les parties pertinentes de votre code sont manquantes. – timgeb

+1

Vous devez vous assurer que personList n'est pas None – BAE

+0

Ajout du code approprié. Comment pourrais-je faire personList pas non. – Student1001

Répondre

4

Pour être itéré, personList doit avoir certaines valeurs. Si vous créez personList avec la fonction createPersonList, vous devez alors return a value.Sinon, cette liste n'existe pas en dehors de createPersonList.

def createPersonList(fileName): 
    # do stuff to create cList 
    return cList 

personList = createPersonList(myFile) 

Ensuite, personList auront des valeurs et vous pouvez l'utiliser dans les fonctions suivantes.

simulateBeamRun(personList, beam, times) 

Si vous voulez éviter de cette boucle du tout dans les cas où personList n'a pas de valeurs, comprennent une condition.

if personList is None: 
    print "No values in personList" 
else: 
    for person in personList: 
     # do stuff with person 
1

Que le code suivant aide

def createPersonList(fileName): 
    """Function will go through each line of file and 
    create a person object using the data provided in 
    the line and add it to a list""" 
    cList=[]#see my comments. if the following loop not happen, still return [] 

    theFile = open(fileName) 
    next(theFile) 
    #array = [] 
    for line in theFile: 
     aList = line.split(',') 
     bList = map(lambda s: s.strip('\n'), aList) 
     cList += [float(i) for i in bList]# if bList is iterable, [float(i) for i in bList] should be a list (including []) 
    return cList#according to your comments, should return here. 

flotteur (i) peut lancer des erreurs, utilisez donc essayer, sauf. Je pense que la vérification liée à personList doit être effectuée dans cette fonction, les informations d'erreur doivent être enregistrées.