eBay Kalkulationsprogramm

Du hast eine Idee für ein Projekt?
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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.

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")
 
  
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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....

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(",",".")
File "C:/Users/info/PycharmProjects/pythonProject1/main.py", line 82
purchasing_price = float(eingabe_purchasing_price.replace(",",".")
^
SyntaxError: invalid syntax
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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
Danke für den Tipp….das war es.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

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:

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()
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:

Code: Alles auswählen

sales_prices = {}
for discount in range(5, 50, 5):
    sales_prices[discount] = net_sales - (net_sales / 100 * discount)
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Das sieht besser aus.
Habe mir den Code angesehen und das mit dem dictionary grundsätzlich auch verstanden.

Hier fehlt mir einfach noch die Erfahrung/Übung auf diese kürzere Lösung zu kommen.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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
Funktion wofür? Die Kommata?

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?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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} %")
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

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
mit diesem Beispielaufruf:

Code: Alles auswählen

sales_price = get_user_entry("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ", float)
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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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:

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
mit diesem Beispielaufruf:

Code: Alles auswählen

sales_price = get_user_entry("Geben Sie den eBay Verkaufspreis inkl. MwSt und Versand ein: ", float)
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
Hallo,

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.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

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()
Die Berechnerei habe ich ehrlich gesagt gar nicht angeschaut und einfach übernommen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
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'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__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'
Ja richtig, jetzt habe ich es auch verstanden.
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.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Das kannst du auf die gleiche Weise nachvollziehen:

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
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Dennis89 hat geschrieben: Sonntag 2. April 2023, 17:58 Das kannst du auf die gleiche Weise nachvollziehen:

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
Grüße
Dennis
Ja. So wie ich das sehe wird ein dictionary erzeugt mit dem Schlüssel B für Boote und G für Gartentechnik.
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
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

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?
Antworten