# 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?
Was mache ich falsch?
- __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
@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:
Statt immer wieder "if" zu wiederholen sollte man hier auch "elif" 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)
- __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
Was meinst du damit? Wie würde so eine Schleife aussehen?__blackjack__ hat geschrieben: Dienstag 9. November 2021, 18:06 mit einer Schleife über Typen und Grenzwerte gelöst.
- __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
Okay, ich hatte an range() gedacht, was aber nur für int funktioniert:
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.
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()