eBay Kalkulationsprogramm
Folgende Sachlage und Idee:
Ich bin Onlinehändler, eigene Webseite etc aber eben auch eBay.
Hier muss ich bei neuen Artikeln die Kalkulation geprüft werden.
Sprich der Verkaufspreis abzüglich eBay Provision, Versand etc.
Aktuell mache ich das in einer Excel Tabellenkalkulation.
Ich gebe einen Verkaufspreis ein, meinen EK und die Menge.
Als Ergebnis erhalte ich dann meine Bruttomarge, Marge und auch den Breakeven Point.
Das ist jetzt nicht so kompliziert aber nützlich und für den Anfang machbar.
Mein weiterer Gedanke ist aber auch die Suchergebnisse zu nutzen per API.
Kennt man häufig von EAN Nummern auslesen.
In meinem Fall geht das so nicht, da es sich meist um Aftermarket Ersatzteile handelt die viele anbieten mit unterschiedlichen EAN und Markennamen.
Daher ist mein Gedanke die Suchwörter eingeben zu können, per API die Ergenisse zu holen und dann mit dem Kalkulator zu nutzen.
Das Ganze dann vielleicht eingepackt als CLI mit blessings in einer Bildschirmausgabe.
Ich bin Onlinehändler, eigene Webseite etc aber eben auch eBay.
Hier muss ich bei neuen Artikeln die Kalkulation geprüft werden.
Sprich der Verkaufspreis abzüglich eBay Provision, Versand etc.
Aktuell mache ich das in einer Excel Tabellenkalkulation.
Ich gebe einen Verkaufspreis ein, meinen EK und die Menge.
Als Ergebnis erhalte ich dann meine Bruttomarge, Marge und auch den Breakeven Point.
Das ist jetzt nicht so kompliziert aber nützlich und für den Anfang machbar.
Mein weiterer Gedanke ist aber auch die Suchergebnisse zu nutzen per API.
Kennt man häufig von EAN Nummern auslesen.
In meinem Fall geht das so nicht, da es sich meist um Aftermarket Ersatzteile handelt die viele anbieten mit unterschiedlichen EAN und Markennamen.
Daher ist mein Gedanke die Suchwörter eingeben zu können, per API die Ergenisse zu holen und dann mit dem Kalkulator zu nutzen.
Das Ganze dann vielleicht eingepackt als CLI mit blessings in einer Bildschirmausgabe.
So also meine eigentliche Berechnung habe ich schon einmal gemacht und die funktioniert zumindest.
Vermutlich kann man den Code viel besser schreiben und ich muss auch noch schauen, dass ich bei der Eingabe ein Komma als Punkt interpretiert bekomme, da wir ja das Komme für GLeitzahlen verwenden.
Vermutlich kann man den Code viel besser schreiben und ich muss auch noch schauen, dass ich bei der Eingabe ein Komma als Punkt interpretiert bekomme, da wir ja das Komme für GLeitzahlen verwenden.
Code: Alles auswählen
import math
def calculator(eBay_category, sales_price, purchasing_price, quantity):
ebay_fee = 0
ebay_provision = 0
net_sales = 0
profit = 0
grossmargin = 0
breakeven = 0
sales_price_5 = 0
sales_price_10 = 0
sales_price_15 = 0
sales_price_20 = 0
sales_price_25 = 0
sales_price_30 = 0
sales_price_35 = 0
sales_price_40 = 0
sales_price_45 = 0
margin_5 = 0
margin_10 = 0
margin_15 = 0
margin_20 = 0
margin_25 = 0
margin_30 = 0
margin_35 = 0
margin_40 = 0
margin_45 = 0
if eBay_category == 1:
ebay_fee = 11 if sales_price <= 990.00 else 2
elif eBay_category == 2:
ebay_fee = 12 if sales_price <= 200.00 else 2
else:
raise ValueError("wrong eBay_category")
ebay_provision = (sales_price / 100 * ebay_fee) + 0.35
net_sales = (sales_price / 1.19) - ebay_provision - shipping_costs
profit = net_sales - purchasing_price
grossmargin = 100 / net_sales * profit
breakeven = purchasing_price * quantity / net_sales
sales_price_5 = net_sales -(net_sales / 100 * 5)
sales_price_10 = net_sales -(net_sales / 100 * 10)
sales_price_15 = net_sales -(net_sales / 100 * 15)
sales_price_20 = net_sales -(net_sales / 100 * 20)
sales_price_25 = net_sales -(net_sales / 100 * 25)
sales_price_30 = net_sales -(net_sales / 100 * 30)
sales_price_35 = net_sales -(net_sales / 100 * 35)
sales_price_40 = net_sales -(net_sales / 100 * 40)
sales_price_45 = net_sales -(net_sales / 100 * 45)
margin_5 = (sales_price_5 - purchasing_price) / sales_price_5 * 100
margin_10 = (sales_price_10 - purchasing_price) / sales_price_10 * 100
margin_15 = (sales_price_15 - purchasing_price) / sales_price_15 * 100
margin_20 = (sales_price_20 - purchasing_price) / sales_price_20 * 100
margin_25 = (sales_price_25 - purchasing_price) / sales_price_25 * 100
margin_30 = (sales_price_30 - purchasing_price) / sales_price_30 * 100
margin_35 = (sales_price_35 - purchasing_price) / sales_price_35 * 100
margin_40 = (sales_price_40 - purchasing_price) / sales_price_40 * 100
margin_45 = (sales_price_45 - purchasing_price) / sales_price_45 * 100
return net_sales, profit, grossmargin, breakeven, sales_price_5,sales_price_10,sales_price_15,sales_price_20,sales_price_25, sales_price_30, sales_price_35, sales_price_40, sales_price_45, margin_5, margin_10, margin_15, margin_20, margin_25, margin_30, margin_35, margin_40, margin_45
eBay_category = 0
shipping_costs = 5.00
sales_price = 0
purchasing_price = 0
quantity = 0
while True:
print("""Kostenkalkulator für eBay und Webseiten
Wählen Sie Ihre eBay Verkaufskategorie""")
eBay_category = int(input("Drücke (1) für Bootssport\nDrücke (2) für Gartentechnik: "))
sales_price = float(input("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: "))
purchasing_price = float(input("Geben Sie Ihren Netto-Einkaufspreis ein: "))
quantity = int(input("Geben Sie die Artikelmenge ein: "))
net_sales, profit, grossmargin, breakeven, sales_price_5,sales_price_10,sales_price_15,sales_price_20,sales_price_25, sales_price_30, sales_price_35, sales_price_40, sales_price_45, margin_5, margin_10, margin_15, margin_20, margin_25, margin_30, margin_35, margin_40, margin_45 = calculator(eBay_category, sales_price, purchasing_price, quantity)
print(f"Der Nettoverkaufspreis ist {round(net_sales, 2)} €")
print(f"Der Gewinn ist {round(profit, 2)} €")
print(f"Die Bruttomarge ist {round(grossmargin, 2)} %")
print(f"Breakeven ist bei {math.ceil(breakeven)} Stück")
print(f"Der Nettoverkaufspreis ist bei 5 % Rabatt {round(sales_price_5, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 10 % Rabatt {round(sales_price_10, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 15 % Rabatt {round(sales_price_15, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 20 % Rabatt {round(sales_price_20, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 25 % Rabatt {round(sales_price_25, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 30 % Rabatt {round(sales_price_30, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 35 % Rabatt {round(sales_price_35, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 40 % Rabatt {round(sales_price_40, 2)} €")
print(f"Der Nettoverkaufspreis ist bei 45 % Rabatt {round(sales_price_45, 2)} €")
print(f"Die Bruttomarge ist bei 5 % Rabatt: {round(margin_5, 2)} %")
print(f"Die Bruttomarge ist bei 10 % Rabatt: {round(margin_10, 2)} %")
print(f"Die Bruttomarge ist bei 15 % Rabatt: {round(margin_15, 2)} %")
print(f"Die Bruttomarge ist bei 20 % Rabatt: {round(margin_20, 2)} %")
print(f"Die Bruttomarge ist bei 25 % Rabatt: {round(margin_25, 2)} %")
print(f"Die Bruttomarge ist bei 30 % Rabatt: {round(margin_30, 2)} %")
print(f"Die Bruttomarge ist bei 35 % Rabatt: {round(margin_35, 2)} %")
print(f"Die Bruttomarge ist bei 40 % Rabatt: {round(margin_40, 2)} %")
print(f"Die Bruttomarge ist bei 45 % Rabatt: {round(margin_45, 2)} %\n\n")
new_calculation = input("Möchten Sie eine weitere Berechnung durchführen?\nWählen Sie für JA: Y\nWählen Sie für NEIN: N")
if new_calculation.upper() == "Y":
continue
elif new_calculation.upper() == "N":
break
else:
raise ValueError("Unbekannte Eingabe")
Um das Kommata zu richten habe ich mir folgenden Code überlegt für die Eingabe des Einkaufs- Verkaufspreises.
Beide sind gleich und entsprechend angepasst, aber nur bei dem Einkaufspreis meckert er über die Syntax.
Was mir nicht klar ist, wenn müsste er es ja bei beiden machen und beim Verkaufspreis zuerst....
File "C:/Users/info/PycharmProjects/pythonProject1/main.py", line 82
purchasing_price = float(eingabe_purchasing_price.replace(",",".")
^
SyntaxError: invalid syntax
Beide sind gleich und entsprechend angepasst, aber nur bei dem Einkaufspreis meckert er über die Syntax.
Was mir nicht klar ist, wenn müsste er es ja bei beiden machen und beim Verkaufspreis zuerst....
Code: Alles auswählen
eingabe_sales_price = input("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ")
eingabe_purchasing_price = input("Geben Sie Ihren Netto-Einkaufspreis ein: ")
eBay_category = int(input("Drücke (1) für Bootssport\nDrücke (2) für Gartentechnik: "))
quantity = int(input("Geben Sie die Artikelmenge ein: "))
sales_price = float(eingabe_sales_price.replace(",",".")
purchasing_price = float(eingabe_purchasing_price.replace(",",".")
purchasing_price = float(eingabe_purchasing_price.replace(",",".")
^
SyntaxError: invalid syntax
Hallo,
er beschwert sich auch zu erst beim Verkaufspreis. Der Hinweis trifft nicht immer genau die Zeile, in der der Fehler auftritt, sondern dort, wo der Fehler bemerkt wird.
In dem Fall würde ich mal nachschauen wie viele Klammern du in einer Zeile aufmachst und wie viele davon wieder zugemacht werden.
Grüße
Dennis
er beschwert sich auch zu erst beim Verkaufspreis. Der Hinweis trifft nicht immer genau die Zeile, in der der Fehler auftritt, sondern dort, wo der Fehler bemerkt wird.
In dem Fall würde ich mal nachschauen wie viele Klammern du in einer Zeile aufmachst und wie viele davon wieder zugemacht werden.
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Danke für den Tipp….das war es.Dennis89 hat geschrieben: ↑Freitag 31. März 2023, 19:29 Hallo,
er beschwert sich auch zu erst beim Verkaufspreis. Der Hinweis trifft nicht immer genau die Zeile, in der der Fehler auftritt, sondern dort, wo der Fehler bemerkt wird.
In dem Fall würde ich mal nachschauen wie viele Klammern du in einer Zeile aufmachst und wie viele davon wieder zugemacht werden.
Grüße
Dennis
Vielleicht noch etwas zu deinem Code.
Auf Modulebene, der Code ohne Einrückungen, sollte kein ausführbarer Code stehen. Hier werden nur Konstanten, Klassen und Funktionen definiert. Es gibt eine Ausnahme, dass ist die 'if'-Abfrage, die den Einstieg in das Programm prüft.
In Python wird das Programm üblicherweise aus einer Funktion mit dem Namen 'main' gestartet und gesteuert.
Man muss keine Namen mit Nullen vorbelegen, sondern benutzt die Namen einfach dann, wenn man sie braucht.
Wenn man Namen nummeriert oder 9 mal hintereinander den gleichen Code schreibt, und dabei nur eine Zahl ändert, dann ist das ein Zeichen, dass da was falsch läuft.
Für die Berechnung könntest du eine Schleife schreiben und die Ergebnisse kannst du in eine Liste ablegen oder in diesem Fall würde vielleicht eine Schleife Sinn machen.
'continue' vermeidet man, das macht ein Programm öfters schlecht lesbar und auch schlecht erweiterbar. In deinem Fall würde ich "N" abfragen, wie du es gemacht hast, wenn dann die Eingabe was anderes wie "Y" ist, dann kommt dein gewünschter Error und ansonsten passiert einfach nichts und die Schleife beginnt von vorne.
Das angesprochene überarbeitet, könnte dann so aussehen:
Da kann man noch weiter optimieren, aber ich denke erst einmal sollte der Schritt von deinem Programm zu diesem Zwischenstand klar sein.
Das was ich da mit den Wörterbücher gemacht habe, wäre ausgeschrieben so:
Grüße
Dennis
Auf Modulebene, der Code ohne Einrückungen, sollte kein ausführbarer Code stehen. Hier werden nur Konstanten, Klassen und Funktionen definiert. Es gibt eine Ausnahme, dass ist die 'if'-Abfrage, die den Einstieg in das Programm prüft.
In Python wird das Programm üblicherweise aus einer Funktion mit dem Namen 'main' gestartet und gesteuert.
Man muss keine Namen mit Nullen vorbelegen, sondern benutzt die Namen einfach dann, wenn man sie braucht.
Wenn man Namen nummeriert oder 9 mal hintereinander den gleichen Code schreibt, und dabei nur eine Zahl ändert, dann ist das ein Zeichen, dass da was falsch läuft.
Für die Berechnung könntest du eine Schleife schreiben und die Ergebnisse kannst du in eine Liste ablegen oder in diesem Fall würde vielleicht eine Schleife Sinn machen.
'continue' vermeidet man, das macht ein Programm öfters schlecht lesbar und auch schlecht erweiterbar. In deinem Fall würde ich "N" abfragen, wie du es gemacht hast, wenn dann die Eingabe was anderes wie "Y" ist, dann kommt dein gewünschter Error und ansonsten passiert einfach nichts und die Schleife beginnt von vorne.
Das angesprochene überarbeitet, könnte dann so aussehen:
Code: Alles auswählen
import math
SCHIPPING_COSTS = 5.00
def calculator(ebay_category, sales_price, purchasing_price, quantity):
if ebay_category == 1:
ebay_fee = 11 if sales_price <= 990.00 else 2
elif ebay_category == 2:
ebay_fee = 12 if sales_price <= 200.00 else 2
else:
raise ValueError("wrong eBay_category")
ebay_provision = (sales_price / 100 * ebay_fee) + 0.35
net_sales = (sales_price / 1.19) - ebay_provision - SCHIPPING_COSTS
profit = net_sales - purchasing_price
grossmargin = 100 / net_sales * profit
breakeven = purchasing_price * quantity / net_sales
sales_prices = {
discount: net_sales - (net_sales / 100 * discount)
for discount in range(5, 50, 5)
}
margins = {
discount: (sale_price - purchasing_price) / sale_price * 100
for discount, sale_price in sales_prices.items()
}
return net_sales, profit, grossmargin, breakeven, sales_prices, margins
def main():
while True:
print(
"""Kostenkalkulator für eBay und Webseiten
Wählen Sie Ihre eBay Verkaufskategorie"""
)
ebay_category = int(
input("Drücke (1) für Bootssport\nDrücke (2) für Gartentechnik: ")
)
sales_price = float(
input("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ")
)
purchasing_price = float(input("Geben Sie Ihren Netto-Einkaufspreis ein: "))
quantity = int(input("Geben Sie die Artikelmenge ein: "))
net_sales, profit, grossmargin, breakeven, sales_prices, margins = calculator(
ebay_category, sales_price, purchasing_price, quantity
)
print(f"Der Nettoverkaufspreis ist {round(net_sales, 2)} €")
print(f"Der Gewinn ist {round(profit, 2)} €")
print(f"Die Bruttomarge ist {round(grossmargin, 2)} %")
print(f"Breakeven ist bei {math.ceil(breakeven)} Stück")
for discount, sale_price in sales_prices.items():
print(
f"Der Nettoverkaufspreis ist bei {discount} % Rabatt {round(sale_price, 2)} €"
)
for discount, margins in margins.items():
print(
f"Die Bruttomarge ist bei {discount} % Rabatt: {round(margins, 2)} %"
)
new_calculation = input(
"Möchten Sie eine weitere Berechnung durchführen?\nWählen Sie für JA: Y\nWählen Sie für NEIN: N"
)
if new_calculation.upper() == "N":
break
elif new_calculation.upper() != "Y":
raise ValueError("Unbekannte Eingabe")
if __name__ == "__main__":
main()
Das was ich da mit den Wörterbücher gemacht habe, wäre ausgeschrieben so:
Code: Alles auswählen
sales_prices = {}
for discount in range(5, 50, 5):
sales_prices[discount] = net_sales - (net_sales / 100 * discount)
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Hallo,
dann würde ich die Abfrage in eine Funktion auslagern und dort gleich dafür sorgen, dass die eingegebenen Werte überprüft werden. Negative Zahlen sind ja zum Beispiel auch unpassend. Wenn du erlaubst Zahlen mit Kommas einzugeben dann würde ich die auch als Kommazahl wieder ausgeben, dann entsteht such keine Verwechslung mit dem Tausenderpunkt, der bei Geldbeträgen üblich ist.
Grüße
Dennis
dann würde ich die Abfrage in eine Funktion auslagern und dort gleich dafür sorgen, dass die eingegebenen Werte überprüft werden. Negative Zahlen sind ja zum Beispiel auch unpassend. Wenn du erlaubst Zahlen mit Kommas einzugeben dann würde ich die auch als Kommazahl wieder ausgeben, dann entsteht such keine Verwechslung mit dem Tausenderpunkt, der bei Geldbeträgen üblich ist.
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Funktion wofür? Die Kommata?Dennis89 hat geschrieben: ↑Samstag 1. April 2023, 07:09 Hallo,
dann würde ich die Abfrage in eine Funktion auslagern und dort gleich dafür sorgen, dass die eingegebenen Werte überprüft werden. Negative Zahlen sind ja zum Beispiel auch unpassend. Wenn du erlaubst Zahlen mit Kommas einzugeben dann würde ich die auch als Kommazahl wieder ausgeben, dann entsteht such keine Verwechslung mit dem Tausenderpunkt, der bei Geldbeträgen üblich ist.
Grüße
Dennis
Funktionen sind für mehrfacher Verwendung oder der Übersichtlichkeit gut, gerade in größeren Programmen. Aber macht das Sinn bei solch kleinen Programmen das in extra Funktionen zu erstellen?
Man benutzt kein `round`, sondern Formatangaben:
Code: Alles auswählen
print(f"Der Nettoverkaufspreis ist {net_sales:.2f} €")
print(f"Der Gewinn ist {profit:.2f} €")
print(f"Die Bruttomarge ist {grossmargin:.2f} %")
Hallo,
ich finde das macht schon Sinn, weil ja jede Eingabe überprüft werden muss.
Zum Beispiel sowas:
mit diesem Beispielaufruf:
Die Abfrage nach Bootsport und Gartentechnik geht damit nicht, aber die würde ich anders machen. Eher so, das man den Anfangsbuchstabe eintippen muss. "B" für Bootsport und "G" für Gartentechnik.
Ich will nun aber nicht meine ganze Idee hier posten, außer es ist ausdrücklich erwünscht von dir, es soll ja dein Programm bleiben und ich mache das auch nur zum Hobby und meine Lösungen sind immer optimierbar.
Grüße
Dennis
ich finde das macht schon Sinn, weil ja jede Eingabe überprüft werden muss.
Zum Beispiel sowas:
Code: Alles auswählen
def get_user_entry(prompt, data_type):
while True:
try:
entry = data_type(input(prompt).replace(",", "."))
if entry <= 0:
raise ValueError
except ValueError:
print("Falsche Eingabe, bitte wiederholen")
else:
return entry
Code: Alles auswählen
sales_price = get_user_entry("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ", float)
Ich will nun aber nicht meine ganze Idee hier posten, außer es ist ausdrücklich erwünscht von dir, es soll ja dein Programm bleiben und ich mache das auch nur zum Hobby und meine Lösungen sind immer optimierbar.
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3 hat geschrieben: ↑Samstag 1. April 2023, 13:38 Man benutzt kein `round`, sondern Formatangaben:Code: Alles auswählen
print(f"Der Nettoverkaufspreis ist {net_sales:.2f} €") print(f"Der Gewinn ist {profit:.2f} €") print(f"Die Bruttomarge ist {grossmargin:.2f} %")
Warum? round ist doch eine funktionierende Funktion hier
Hallo,Dennis89 hat geschrieben: ↑Samstag 1. April 2023, 14:44 Hallo,
ich finde das macht schon Sinn, weil ja jede Eingabe überprüft werden muss.
Zum Beispiel sowas:mit diesem Beispielaufruf:Code: Alles auswählen
def get_user_entry(prompt, data_type): while True: try: entry = data_type(input(prompt).replace(",", ".")) if entry <= 0: raise ValueError except ValueError: print("Falsche Eingabe, bitte wiederholen") else: return entry
Die Abfrage nach Bootsport und Gartentechnik geht damit nicht, aber die würde ich anders machen. Eher so, das man den Anfangsbuchstabe eintippen muss. "B" für Bootsport und "G" für Gartentechnik.Code: Alles auswählen
sales_price = get_user_entry("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ", float)
Ich will nun aber nicht meine ganze Idee hier posten, außer es ist ausdrücklich erwünscht von dir, es soll ja dein Programm bleiben und ich mache das auch nur zum Hobby und meine Lösungen sind immer optimierbar.
Grüße
Dennis
für mich ist es auch hauptsächlich Hobby / Eigennutzung.
Ich habe leider gar keine Zeit mich so damit zu beschäftigen wie ich es gerne hätte.
Das heißt aber nicht, dass man sich nicht so gut es geht damit befassen kann.
Wie gesagt ich habe schon einmal vor Monaten angefangen und dann fehlte die Zeit, jetzt habe ich noch einmal von vorne angefangen.
Das Programm hier ist mehr oder weniger in kurzer Zeit rausgefluscht für mich verwendbar aber natürlich nicht gut geschrieben.
Auch das es eine bessere Lösung mit den Rabatten und Margins gibt war mir schon klar, aber zuweilen fehlt mir dann doch sogleich der beste Ansatz.
So auch mit deinem Eingabehinweis/
Für mich klappen die eigenen Inputanweisungen, aber ich habe mir deinen Hinweis angesehen und finde den gut, eine Funktion die float Eingaben erlaubt und bei falscher Eingabe einen Hinweis gibt.
Habe ich so nicht dran gedacht ist aber super.
Wenn ich mich nicht für Hinweise und Tipps interessieren würde, wäre ich in diesem Forum falsch.
Es ist mein Programm stimmt.
Und wollte ich es so rudimentär lassen wie ich es gemacht habe kann ich das auch tun, da ich es nur für mich nutze.
Aber jeder Tipp oder Hinweis ist doch gut.
Nur so lernt man und verbessert sich.
Meinetwegen kannst du das ganze Programm umschreiben und hier posten wenn du das möchtest.
Kritiken sind für mich nichts schlechtes nur so wird man auch selber besser.
Hallo,
das war mal mein letzter Stand, in dem ich mir überlegt habe, wie ich das mit den Eingaben machen würde:
Die Berechnerei habe ich ehrlich gesagt gar nicht angeschaut und einfach übernommen.
Grüße
Dennis
das war mal mein letzter Stand, in dem ich mir überlegt habe, wie ich das mit den Eingaben machen würde:
Code: Alles auswählen
from math import ceil
SHIPPING_COSTS = 5.00
TAX = 1.19
CATEGORIES = "Bootsport", "Gartentechnik"
YES_NO_CHOICE = "Yes", "No"
def calculate_financial_ratios(ebay_category, sales_price, purchasing_price, quantity):
ebay_provision = (sales_price / 100 * ebay_category) + 0.35
net_sales = (sales_price / TAX) - ebay_provision - SHIPPING_COSTS
profit = net_sales - purchasing_price
grossmargin = 100 / net_sales * profit
breakeven = purchasing_price * quantity / net_sales
sales_prices = {
discount: net_sales - (net_sales / 100 * discount)
for discount in range(5, 50, 5)
}
margins = {
discount: (sale_price - purchasing_price) / sale_price * 100
for discount, sale_price in sales_prices.items()
}
return net_sales, profit, grossmargin, breakeven, sales_prices, margins
def get_ebay_provision(sales_category, sales_price):
if sales_category == CATEGORIES[0]:
return 11 if sales_price <= 990.00 else 2
elif sales_category == CATEGORIES[1]:
return 12 if sales_price <= 200.00 else 2
def get_user_entry(prompt, data_type):
while True:
try:
entry = data_type(input(prompt).replace(",", "."))
if entry <= 0:
raise ValueError
except ValueError:
print("Falsche Eingabe, bitte wiederholen")
else:
return entry
def format_as_option(text):
return f"({text[0]}){text[1:]}"
def show_result(net_sales, profit, grossmargin, breakeven, sales_prices, margins):
print(f"Der Nettoverkaufspreis ist {net_sales:.2f} €".replace(".", ","))
print(f"Der Gewinn ist {profit:.2f} €".replace(".", ","))
print(f"Die Bruttomarge ist {grossmargin:.2f} %".replace(".", ","))
print(f"Breakeven ist bei {ceil(breakeven)} Stück")
for (discount, sale_price), margin in zip(sales_prices.items(), margins.values()):
print(
f"Der Nettoverkaufspreis ist bei {discount} % Rabatt {sale_price:.2f} €".replace(
".", ","
)
)
print(
f"Die Bruttomarge ist bei {discount} % Rabatt: {margin:.2f} %".replace(
".", ","
)
)
def main():
letter_to_choice_category = {choice[0]: choice for choice in CATEGORIES}
letter_to_choice_yes_no = {answer[0]: answer for answer in YES_NO_CHOICE}
prompt = f'{", ".join(map(format_as_option, CATEGORIES))}? : '
try:
while True:
print(
"Kostenkalkulator für eBay und Webseiten\nWählen Sie Ihre eBay Verkaufskategorie"
)
while True:
sales_category = letter_to_choice_category.get(input(prompt).upper())
if sales_category in CATEGORIES:
break
else:
print("Falsche Eingabe, versuche es erneut.")
sales_price = get_user_entry(
"Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ", float
)
purchasing_price = get_user_entry(
"Geben Sie Ihren Netto-Einkaufspreis ein: ", float
)
quantity = get_user_entry(
"Geben Sie die Artikelmenge (nur Ganzzahlen) ein: ", int
)
ebay_category = get_ebay_provision(sales_category, sales_price)
(
net_sales,
profit,
grossmargin,
breakeven,
sales_prices,
margins,
) = calculate_financial_ratios(
ebay_category, sales_price, purchasing_price, quantity
)
show_result(
net_sales, profit, grossmargin, breakeven, sales_prices, margins
)
print("Möchten Sie eine weitere Berechnung durchführen?")
prompt = f'{", ".join(map(format_as_option, YES_NO_CHOICE))}? : '
while True:
calculate_again = letter_to_choice_yes_no.get(input(prompt).upper())
if calculate_again == "No":
raise KeyboardInterrupt
elif calculate_again == "Yes":
break
except KeyboardInterrupt:
print("Das Programm wurde durch den Benutzer abgebrochen, schade :(")
if __name__ == "__main__":
main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Ja sieht gut aus, wobei ich hier schon bei einigen Punkten nicht mehr mitkomme und nicht weiß was dort passiert auch wenn ich jetzt mehrfach drauf geschaut habe:
def format_as_option(text):
return f"({text[0]}){text[1:]}"
Es hat was mit den Buchstaben zu tun und diese als Auswahl mit input zu nutzen, aber ehrlich verstehe ich nicht, wie es funktioniert ebenso die anderen Teile die dazu gehören, dass ist für mich noch viel zu weit.
def format_as_option(text):
return f"({text[0]}){text[1:]}"
Es hat was mit den Buchstaben zu tun und diese als Auswahl mit input zu nutzen, aber ehrlich verstehe ich nicht, wie es funktioniert ebenso die anderen Teile die dazu gehören, dass ist für mich noch viel zu weit.
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@andie39: An Python praktisch ist, dass man einiges auch einfach in einer Python-Shell interaktiv ausprobieren kann, um zu schauen was mit Werten und Teilausdrücken passiert:
Code: Alles auswählen
In [6]: def format_as_option(text):
...: return f"({text[0]}){text[1:]}"
...:
In [7]: format_as_option("Hallo")
Out[7]: '(H)allo'
In [8]: format_as_option("Test")
Out[8]: '(T)est'
In [9]: text = "Hallo"
In [10]: text[0]
Out[10]: 'H'
In [11]: text[1:]
Out[11]: 'allo'
In [12]: f"({text[0]}){text[1:]}"
Out[12]: '(H)allo'
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Ja richtig, jetzt habe ich es auch verstanden.__blackjack__ hat geschrieben: ↑Sonntag 2. April 2023, 15:26 @andie39: An Python praktisch ist, dass man einiges auch einfach in einer Python-Shell interaktiv ausprobieren kann, um zu schauen was mit Werten und Teilausdrücken passiert:Code: Alles auswählen
In [6]: def format_as_option(text): ...: return f"({text[0]}){text[1:]}" ...: In [7]: format_as_option("Hallo") Out[7]: '(H)allo' In [8]: format_as_option("Test") Out[8]: '(T)est' In [9]: text = "Hallo" In [10]: text[0] Out[10]: 'H' In [11]: text[1:] Out[11]: 'allo' In [12]: f"({text[0]}){text[1:]}" Out[12]: '(H)allo'
Es ist ja auch nicht so, dass ich nichts verstehe aber vieles ist so verschaltet das ich da auch noch den Überblick verliere.
Bestens hier:
letter_to_choice_category = {choice[0]: choice for choice in CATEGORIES}
letter_to_choice_yes_no = {answer[0]: answer for answer in YES_NO_CHOICE}
prompt = f'{", ".join(map(format_as_option, CATEGORIES))}? : '
Und wird dann genutzt:
sales_category = letter_to_choice_category.get(input(prompt).upper())
Ich schaue jetzt sehr lange darauf und ich weiß ja vom Programm was es macht. Ich sehe die for Schleife, ich sehr das die letter_to variablen dictionary sind mit iteration
Und doch begreife ich es nicht vollständig.
Ergo würde ich darauf auch selber nie kommen.
Teilstücke, Bereiche von Python nach Lehrbuch etc verstehe ich ja, sobald es aber komplexer wird und verschalter wird, bekomme ich große Probleme.
Das kannst du auf die gleiche Weise nachvollziehen:
Grüße
Dennis
Code: Alles auswählen
PyDev console: starting.
Python 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] on win32
>>>CATEGORIES = "Bootsport", "Gartentechnik"
>>>letter_to_choice_category = {choice[0]: choice for choice in CATEGORIES}
>>>print(letter_to_choice_category)
{'B': 'Bootsport', 'G': 'Gartentechnik'}
>>>user_entry = input("(B)ootsport, (G)artentechnik").upper()
(B)ootsport, (G)artentechnik>? b
>>>print(user_entry)
B
>>>print(letter_to_choice_category.get(user_entry))
Bootsport
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Ja. So wie ich das sehe wird ein dictionary erzeugt mit dem Schlüssel B für Boote und G für Gartentechnik.Dennis89 hat geschrieben: ↑Sonntag 2. April 2023, 17:58 Das kannst du auf die gleiche Weise nachvollziehen:GrüßeCode: Alles auswählen
PyDev console: starting. Python 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] on win32 >>>CATEGORIES = "Bootsport", "Gartentechnik" >>>letter_to_choice_category = {choice[0]: choice for choice in CATEGORIES} >>>print(letter_to_choice_category) {'B': 'Bootsport', 'G': 'Gartentechnik'} >>>user_entry = input("(B)ootsport, (G)artentechnik").upper() (B)ootsport, (G)artentechnik>? b >>>print(user_entry) B >>>print(letter_to_choice_category.get(user_entry)) Bootsport
Dennis
Wenn B oder G gedrückt wird, ist der Wert vorhanden und es wird die Variabel sales_category beschrieben diese wird ja in einer weiteren Funktion zur Berechnung verwendet.
Wenn ich richtig liege.
Aber dennoch das ist halt sehr verschachtelt und für mich nicht einfach zu sehen.
Ich weiß nicht ob es später für mich einmal einfacher wird.
Jetzt ist es doch recht schwierig
Je mehr ich draufschaue verstehe ich den Gedankengang.
Einige Funktionen sind nur einfache Funktionen die wieder verwendet werden wie das mit der Ausgabe des auswählbaren Buchstabens.
Was ja der Sinn von Funktionen ist.
Prinzipiell wird es dann ja nur zusammengebaut.
Aber der Weg dahin, entscheiden welche Funktionen man baut und wie man diese bauen muss damit diese auch so verwendbar sind finde ich nicht so einfach.
Ist das hier einfach aus der Hüfte rausgeschossen oder hast du dir hier erst mal einen Plan gemacht?
Einen Grundplan sollte man ja immer haben aber ist das hier mehr oder weniger so aus der Tastertur geflossen oder nicht?
Einige Funktionen sind nur einfache Funktionen die wieder verwendet werden wie das mit der Ausgabe des auswählbaren Buchstabens.
Was ja der Sinn von Funktionen ist.
Prinzipiell wird es dann ja nur zusammengebaut.
Aber der Weg dahin, entscheiden welche Funktionen man baut und wie man diese bauen muss damit diese auch so verwendbar sind finde ich nicht so einfach.
Ist das hier einfach aus der Hüfte rausgeschossen oder hast du dir hier erst mal einen Plan gemacht?
Einen Grundplan sollte man ja immer haben aber ist das hier mehr oder weniger so aus der Tastertur geflossen oder nicht?