2016-03-27 7 views
0

Dies ist das Modul, das ein zweidimensionales Array mit den Namen der Angestellten und ihren Gehältern eingibt. Hier nimmt das Programm nur eine Eingabe und fährt fort, anstatt weitere Eingaben hinzuzufügen, bis der Benutzer "*" eingibt. Wie behebe ich das?Wie man TypeError repariert: 'float' Objekt ist nicht einklagbar und ein .append funktioniert nicht

salary = [] 
names = [] 

def floatInput(): 
    done = False 
    while not done: 
     nameIn = input("Please enter the employee name or * to finish: ") 
     salaryIn = input("Please enter the salary in thousands for " + nameIn + ": ") 
     try: 
      salaryIn = float(salaryIn)    
     except: 
      print("Program was expecting a positive integer or floating point number!") 
     if nameIn == "*": 
      done = True 
     else: 
      salary.append(salaryIn) 
      names.append(nameIn) 
     return salary 
     return names 

Aufruf der Schwimmer Eingangsfunktion

floatInput() 

hier verwende ich eine for-Schleife durch die Liste der Namen und Gehälter zu drucken und wiederholen.

for i in range(len(names)): 
    print(names[i] + ", " + str(salary[i])) 

Hier finde ich den Mittelwert der Gehälter.

def salaryMean(): 
    mean = sum(salary)/float(len(salary)) 
    print("The mean of the salaries is: " + str(mean)) 
    return mean 

Aufruf der Gehalt Funktion bedeuten

salaryMean() 

hier konvertiere ich das Gehalt zu Tausenden.

for i in range(len(names)): 
    salary = salary[i] * 1000 
print(salary) 

Hier zeige ich alle emplpyees, die 5000 aus dem Mittelwert $ innerhalb eines Bereichs von verdienen Dies ist, wo ich bin die

"TypeError: 'float' object is not subscriptable" 

bekommen und es verweist auf die Linie

"if salary[x] >= (mean - 5000) and salary[x] <= (mean + 500):" 

.... Wie repariere ich das?

def displayNames(): 
    done = False 
    x = 0 
    while not done: 
     if done: 
      break 
     if salary[x] >= (mean - 5000) and salary[x] <= (mean + 5000): 
      print(salary[x]) 
     x += 1 
     if x > len(salary): 
      done = True 

Aufrufen des Anzeigenamens Funktion.

displayNames() 

Antwort

0

Um Ihre .append Problem zu beheben (auch Ihre zweite return Anweisung wird nie ausgeführt werden, siehe unten, wie beide Listen zurück):

Ihre Schleife fortgesetzt wird nicht der Fall ist, weil Sie Rückkehr innerhalb der Schleife, womit die Funktion beendet wird. Verschieben Sie Ihre return Anweisung außerhalb der Schleife (single undent).

while not done: 
    # do stuff 
return salary, names 

zu beheben Ihre TypeError denke ich, ist das Problem hier:

for i in range(len(names)): 
    salary = salary[i] * 1000 # Up to this point salary is a list, here it turns into the ith value of the list multiplied by 1000 
print(salary) 

Stattdessen ersetzen, dass die gesamte für Schleife mit:

salary = [s*1000 for s in salary] 
for s in salary: 
    print(s) # This should now print the multiplied salaries. 

einige andere Probleme - Sie haben zwei return Aussagen gefolgt von einander - die Funktion beendet die Ausführung nach der ersten Rückkehr und führt niemals die Rückkehr unterhalb dieser aus; Wenn Sie sowohl salary als auch names zurückgeben möchten, verwenden Sie return names, salary (und benennen Sie vielleicht salary in salaries um, so dass die Leute leicht erkennen können, dass es sich um eine Reihe von Gehältern handelt, nicht nur eine).

Verwandte Themen