2016-09-14 1 views
0

Weiß jemand, warum ich diesen Fehler bekomme? Ich bin wirklich neu und ich würde die Hilfe von jemandem schätzen. Das ist mein Code:TypeError: nicht unterstützte Operandentypen für + =: 'float' und 'NoneType' in Python 3

import turtle as t 
import math as m 
import random as r 

raindrops = int(input("Enter the number of raindrops: ")) 

def drawSquare(): 
    t.up() 
    t.goto(-300,-300) 
    t.down() 
    t.fd(600) 
    t.lt(90) 
    t.fd(600) 
    t.lt(90) 
    t.fd(600) 
    t.lt(90) 
    t.fd(600) 
    t.lt(90) 

def location(): 
    x = (r.randint(-300, 300)) 
    y = (r.randint(-300, 300)) 
    t.up() 
    t.goto(x, y) 
    return x, y 

def drawRaindrops(x, y): 
    t.fillcolor(r.random(), r.random(), r.random()) 
    circles = (r.randint(3, 8)) 
    radius = (r.randint(1, 20)) 
    newradius = radius 
    area = 0 
    t.up() 
    t.rt(90) 
    t.fd(newradius) 
    t.lt(90) 
    t.down() 
    t.begin_fill() 
    t.circle(newradius) 
    t.end_fill() 
    t.up() 
    t.lt(90) 
    t.fd(newradius) 
    t.rt(90) 
    while circles > 0: 
     if x + newradius < 300 and x - newradius > -300 and y + newradius < 300 and y - newradius > -300: 
      t.up() 
      t.rt(90) 
      t.fd(newradius) 
      t.lt(90) 
      t.down() 
      t.circle(newradius) 
      t.up() 
      t.lt(90) 
      t.fd(newradius) 
      t.rt(90) 
      newradius += radius 
      circles -= 1 
      area += m.pi * radius * radius 
     else: 
      circles -= 1 
    return area 

def promptRaindrops(raindrops): 
    if raindrops < 1 or raindrops > 100: 
     print ("Raindrops must be between 1 and 100 inclusive.") 
    if raindrops >= 1 and raindrops <= 100: 
     x, y = location() 
     area = drawRaindrops(x, y) 
     area += promptRaindrops(raindrops - 1) 
     return x, y, area 

def main(): 
    t.speed(0) 
    drawSquare() 
    x, y, area = promptRaindrops(raindrops) 
    print('The area is:', area, 'square units.') 

main() 
t.done() 

Ich nehme an, etwas stimmt nicht mit der "+ =", aber ich habe keine Ahnung was. Ich bin mir ziemlich sicher, dass das Gebiet korrekt zurückgegeben wird. Hilfe bitte. :)

+0

Ihre Funktion 'promptRaindrops' hat 2 Pfade. Wenn es die erste benötigt, wird nichts zurückgegeben, daher wird die Standardrückgabe von "None" verwendet. Es sollte immer den gleichen Typ zurückgeben, andernfalls etwas tun, um extern einen Fehler anzuzeigen, wie eine Ausnahme auszulösen. –

Antwort

1

Zwei Dinge, die ich bemerkt:

1. promptRaindrops gibt ein Tupel

Ich bin sicher, dass Sie dies nicht die Absicht hatte, aber wenn man area += promptRaindrops(raindrops - 1) sagen, Sie sind das Hinzufügen eines Tupel-area , das ist eine ganze Zahl. Um das zu beheben, sollten Sie area += promptRaindrops(raindrops - 1)[2] sagen, um den Bereich zurückzugeben. Jedoch Ihre Fehler durch

2. Ihr Basisfall gibt keinen Wert

In promptRaindrops erzeugt wird, kehren Sie einen rekursiven Aufruf der Funktion, wenn 1 <= raindrops <= 100. Aber wenn es außerhalb dieses Bereichs ist, gibt es nichts zurück, sondern nur eine Nachricht. Ihre Funktion wird immer außerhalb dieses Bereichs sein, denn wenn Sie den in promptRaindrops übergebenen Wert weiter verringern, wird es schließlich unter 1 gehen. Wenn es tut, geben Sie None zurück (da Sie nichts zurückgegeben haben). Das None springt durch jeden einzelnen Rekursionsaufruf, der zu diesem Punkt gemacht wird, und Sie werden zu area unweigerlich hinzufügen. Fügen Sie eine Rückgabeanweisung hinzu, die ein Tupel zurückgibt, und Ihr Fehler sollte verschwinden.

0

In promptRaindrops() führen Sie einen += Betrieb mit einem rekursiven Aufruf-promptRaindrops() das wird nicht Rückkehr nichts (NoneType), wenn raindrops außerhalb des angegebenen Bereichs ist.

Je nachdem, wie sich das Programm verhalten soll, sollte dort entweder etwas zurückgegeben werden oder es sollte nicht mit Werten außerhalb des angegebenen Bereichs aufgerufen werden.

+0

Sie können nicht vermeiden, die Funktion außerhalb des Bereichs aufzurufen; Subtrahieren der übergebenen Wert wird schließlich unter 1 gehen. –

+0

Natürlich können Sie, mit einer einfachen Bedingung für das Argument Eingabe vor dem Aufruf der Funktion. Dies würde den ganzen Zweck einer rekursiven Funktion zunichte machen, aber ich wollte nur auf eine mögliche Lösung der vorliegenden Frage hinweisen. – Aerows

Verwandte Themen