Verwandte: % und str.format () in Python. Welches benutzt du?
F-Strings wurden oben erwähnt, aber ich bin der Meinung, dass dies nicht die einzige Möglichkeit ist, sie in Strings umzuwandeln. Hier sind einige Dinge, die als Memos in den Sinn kommen.
>>> import datetime
>>> d = datetime.datetime(2017, 9, 1, 12, 12, 0, 0)
>>> str(d)
'2017-09-01 12:12:00'
>>> repr(d)
'datetime.datetime(2017, 9, 1, 12, 12)'
>>> eval(repr(d))
datetime.datetime(2017, 9, 1, 12, 12)
"Repr (obj)" ruft intern "obj .__ repr__ ()" auf, und "str (obj)" implementiert intern "obj .__ str__ ()", wenn dies nicht der Fall ist, andernfalls "obj. repr () `wird aufgerufen und stattdessen verwendet.
Es wird erwartet, dass das Ergebnis von "repr (obj)" nach Möglichkeit ein Python-Ausdruck ist, dies ist jedoch nicht immer der Fall. Im obigen Datum / Uhrzeit-Beispiel wird eine Zeichenfolge zurückgegeben, die mit "eval ()" ausgewertet werden kann.
Es ist nicht erforderlich, dass das Ergebnis von "str (obj)" ein Python-Ausdruck ist, und es ist üblich, ein für Menschen lesbares Format zu priorisieren.
Wenn Sie "ein Objekt in eine einfach zu lesende Zeichenfolge konvertieren" sagen, können Sie beispielsweise an das Modul "pprint" denken. Es scheint, dass es "obj .__ repr__ ()" verwendet. Nun, es ist unmöglich, die Struktur aus dem Ergebnis von __str __ ()
zu erfassen.
str.format ()
Es war das Thema des obigen Artikels. Ich denke, es ist das Wichtigste in der täglichen Entwicklung, aber es wird weggelassen.
f-strings
Eine in Python 3.6 eingeführte Notation, mit der Sie Python-Ausdrücke direkt in eine Zeichenfolge schreiben können.
PEP 498 -- Literal String Interpolation
Ein Beispiel für FizzBuzz.
>>> print(*[f"{'Fizz'*(not i%3)}{'Buzz'*(not i%5)}" or i for i in range(1,31)], sep='\n')
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
Ich beziehe mich auf Reddits "ein Py3.6-fizzBuzz-Oneliner mit F-Strings", aber auf "map ()" Ich habe es in die Listeneinschlussnotation geändert, weil es in letzter Zeit komfortabler zu sein scheint (redu ()
hat möglicherweise die Bibliothek gelöscht).
Um auf der sicheren Seite zu sein, gibt das "*" am Anfang des "print ()" - Arguments an, dass die Liste entpackt wird.
In Bezug auf die Typprüfung schaut mindestens mypy 0.521 in f-Strings.
$ mypy --version
mypy 0.521
$ cat /tmp/test.py
def func(a: int) -> int:
return a ** 2
print(f'{func(10.0)}')
$ python /tmp/test.py
100.0
$ mypy /tmp/test.py
/tmp/test.py:4: error: Argument 1 to "func" has incompatible type "float"; expected "int"
Leider verwende ich oft 3.5 oder früher, daher habe ich nicht die Initiative ergriffen, um es zu vereinheitlichen.
Ich denke jedoch, dass in Zukunft die Möglichkeit besteht, dass F-Strings zum Zentrum werden und str.format ()
überwinden.
https://docs.python.jp/3/library/string.html#template-strings
Python verfügt über eine integrierte Funktionalität für Vorlagenzeichenfolgen, die die Variable "$" als alte Funktion ersetzt. Ich werde das obige Beispiel kurz vorstellen.
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
Leider werden HTML-Escape usw. nicht unterstützt. Ich sehe es selten persönlich, aber ich habe darüber nachgedacht, es zu benutzen.
Der Titel sagt sechs, aber es gibt noch einige Standard-Python-Funktionen.
pprint
Modulformat ()
(Kommentiert. Ich wusste es nicht. Referenz)Es sollte andere Möglichkeiten geben, es mithilfe einer externen Bibliothek wie jinja2 in einen String zu konvertieren. Wenn Sie es selbst machen, haben Sie natürlich mehr Auswahlmöglichkeiten.