Erstes "Projekt" eines Neulings

Code-Stücke können hier veröffentlicht werden.
Antworten
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Moin zusammen,

ich habe heute mein erstes, in meinen Augen, vorzeigbares Projekt begonnen.
Aufgegriffen habe ich die Idee eines Übersetzers, den ich dann nach eigenen Vorstellungen umgesetzt habe.
Da ich nur Java Basics besitze und mit Python gerade anfange (beides wird neben Job und Familie im Selbststudium gelernt), wollte ich hier mal nachhören ob das bisschen Code so korrekt umgesetzt wäre.

Meine nächsten Ziele sind:

- Mehr Sprachen
- Dynamische Erkennung der Eingabesprache
- GUI

Verwendet wurde hier die Google API

Code: Alles auswählen

from googletrans import Translator

translator = Translator()

print("Bitte eine Sprache wählen (de)")
print("Please choose an language (en)")
print("veuillez choisir une langue (fr)")
lang_in = input("")
print("")

if lang_in == "de":
    print("Welcher Text soll übersetzt werden?")
    text = input("")
    print("")
if lang_in == "en":
    print("Which text should be translated?")
    text = input("")
    print("")
if lang_in == "fr":
    print("Quel texte traduire?")
    text = input("")
    print("")


print("In welcher Sprache soll die Übersetzung erfolgen? (de)")
print("In which language should the translation be done? (en)")
print("Dans quelle langue la traduction doit-elle être effectuée? (fr)")
lang_out = input("")
print("")

Result = translator.translate(text, lang_out).text

print(Result)




Ich würde mich über Input freuen und hoffe auf viele interessante Konversationen hier im Forum.

VG
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Kotelettklopfer,

schon okay für den Anfang.
Als nächstes solltest du lernen wie man Funktionen verwendet. Dann kann man die Benutzereingabe und die Übersetzung und Ausgabe in einzelne Funktionen aufteilen.
Außerdem währe es gut, wenn das Ganze in einer Schleife läuft, damit man das Programm nicht für jede Übersetzung neu starten muss.

Leere print() und input() Funktionen brauchen keine Anführungsstriche.
Man kann aber auch einen Text an die input() Funktion übergeben, dann spart man sich die vorherige Ausgabe durch print().
Lokale Variablen kann man groß schreiben, wenn man der Konvention folgen will, sollte man sie aber klein schreiben.
Falls der Benutzer ein nicht unterstütze Sprache eingibt, sollte es eine entsprechende Fehlermeldung geben.
Dafür müsste die Eingabe dann erneut möglich sein um den Fehler zu korrigieren.

Die aktuelle Version von googletrans scheint auch einen Fehler zu haben.
https://github.com/ssut/py-googletrans/issues/319

Ich bekomme den gleichen Fehler der hier auch beschrieben ist.
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Danke für deine ausführliche Rückmeldung.

Außerdem währe es gut, wenn das Ganze in einer Schleife läuft, damit man das Programm nicht für jede Übersetzung neu starten muss. --> Das wollte ich noch umsetzen, das immer neustarten war nervig

Leere print() und input() Funktionen brauchen keine Anführungsstriche. --> Gute Info

Man kann aber auch einen Text an die input() Funktion übergeben, dann spart man sich die vorherige Ausgabe durch print(). --> Das wusste ich, aber wollte, dass die User EIingabe in der nächsten Zeile erscheint. Gebe ich dem Input Text mit dann würde der User ja sofort dahinter schreiben. Geht bestimmt anders umzusetzen

Lokale Variablen kann man groß schreiben, wenn man der Konvention folgen will, sollte man sie aber klein schreiben. --> Ja Konventionen muss ich noch anschauen. Result war hier aber tatsächlich ein Fehler

Falls der Benutzer ein nicht unterstütze Sprache eingibt, sollte es eine entsprechende Fehlermeldung geben. --> Stimmt, stand auch auf der Agenda

Die aktuelle Version von googletrans scheint auch einen Fehler zu haben.
https://github.com/ssut/py-googletrans/issues/319 ---> Hatte ich auch, bin dann eine Version runter gegangen
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Wäre dies die richtige Lösung für die For Schleife bei Falscheingabe der Sprache ?
Mein Test verlief positiv, was nicht heißen muss, dass die Umsetzung passt.

Code: Alles auswählen

from googletrans import Translator

translator = Translator()

lang_exist = False

while lang_exist == False:
    
    print("Bitte eine Sprache wählen (de)")
    print("Please choose an language (en)")
    print("veuillez choisir une langue (fr)")
    lang_in = input("")
    print("")
    
    if (lang_in == "de" or lang_in == "en" or lang_in == "fr"):  
        lang_exist = True
    else:
        print("Unbekannte Sprache | Unknown language | Langue inconnue")
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kotelettklopfer: Flags braucht man eigentlich nie für while-Schleifen, weil man die einfach per `break` verlassen kann. Die lange if-Bedingung kann man mit `in` deutlich übersichtlicher schreiben. Benutze keine Abkürzungen. Was ist lang und was ist in?

Code: Alles auswählen

while True:    
    print("Bitte eine Sprache wählen (de)")
    print("Please choose an language (en)")
    print("veuillez choisir une langue (fr)")
    input_language = input("")
    print("")
    
    if input_language in ["de", "en", "fr"]:
        break
    else:
        print("Unbekannte Sprache | Unknown language | Langue inconnue")
Dann schreibt man das ganze als Funktion:

Code: Alles auswählen

def choose_language():
    while True:    
        print("Bitte eine Sprache wählen (de)")
        print("Please choose an language (en)")
        print("veuillez choisir une langue (fr)")
        input_language = input("")
        print("")
        
        if input_language in ["de", "en", "fr"]:
            return input_language
        print("Unbekannte Sprache | Unknown language | Langue inconnue")


input_language = choose_language()
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

@Sirius3:

In deiner Version gibt es ja keine Variable mit True / False. Verstehe ich richtig, dass der Zustand der While Schleife sich ändert jenachdem ob if oder else "erfüllt" ist?
If -> Zustand True -> While wird verlassen
Else -> Zustand False -> Schleife läuft erneut

Wenn ja, müsste es dann nciht lauten while False ? Solange if nicht erfüllt ist wiederhole diese Schleife ?

Bitte eventuelle dumme Fragen zu entschuldigen. Bin noch recht Neu in der Programmier Materie :-)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

While False bricht doch sofort ab. Das while läuft bis die Bedingung falsch ist. Sie also hart auf falsch zu ziehen lässt es keinmal laufen.

Und wenn die Eingabe erfolgreich ist, dann wird die Funktion mit Return verlassen. Das beendet auch die Schleife.
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Das ist genau was ich gerade nicht ganz verstehe.
Warum bricht er bei while False direkt ab? Bedeutet doch vereinfacht gesagt "Solange Falsch" -> Solang die Eingabe Falsch ist, wiederhole die Schleife.



2. Woher nimmt er in Sirius Version die Info ob etwas Wahr oder Unwahr ist?

Hier stehe ich vollkommen auf dem Schlauch



Edit: Sehe auch jetzt, dass input_language eine Liste ist.Vielleicht hat es damit etwas zu tun.
Werde nochmal meine Bücher weiter durchackern.

Bin nur ein Freund davon beim lernen eigene Projekte zu probieren.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Python weiß nix von “Eingabe falsch“. Es kennt nur „while etwas-ist-wahr“. Das war es. Das DU das wahre etwas gedanklich als „Eingabe falsch“ definierst, ändert Pythons Verhalten nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kotelettklopfer: ``while False:`` sagt solange die Bedingung wahr ist führe folgendes aus. Und die Bedingung ist hart und bedingungslos *unwahr* und niemals wahr, also wird der Schleifenkörper auch niemals ausgeführt. Von einer Eingabe sehe ich in der Bedingung ``False`` nichts und Python auch nicht. Für die Entscheidung Schleifenkörper ausführen oder nicht ist nur die Bedingung nach dem ``while`` entscheidend, nicht was *in* der Schleife steht, denn die Bedingung ist ja gerade dazu da zu entscheiden ob das überhaupt ausgeführt wird. Man kann ja nicht sagen führe folgendes aus wenn das beim Ausführen dieses oder jenes macht, und wenn es das nicht macht, dann steig in die Zeitmaschine und tu so als wäre das nie ausgeführt worden. Womit man dann wieder nicht wüsste ob man es denn ausführen sollte oder nicht. 🤪

Ad 2.) `False` ist unwahr. Per Definition. Immer.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Ich kenne schon den Unterschied zwischen True und False.
Mir als blutigem Anfänger wird aber der Hintergrund nicht klar warum es so funktioniert wie es da oben steht.
Schaue mir mal weitere Beispiele an, vielleicht komme ich dann dahinter.

Danke Euch trotzdem !!
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

__blackjack__ hat geschrieben: Montag 17. Januar 2022, 13:15 @Kotelettklopfer: ``while False:`` sagt solange die Bedingung wahr ist führe folgendes aus. Und die Bedingung ist hart und bedingungslos *unwahr* und niemals wahr, also wird der Schleifenkörper auch niemals ausgeführt. Von einer Eingabe sehe ich in der Bedingung ``False`` nichts und Python auch nicht. Für die Entscheidung Schleifenkörper ausführen oder nicht ist nur die Bedingung nach dem ``while`` entscheidend, nicht was *in* der Schleife steht, denn die Bedingung ist ja gerade dazu da zu entscheiden ob das überhaupt ausgeführt wird. Man kann ja nicht sagen führe folgendes aus wenn das beim
Bedeutet man würde also niemals while False schreiben ?
Ne Schleife die niemals ausgeführt wird kann ich ja ganz einfach weglassen oder?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

While heißt Während.
Während die folgende Bedingung wahr ist, wiederhole den folgenden Block.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Eine andere Version von while in Python wäre aber

Code: Alles auswählen


j = 10

while j >=1
	print(j)
	j +=1  

oder arbeitet man immer mit endlosschleifen die dann per break gestoppt werden?

Gibt es das inkrementieren per ++ in Python nicht?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich schrieb, dass man normalerweise keine while-Schleifen mit Flags benutzt. Für andere Bedingungen können while-Schleifen durchaus Sinn machen.
Das was Du schreibst, ist aber wieder äquivalent zu einer while-True-Schleife, weil j immer größer als 1 ist, egal wie oft Du j um 1 erhöhst.

Nein, es gibt kein ++ zum Inkrementieren in Python. Das ist `+= 1`.
Kotelettklopfer
User
Beiträge: 22
Registriert: Samstag 15. Januar 2022, 13:34

Sorry, war die Aufregung :-)

Natürlich sollte es j -=1 heißen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kotelettklopfer: Einen ``++``-Operator gibt es in Python nicht.

In dem Beispiel ist die Bedingung ja auch immer Wahr, also würde man da ``True`` schreiben, statt das so umständlich auszudrücken das der Leser erst selbst nachdenken und feststellen muss, dass das immer `True` ergibt.

Und das ist eigentlich eine ``for``-Schleife:

Code: Alles auswählen

from itertools import count

for j in count(10):
    print(j)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ups da war ich etwas zu spät, das mit dem ``-=`` hatte ich da noch nicht gelesen. Bleibt trotzdem eine ``for``-Schleife:

Code: Alles auswählen

for j in reversed(range(1, 11)):
    print(j)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten