Was mache ich falsch?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
andieseul
User
Beiträge: 13
Registriert: Dienstag 2. November 2021, 17:30

# 2. Klassifizierung von Schraubenschlüsseln [20 Punkte]
---

Sie arbeiten in einem Unternehmen, das drei verschiedene Schraubenschlüssel herstellt ("Type A", "Type B" und "Type C"). Ein Sensor kann die Länge und Breite jedes Schraubenschlüssels messen. Sie sollen nun eine Funktion schreiben, die jeden Schraubenschlüssel anhand seiner Länge (ein Float-Wert in mm) und seiner Breite (Float-Wert in mm) nach den folgenden Regeln klassifiziert:

- Type A: 40 mm <= Länge <= 50 mm und <=9 mm Breite <=12 mm
- Type B: 58 mm <= Länge <=60 mm und 11 mm Breite <=13 mm
- Type C: 58 mm <=Länge <=60 mm und 16 mm Breite <=18 mm
- Production failure: in allen anderen Fällen

Die Funktion soll einen String zurückgeben, die den Typ (in Englisch) angibt. Wenn Sie beispielsweise die Argumente 58.0 und 12.0 an Ihre Funktion übergeben, sollte der Rückgabewert "Type B" lauten. Im Falle eines Produktionsfehlers muss die Funktion den String 'Production failure' zurückgeben.

Ich habe dann folgendes eingegeben:
def classify_wrenches (length, width) :
if ((length >= 40 and length <= 50) and (width >= 9 and width <= 12)) :
return "Type A"
if ((length >= 58 and length <= 60) and (width >= 11 and width <= 13)) :
return "Type B"
if ((length >= 58 and length <= 60) and (width >=16 and width <= 18)) :
return "Type C"
rueckgabewert = "Type B"
return "rueckgabewert"
print(rueckgabewert)

Ich bekomme dann eine Meldung:
"C:\Users\Andie La Seule\anaconda3\envs\testProjekt\python.exe" "C:/Users/Andie La Seule/PycharmProjects/testProjekt/main.py"
File "C:\Users\Andie La Seule\PycharmProjects\testProjekt\main.py", line 9
rueckgabewert = Type B
^
SyntaxError: invalid syntax

Process finished with exit code 1

Da habe ich richtig was falsch gemacht....
vorher hatte ich
def classify_wrenches (length, width) :
if ((length >= 40 and length <= 50) and (width >= 9 and width <= 12)) :
return "Type A"
if ((length >= 58 and length <= 60) and (width >= 11 and width <= 13)) :
return "Type B"
if ((length >= 58 and length <= 60) and (width >=16 and width <= 18)) :
return "Type C"
else:
return("Production failure")

Ich bin ganz durcheinander und weiß eigentlich gar nicht mehr, wie ich die Aufgabe lösen kann.
Kann mir jemand helfen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code in den Code-Tags eingeben, sonst kann man den nicht beurteilen. Das ist der </>-Knopf im vollstaendigen Editor.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andieseul: Anmerkung: Die ganzen Klammern gehören da nicht hin, und man kann die Bedingung a <= b <= c in Python *genau* *so* ausdrücken. Kein Grund das länger und komplizierter zu schreiben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@andieseul, wie von _deets__ vermutet, war die Einrückung falsch. Das konnte ich aber auch erst sehen, nachdem ich es in meinen Editor kopiert hatte. Also bitte die code-Tags verwenden.

Der erste Versuch sah eigentlich schon gut aus. Vielleicht hat es mit der Rückgabe nicht geklappt?
Man muss den Funktionsaufruf einer Variablen zuweisen um den Rückgabewert aufzufangen.

Inbegriffen der vorherigen Kommentare komme ich dann auf das:

Code: Alles auswählen

def classify_wrenches(length, width):
    if 40 <= length <= 50 and 9 <= width <= 12:
        return "Type A"
    elif 58 <= length <= 60 and 11 <= width <= 13:
        return "Type B"
    elif 58 <= length <= 60 and 16 <= width <= 18:
        return "Type C"
    else:
        return("Production failure")


wrench_type = classify_wrenches(58.0, 12.0)

print(wrench_type)
Statt immer wieder "if" zu wiederholen sollte man hier auch "elif" verwenden
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich hätte ``if`` verwendet, denn das ``return`` beendet die Funktion ja. Ich hätte auch entweder bei den letzten beiden Fällen die erste Teilbedingung nicht wiederholt, oder das ganze mit einer Schleife über Typen und Grenzwerte gelöst.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
andieseul
User
Beiträge: 13
Registriert: Dienstag 2. November 2021, 17:30

Vielen Dank für Eure Tipps....ich bin immer noch am Ausprobieren, aber ich denke, dass ich es jetzt Dank Eurer Hilfe hinbekomme.
Lieben Dank noch einmal....so langsam werde ich mich da hoffentlich einarbeiten.....
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

__blackjack__ hat geschrieben: Dienstag 9. November 2021, 18:06 mit einer Schleife über Typen und Grenzwerte gelöst.
Was meinst du damit? Wie würde so eine Schleife aussehen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@rogerb Datengetrieben, mit einer Liste von Tupeln oder einem Wörterbuch, dass Typname auf Grenzen abbildet. Dann ist es trivial neue hinzuzufügen.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Die Daten für die Klassifizierung stehen momentan hart im Code. Man könnte die als Datenstruktur herausziehen — Namen und Grenzwerte für Länge und Breite, und dann eine Schleife über diese Datenstruktur schreiben, und wenn man in einem Schleifendurchlauf einen Treffer hat, den Namen zurückgeben.

Code: Alles auswählen

#!/usr/bin/env python3
from attr import attrib, attrs


@attrs(frozen=True)
class Limits:
    lower = attrib()
    upper = attrib()

    def __contains__(self, value):
        return self.lower <= value <= self.upper


@attrs(frozen=True)
class WrenchClass:
    name = attrib()
    length_limits = attrib()
    width_limits = attrib()


WRENCH_CLASSES = [
    WrenchClass("Type A", Limits(40, 50), Limits(9, 12)),
    WrenchClass("Type B", Limits(58, 60), Limits(11, 13)),
    WrenchClass("Type C", Limits(58, 60), Limits(16, 18)),
]


def classify_wrenches(length, width):
    for class_ in WRENCH_CLASSES:
        if length in class_.length_limits and width in class_.width_limits:
            return class_.name

    return "Production failure"


def main():
    wrench_type = classify_wrenches(58, 12)
    print(wrench_type)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Okay, ich hatte an range() gedacht, was aber nur für int funktioniert:

Code: Alles auswählen

WRENCH_CLASSES = {
    "Type A": {"length": range(40, 51), "width": range(9, 13)},
    "Type B": {"length": range(58, 61), "width": range(11, 14)},
    "Type C": {"length": range(58, 61), "width": range(16, 19)},
}


def classify_wrenches(length, width):
    for wrench_name, wrench_limit in WRENCH_CLASSES.items():
        if length in wrench_limit["length"] and width in wrench_limit["width"]:
            return wrench_name
    return "Production failure"


def main():
    wrench_type = classify_wrenches(58, 12)
    print(wrench_type)


if __name__ == "__main__":
    main()
Dass man die __contains__ Methode überschreiben kann finde ich aber grundsätzlich interessant, jedenfalls für den Fall, dass man sehr viele Limits prüfen will.
Antworten