Anfängerfrage String Handhabung

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Wunderschöne Grüße aus Dresden


    Mit meinen neuen Raspberry PI4 habe ich nun die ersten Programmierversuche unternommen. Dazu habe ich mir ein Lernanleitung aus dem Internet heruntergeladen. Leider fehlen in dieser die Lösungen.
    Hierzu nun folgende Aufgabenstellung.
    Bestimme die erste Position des Buchstabens 'g' in der String-Variable.
    Das so habe ich das einem Tutorial entnommen, dass das mit position = stringvariable.find('g') geht.
    Die vorangestellte Variable "position" im Code-Text liefert nun die Position des Buchstabens zurück. Das klappt auch soweit.
    Jetzt soll man aus einer Eingabe mit Input in den Ausgangsstring vor dem Buchstaben 'g' die Input Eingabe einfügen:

    stringvariable hat den Inhalt 'Hallo, das ist mein erstes Testprogramm'
    Die Variable aus dem input hat nun den Inhalt 'Fernsehpro'.
    Somit sollte nach der Ergänzung 'Hallo, das ist mein Fernsehprogramm' herauskommen. So wird es in der Übungsanleitung beschrieben.

    Ich hoffe nur das ich das verständidlich beschrieben habe.

    Hier noch einmal die Aufgabenstellung:
    Übergib einer Variablen den Inhalt 'Hallo, das ist mein erstes Testprogramm'
    Füge eine Benutzereingabe hinzu, und gib dort 'Fernsetpro' ein
    Füge den String aus der Varaiable der Benutzer Eingabe vor der Stelle des ersten gefunden "g" so ein, dass die ursprüngliche Variable nun den Inhalt 'Hallo, das ist mein Fernsehprogramm' ausgegeben wird.

    Ich bin einfach Ratlos wie man das umsetzen könnte. :helpnew:

    Danke im Voraus,

    Und liebe Grüße
    Antje

  • Code
    pos = stringvariable.find("g")
    stringvariable = stringavariable[0:(pos-7)] + "Fernseh" + stringvariable[pos:]

    So ungefähr.


    Sehr gut nachlesbar hier.

    find und index sind wohl weitgehend identisch - nur die Fehlerbehandlung ist anders.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

    • Official Post

    Hallo Pi.Antje.DD,


    willkommen im Forum! ;)



    Gnom Besser, bzw. aktueller wäre ein f-String zum Zusammensetzen der Teile:

    Code
    >>> stringvariable = 'Hallo, das ist mein erstes Testprogramm'
    >>> pos = stringvariable.find("g")
    >>> eingabe = input()
    Fernsehpro
    >>> print(f"{stringvariable[0:(pos-7)]}{eingabe}{stringvariable[pos:]}")
    Hallo, das ist mein erstes Fernsehprogramm
  • Wunderschöne Grüße aus Dresden,

    Das ist soweit ganz super. :danke_ATDE:
    Diesen Teil des Ersetzen funktioniert auch bei mir. Danke dafür :love:


    Jetzt muss ich das wohl noch einige Male mit anderen Beispielen durchspielen, um das wirklich zu verstehen. Gut.
    Da werde ich wohl noch mal etwas herumprobieren.

    Dennoch ist mir jedoch aufgefallen, dass das Wort oder der Teil- String "erstes" davor auch noch verschwinden sollte.

    Kann man das mit stringvariable.split( Parameter) machen, und dann die Einzelteile wieder Zusammensetzen ?
    Nur woher bekomme ich dann die Position, wenn das Ersetzen klappt, dass der möglicher Weise gesplitete String genau den Teil verschwinden lässt, der vor der Manipulation steht ?

    Erst einmal herzlichen Dank an Gnom und hyle ! :*


    Liebe Grüße

    Antje

  • Wunderschöne Grüße aus Dresden,

    Ich hatte schon Gedanken gefasst, was jedoch auch nicht funktioniert, dass man mit len() von beiden Strings (Stringvariable) und (eingabe) die Länge feststelle.
    Dann habe ich versucht, über eine "for x in Range(len(stringvariable)) Schleife die Buchstaben aus der Variable "Stringvariable" herauszulösen, und die einer neunen Variable zu übergeben. Mit einer IF Abfrage wollte ich dann die Buchstaben aus der Eingabe- Varible nutzen, und wenn der POS von 'g' erreicht ist, dann wieder die Buchstaben aus der Stringvariable. Anschliessend wollte ich den neuen String der ursprünglichen Variable Stringvariable übergeben.

    Nur kommt dann "Hallo, das ist mein erstFernsehprogramm" heraus. :helpnew:

    Danke ihr seit hier so super nett und hilfsbereit <3

    Liebe Grüße
    Antje

    • Official Post

    Dennoch ist mir jedoch aufgefallen, dass das Wort oder der Teil- String "erstes" davor auch noch verschwinden sollte.


    Python
    pos_erstes = stringvariable.find("erstes")
    # noch einfügen und mit
    print(f"{stringvariable[0:(pos_erstes)]}{eingabe}{stringvariable[pos:]}")
    # ausgeben
  • Wunderschöne Grüße aus Dresden,


    Danke hyle :love:


    Meine Erkenntnis aus dieser Lektion ist, dass es sich wohl doch lohnt ein Fachbuch zukaufen.

    Learning bei Doing ist wohl doch nicht der richtige Weg, obwohl ich vor 20 Jahren mal Informatik und C++ studiert habe. Jetzt bin ich in einem ganz anderen Beruf.

    Danke nochmals und ich erkläre das Thema als gelöst !

    Danke, an alle :bravo2:

    Liebe Grüße

    Antje

  • Hallo,

    Dann habe ich versucht, über eine "for x in Range(len(stringvariable)) Schleife die Buchstaben aus der Variable "Stringvariable" herauszulösen, und die einer neunen Variable zu übergeben.

    der Vollständigkeitshalber: Mit 'range' kannst du die Buchstaben nicht herauslösen. Dokumentiert ist die Funktion hier.

    Schau dir den Code an und lasse ihn bei dir auch mal laufen

    Code
    test_string = 'Huston, we have a problem'
    for x in range(len(test_string)):
        print(x)

    'len(test_string)' gibt die die Anzahl der Zeichen zurück, die der String enthält, ink. Leerzeichen.

    In diesem Fall sind es 25. Das heißt die Funktion könnte man auch so schreiben:

    Code
    for x in range(25):
        print(x)

    Beides mal ist das Ergebnis das gleiche und zwar:

    Das liegt daran, dass der 'range' immer bei 0 anfängt. Wenn man das anders haben möchte kann man auch noch einen Startwert und einen Schrittwert angeben. Zum Beispiel soll von 5 in 2er Schritte bis 11 gezählt werden:

    Code
    for x in range(5, 13, 2):
        print(x)

    Hier muss man wieder beachten, das obwohl der Startwert mit 5 angegeben wurde, der angegebene Endwert um die Schrittfolge reduziert ausgegeben wird. Sprich wenn man in zweier Schritten bis 11 zählen will, ist der Endwert 13.


    Willst du die Buchstaben aus einem String lösen, dann kannst du direkt über den String iterieren:

    Code
    test_string = 'Huston, we have a problem'
    for letter in test_string:
        print(letter)

    Das ergibt:

    So kannst du in jedem Schleifendurchlauf mit dem Buchstaben und dem Leerzeichen, das ja auch zum String gehört, machen was du willst.


    Vielleicht hilft dir das für künftige Aufgabenstellungen weiter.


    Viel Spass mit Python und Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧

  • Noch als ergänzende Anmerkung: `find()` ist ein bisschen problematisch, weil all die Beispiele, die das hier verwenden mit dem Ergebnis einfach so ungeprüft weiterarbeiten und das als Index verwenden — wenn nichts gefunden wird, dann gibt `find()` den Wert -1 zurück und der ist ein gültiger Indexwert! Da muss man also schauen was der Code dann macht und ob das überhaupt sinnvoll ist. Statt `find()` würde ich eigentlich immer `index()` verwenden. Das funktioniert grundsätzlich wie `find()` nur das eine Ausnahme ausgelöst wird falls die Suche erfolglos blieb.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

  • Wunderschöne Grüße

    Ich hatte mich wohl etwas unverständlich ausgedrückt :*



    Das war mein missglückter Versuch 8o

    Auch eine netten Gruß an dich

    Noch als ergänzende Anmerkung: `find()` ist ein bisschen problematisch, weil all die Beispiele, die das hier verwenden mit dem Ergebnis einfach so ungeprüft weiterarbeiten und das als Index verwenden — wenn nichts gefunden wird, dann gibt `find()` den Wert -1 zurück und der ist ein gültiger Indexwert! Da muss man also schauen was der Code dann macht und ob das überhaupt sinnvoll ist. Statt `find()` würde ich eigentlich immer `index()` verwenden. Das funktioniert grundsätzlich wie `find()` nur das eine Ausnahme ausgelöst wird falls die Suche erfolglos blieb.


    So, und nun bin ich noch mehr verwirrt.

    Kann es sein, dass es hier mehrere Lager an Programmieren gibt ?

    Ich selbe möchte hiermit keinen Streit verursachen. Die ersten Lösungen von hyle und Gnom waren für mich zureichend, obwohl ich sie bis jetzt noch nicht soweit verstanden habe, dass ich diese später wieder in einer anderen, oder abgewandelten Form umsetzen könnt.

    Herr, wohl __blackjack__, Oder ?

    Würdest du das auch mal an diesem Lernaufgabenbeispiel soweit erklären, wenn die Benutzereingabe eine andere wäre, oder der Einstiegspunkt nicht dieses 'g' so vorbestimmt wäre ?

    Meinen herzlichen Dank gilt immer noch den beiden Foren-Mitgliedern, die mir fast sofort mit einer Lösungshilfe unter die Arme gegriffen haben. Die nächsten 3 Aufgaben aus dieser Lernvorlage konnte ich nun, weil ich und mein Sohn sich nun damit schon etwas intensiver auseineder gesetzt haben, fast aus unserem erlernten Erfahrungsschatz lösen.

    Ich würde das Thema jedoch als beendet betrachtet wollen, ausser __blackjack__ kann hier noch etwas beitragen, was er mit seiner Kritik ausdrücken wollte.
    Herr __blackjack__ , ich würde sie bitten den abgewandelten Programmcode doch für alle sichtbar einzustellen, wenn sie mit den Vorredner nicht einverstanden sind.

    So .. nun wird das PI abgeschaltet, und wir begeben uns zu Bett

    Wie immer liebe Grüße :*

    Antje

  • Einfach `find()` in den Beispielen durch `index()` ersetzen und `find()` am besten vergessen. 🙂


    Theoretisch hast Du ja recht das in dem Beispiel ein 'g' vorkommt — es ist aber erstaunlich wie oft beim Programmieren Sachen passieren, die eigentlich *nie* passieren dürften weil man sich irgendwo vertippt oder geirrt hat. Und bei `index()` kracht das dann laut und deutlich, mit Hinweis im Traceback wo es passiert ist, während bei `find()` erst einmal einfach mit einem falschen Wert weitergearbeitet wird. Das kann zu einem Folgefehler führen der wieder in einer Ausnahme endet, es kann aber auch einfach zu falschen Ergebnissen führen. Wenn man Glück hat bemerkt man das. Wenn man Pech hat bemerkt man es zu spät.


    Ich bin von so etwas schon mal gekniffen worden und ganz generell sind spezielle Fehlerwerte keine gute Idee, weswegen Ausnahmen erfunden wurden. Damit braucht man nicht jeden Rückgabewert auf Gültigkeit prüfen und kann nicht aus Bequemlichkeit oder weil man etwas übersehen hat, Fehler ignorieren. Besonders blöd sind spezielle Rückgabewerte wenn die gleichzeitig gültige Werte für die typische Weiterverarbeitung sind. Wenn die API von `find()` beispielsweise `None` statt -1 zurückeben würde, wäre das deutlich weniger problematisch. Die API ist aber nun mal so bekloppt, dass man die Methode am besten vergisst.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors