Python-Strings

Python hat eine integrierte Stringklasse namens „str“ mit vielen praktischen Funktionen (es gibt ein älteres Modul namens "string", das Sie nicht verwenden sollten). Stringliterale können entweder in doppelte oder einfache Anführungszeichen gesetzt werden, wobei einfache Anführungszeichen häufiger verwendet werden. Umgekehrte Schrägstriche funktionieren wie gewohnt in Literalen mit einfachen und doppelten Anführungszeichen, z.B. \n \" \". Ein Stringliteral mit doppelten Anführungszeichen kann einfache Anführungszeichen ohne einfache Schreibprobleme enthalten (z. B. „Ich habe das nicht getan“). Gleichermaßen kann ein String in einfachen Anführungszeichen doppelte Anführungszeichen enthalten. Ein Stringliteral kann sich über mehrere Zeilen erstrecken. Am Ende jeder Zeile muss jedoch ein umgekehrter Schrägstrich \ stehen, um den Zeilenumbruch zu maskieren. Stringliterale in dreifachen Anführungszeichen, „"“ oder '', können sich über mehrere Textzeilen erstrecken.

Python-Strings sind „unveränderlich“ Das bedeutet, dass sie nach ihrer Erstellung nicht mehr geändert werden können. Auch für Java-Strings wird dieser unveränderliche Stil verwendet. Da Strings nicht geändert werden können, erstellen wir *neue* Strings, um berechnete Werte darzustellen. Der Ausdruck ('hello' + 'there') akzeptiert beispielsweise die beiden Zeichenfolgen "hello". und „there“ und erstellt den neuen String „hellothere“.

Auf Zeichen in einem String kann mithilfe der standardmäßigen [ ]-Syntax zugegriffen werden. Wie bei Java und C++ verwendet Python eine nullbasierte Indexierung, wenn also s für "hello" steht. s[1] ist „e“. Wenn der Index außerhalb des gültigen Bereichs für den String liegt, löst Python einen Fehler aus. Der Python-Stil (im Gegensatz zu Perl) besteht darin, anzuhalten, wenn er nicht weiß, was zu tun ist, und nicht einfach nur einen Standardwert zu erstellen. Das praktische „Slice“ -Syntax (unten) funktioniert auch zum Extrahieren von Teilzeichenfolgen aus einer Zeichenfolge. Die Funktion len(string) gibt die Länge einer Zeichenfolge zurück. Die [ ]-Syntax und die Funktion len() funktionieren tatsächlich bei allen Sequenztypen – Zeichenfolgen, Listen usw. Python versucht, dafür zu sorgen, dass seine Vorgänge einheitlich über verschiedene Typen hinweg funktionieren. Python-Neuling: "len" nicht verwenden als Variablennamen verwenden, um zu vermeiden, dass die Funktion len() ausgeblendet wird. Das '+' kann zwei Zeichenfolgen verketten. Im folgenden Code sehen Sie, dass Variablen nicht vorab deklariert sind. Weisen Sie sie einfach zu und legen Sie los.

  s = 'hi'
  print(s[1])          ## i
  print(len(s))        ## 2
  print(s + ' there')  ## hi there

Im Gegensatz zu Java kann das Pluszeichen wandelt Zahlen oder andere Typen nicht automatisch in die Zeichenfolgenform um. Die Funktion str() konvertiert Werte in eine Zeichenfolgenform, damit sie mit anderen Zeichenfolgen kombiniert werden können.

  pi = 3.14
  ##text = 'The value of pi is ' + pi      ## NO, does not work
  text = 'The value of pi is '  + str(pi)  ## yes

Bei Zahlen funktionieren die Standardoperatoren +, / und * wie gewohnt. Es gibt keinen ++-Operator, aber +=, -= usw. funktionieren. Wenn Sie eine Division nach Ganzzahlen wünschen, verwenden Sie zwei Schrägstriche, z.B. 6 // 5 ist 1

Das „Print“-Element gibt normalerweise ein oder mehrere Python-Elemente aus, gefolgt von einem Zeilenumbruch. Ein „Roh“- String-Literal hat das Präfix "r" und leitet alle Zeichen ohne spezielle Behandlung von umgekehrten Schrägstrichen weiter, also r'x\nx' ergibt die Längenzeichenfolge 'x\nx'. "Drucken" kann mit mehreren Argumenten die Art und Weise der Ausgabe ändern (siehe Definition der Druckfunktion unter Python.org), z. B. Einstellung „Ende“ an "" , um nach dem Drucken aller Elemente keinen Zeilenumbruch mehr zu drucken.

  raw = r'this\t\n and that'

  # this\t\n and that
  print(raw)

  multi = """It was the best of times.
  It was the worst of times."""

  # It was the best of times.
  #   It was the worst of times.
  print(multi)

Stringmethoden

Im Folgenden sind einige der gängigsten Stringmethoden aufgeführt. Eine Methode ist wie eine Funktion, wird jedoch „auf“ ausgeführt ein -Objekt. Wenn es sich bei der Variable s um einen String handelt, führt der Code s.lower() die Methode below() für dieses Zeichenfolgenobjekt aus und gibt das Ergebnis zurück. Diese Idee einer auf ein Objekt ausgeführten Methode ist eine der grundlegenden Konzepte, aus denen die objektorientierte Programmierung (Object Oriented Programming, OOP) besteht. Hier einige der gängigsten String-Methoden:

  • s.lower(), s.upper() - gibt die Version des Strings in Klein- oder Großbuchstaben zurück.
  • s.strip() - gibt eine Zeichenfolge zurück, bei der Leerzeichen am Anfang und Ende entfernt wurden.
  • s.isalpha()/s.isdecimal()/s.isspace()... -- prüft, ob alle Zeichenfolgen in den verschiedenen Zeichenklassen vorhanden sind
  • s.startswith('other'), s.endswith('other') - prüft, ob die Zeichenfolge mit dem angegebenen anderen String beginnt oder endet.
  • s.find('other') - sucht nach der angegebenen anderen Zeichenfolge (kein regulärer Ausdruck) innerhalb von s und gibt den ersten Index zurück, an dem er beginnt, oder -1, wenn er nicht gefunden wird
  • s.replace('old', 'new'): gibt einen String zurück, bei dem alle Vorkommen von "old" enthalten sind wurden durch „neu“ ersetzt
  • s.split('delim') - gibt eine Liste von Teilzeichenfolgen zurück, die durch das angegebene Trennzeichen getrennt sind. Das Trennzeichen ist kein regulärer Ausdruck, sondern nur Text. 'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc']. Als praktischer Sonderfall s.split() (ohne Argumente) teilt alle Leerzeichen auf.
  • s.join(list) -- Gegenteil von "split()" verknüpft die Elemente in der angegebenen Liste mithilfe der Zeichenfolge als Trennzeichen. z.B. '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---ccc

Eine Google-Suche nach „Python str“ sollten Sie zu den offiziellen Python.org-Stringmethoden führen, in der alle str-Methoden aufgeführt sind.

Python hat keinen separaten Zeichentyp. Stattdessen gibt ein Ausdruck wie s[8] eine string-length-1 zurück, die das Zeichen enthält. Bei dieser Zeichenfolgenlänge-1 funktionieren die Operatoren ==, <=, ... alle erwartungsgemäß. Meist müssen Sie also nicht wissen, dass Python kein separates skalares „char“ hat. Typ.

String-Slices

Das „Slice“ -Syntax ist eine praktische Möglichkeit, um auf Unterteile von Sequenzen zu verweisen - normalerweise Zeichenfolgen und Listen. Das Segment s[start:end] besteht aus den Elementen, die am Anfang beginnen und sich bis zum Ende erstrecken. Angenommen, wir haben s = "Hallo".

die Zeichenfolge &#39;hello&#39; mit den Buchstabenindexen 0 1 2 3 4

  • s[1:4] ist „ell“ -- Zeichen, die bei Index 1 beginnen und bis Index 4 reichen, jedoch nicht eingeschlossen
  • s[1:] ist „ello“ -- Bei Auslassung eines der Indexe wird standardmäßig der Anfang oder das Ende des Strings verwendet
  • s[:] ist „Hello“ -- Wenn Sie beide auslassen, erhalten wir immer eine Kopie des Ganzen (dies ist die Python-Methode zum Kopieren einer Sequenz wie einer Zeichenfolge oder einer Liste).
  • s[1:100] ist 'ello' - Ein zu großer Index wird auf die Zeichenfolgenlänge abgeschnitten.

Die standardmäßigen nullbasierten Indexnummern ermöglichen einen einfachen Zugriff auf Zeichen am Anfang des Strings. Alternativ verwendet Python negative Zahlen, um einfachen Zugriff auf die Zeichen am Ende des Strings zu ermöglichen: s[-1] ist das letzte Zeichen „o“, s[-2] ist „l“. das vorletzte Zeichen und so weiter. Negative Indexnummern zählen rückwirkend vom Ende des Strings:

  • s[-1] ist 'o' -- letztes Zeichen (1. vom Ende)
  • s[-4] ist 'e' -- 4. von Ende
  • s[:-3] ist „Er“ - bis zu den letzten drei Zeichen.
  • s[-3:] ist "llo" beginnt mit dem dritten Zeichen vom Ende bis zum Ende der Zeichenfolge.

Es handelt sich um eine ordentliche Struktur von Slices, die für jeden Index n s[:n] + s[n:] == s sind. Dies funktioniert auch bei n negativem oder außerhalb des gültigen Bereichs. Oder anders ausgedrückt: s[:n] und s[n:] unterteilen die Zeichenfolge immer in zwei Zeichenfolgenteile, sodass alle Zeichen erhalten bleiben. Segmente können auch mit Listen verwendet werden, wie wir später im Abschnitt „Liste“ sehen werden.

Stringformatierung

Python kann beispielsweise Objekte automatisch in eine für die Ausgabe geeignete Zeichenfolge. Zwei integrierte Möglichkeiten hierfür sind formatierte Zeichenfolgen Literale, die auch als "f-strings" bezeichnet werden, und zum Aufrufen von str.format().

Formatierte Stringliterale

formatierte Stringliterale werden häufig in Situationen wie den folgenden verwendet:

  value = 2.791514
  print(f'approximate value = {value:.2f}')  # approximate value = 2.79

  car = {'tires':4, 'doors':2}
  print(f'car = {car}') # car = {'tires': 4, 'doors': 2}

Einem formatierten Literalstring hat das Präfix „f“ (wie das Präfix „r“, das für Rohstrings verwendet wird). Text außerhalb der geschweiften Klammern "{}" direkt ausgedruckt. In "{}" enthaltene Ausdrücke sind werden unter Verwendung der Formatspezifikation ausgegeben, die unter die Formatspezifikation. Es gibt viele tolle Funktionen für die Formatierung, z. B. das Abschneiden und Konvertierung in die wissenschaftliche Schreibweise und Ausrichtung links/rechts/zentrieren.

f-Zeichenfolgen sind sehr nützlich, wenn Sie eine Tabelle mit Objekten drucken Die Spalten, die verschiedene Objektattribute darstellen, werden so ausgerichtet,

  address_book = [{'name':'N.X.', 'addr':'15 Jones St', 'bonus': 70},
      {'name':'J.P.', 'addr':'1005 5th St', 'bonus': 400},
      {'name':'A.A.', 'addr':'200001 Bdwy', 'bonus': 5},]

  for person in address_book:
    print(f'{person["name"]:8} || {person["addr"]:20} || {person["bonus"]:>5}')

  # N.X.     || 15 Jones St          ||    70
  # J.P.     || 1005 5th St          ||   400
  # A.A.     || 200001 Bdwy          ||     5

String %

Python verfügt auch über eine ältere printf()-ähnliche Funktion zum Zusammenstellen eines Strings. Der %-Operator verwendet links einen printf-Formatstring (%d int, %s String, %f/%g Gleitkommazahl) und die übereinstimmenden Werte in einem Tupel auf der rechten Seite (ein Tupel besteht aus Werten, die durch Kommas getrennt und in der Regel in Klammern gruppiert sind):

  # % operator
  text = "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down." % (3, 'huff', 'puff', 'house')

Die obige Zeile ist etwas zu lang. Angenommen, Sie möchten sie in separate Zeilen aufteilen. Sie können die Linie nach dem "%" nicht einfach teilen. wie Sie es in anderen Sprachen tun, da Python standardmäßig jede Zeile als separate Anweisung behandelt (auf der Plus-Seite, deshalb müssen wir nicht in jede Zeile Semikolons eingeben). Um dies zu beheben, schließen Sie den gesamten Ausdruck in eine äußere Klammer ein. Dann darf sich der Ausdruck über mehrere Zeilen erstrecken. Dieses zeilenübergreifende Code-Verfahren funktioniert mit den verschiedenen unten beschriebenen Gruppierungskonstrukten: ( ), [ ], { }.

  # Add parentheses to make the long line work:
  text = (
    "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

Das ist schon besser, aber die Schlange ist immer noch ein wenig lang. Mit Python können Sie eine Zeile in Blöcke zerlegen, die dann automatisch verkettet werden. Um diese Zeile noch weiter zu kürzen, können wir Folgendes tun:

  # Split the line into chunks, which are concatenated automatically by Python
  text = (
    "%d little pigs come out, "
    "or I'll %s, and I'll %s, "
    "and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

Strings (Unicode vs. Byte)

Reguläre Python-Strings sind Unicode-Strings.

Python unterstützt auch Strings, die aus einfachen Byte bestehen (gekennzeichnet durch das Präfix "b" vor einem String-Literal). wie:

> byte_string = b'A byte string'
> byte_string
  b'A byte string'

Ein Unicode-String ist ein anderer Objekttyp als ein Byte-String, aber verschiedene Bibliotheken wie Reguläre Ausdrücke funktionieren ordnungsgemäß, wenn beide Zeichenfolgentypen übergeben werden.

Um einen regulären Python-String in Byte umzuwandeln, rufen Sie die Methode „encode()“ für den String auf. Umgekehrt konvertiert die Methode „byte string decode()“ codierte einfache Byte in einen Unicode-String:

> ustring = 'A unicode \u018e string \xf1'
> b = ustring.encode('utf-8')
> b
b'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding. Note the b-prefix.
> t = b.decode('utf-8')                ## Convert bytes back to a unicode string
> t == ustring                         ## It's the same as the original, yay!

True

Im Abschnitt zum Lesen von Dateien finden Sie ein Beispiel, das zeigt, wie Sie eine Textdatei mit einer bestimmten Codierung öffnen und Unicode-Strings vorlesen.

Wenn-Anweisung

Python verwendet { } nicht, um Codeblöcke für if/loops/function usw. einzuschließen. Stattdessen verwendet Python einen Doppelpunkt (:) und Einrückungen/Leerzeichen, um Anweisungen zu gruppieren. Der boolesche Test für ein if muss nicht in Klammern stehen (großer Unterschied zu C++/Java) und kann die Klauseln *elif* und *else* enthalten (mnemonisch: das Wort „elif“ hat die gleiche Länge wie das Wort „else“).

Jeder Wert kann als Wenn-Test verwendet werden. Die „Null“ Werte zählen alle als falsch: Keine, 0, leerer String, leere Liste, leeres Wörterbuch. Es gibt auch einen booleschen Typ mit zwei Werten: Wahr und Falsch (umgewandelt in eine Ganzzahl, dies sind 1 und 0). Python hat die üblichen Vergleichsvorgänge: ==, !=, <, <=, >, >=. Im Gegensatz zu Java und C ist == überlastet, um richtig mit Zeichenfolgen zu funktionieren. Die booleschen Operatoren sind die ausgeschriebenen Wörter *and*, *or*, *not* (Python verwendet nicht den C-Stil && || !). So könnte der Code für eine Gesundheits-App aussehen, die den ganzen Tag über Getränkeempfehlungen gibt. Beachten Sie, dass jeder Block von then/else-Anweisungen mit einem beginnt und die Anweisungen nach ihrer Einrückung gruppiert sind:

  if time_hour >= 0 and time_hour <= 24:
    print('Suggesting a drink option...')
    if mood == 'sleepy' and time_hour < 10:
      print('coffee')
    elif mood == 'thirsty' or time_hour < 2:
      print('lemonade')
    else:
      print('water')

Ich finde, dass das Weglassen von ":" ist mein häufigster Syntaxfehler bei der Eingabe der oben genannten Code-Art, wahrscheinlich weil das im Gegensatz zu meinen C++/Java-Gewohnheiten eine zusätzliche Sache ist, die ich eingeben muss. Setzen Sie den booleschen Test außerdem nicht in Klammern – das ist eine Gewohnheit bei C/Java. Wenn der Code kurz ist, können Sie ihn in derselben Zeile nach ":" platzieren, wie hier (dies gilt auch für Funktionen, Schleifen usw.), obwohl einige Leute der Meinung sind, dass es besser lesbar ist, Elemente in separaten Zeilen zu platzieren.

  if time_hour < 10: print('coffee')
  else: print('water')

Übung: string1.py

Um das Material in diesem Abschnitt zu üben, können Sie die Übung string1.py in den Grundlagenübungen ausprobieren.