2016-12-07 12 views
12

Dlaczego poniższy kod nazywany "odwieczną metodą odrzucenia" drukowania w komentarzu przez "Snakes and Coffee" do postu Blendera z Print multiple arguments in python? Czy ma to związek z kodem zaplecza/implementacją Pythona 2 lub Pythona 3?Dlaczego print ("text" + str (var1) + "more text" + str (var2)) jest opisany jako "odrzucony"?

print("Total score for " + str(name) + " is " + str(score)) 
+0

Zanim wprowadzono nowe hasła, takie jak https://www.python.org/dev/peps/pep-3101/, wprowadzono nowe (lepsze, prawdopodobnie) sposoby formatowania ciągów znaków – Pythonista

+0

Odrzucono? Masz na myśli przestarzałe lub stare? –

+2

Oto trochę dokumentacji zewnętrznej. https://pyformat.info –

Odpowiedz

14

Dodawanie wielu ciągów została odrzucona, ponieważ:

  • to naprawdę nie jest czytelny, w porównaniu do alternatyw.
  • nie jest tak skuteczna jak alternatywy.
  • Jeśli masz inne typy, musisz ręcznie zadzwonić pod numer str.

I, tak, jest naprawdę stary. :-)

Teoretycznie dodawanie ciągów tworzy nowy ciąg. Załóżmy, że dodajesz ciągi znaków n, a następnie musisz utworzyć ciągi znaków n-1, ale wszystkie z nich, z wyjątkiem jednego, są odrzucane, ponieważ interesuje Cię tylko wynik końcowy. Struny są zaimplementowane jako tablice, więc istnieje wiele potencjalnie drogich (re-) alokacji bez żadnych korzyści.

Jeśli masz ciąg znaków z symbolami zastępczymi, jest on nie tylko bardziej czytelny (nie ma między nimi żadnych + i str), ale python może także obliczyć długość ciągu końcowego i przydzielić tylko jedną tablicę dla ciągu końcowego. i wstaw wszystko.

W praktyce tak naprawdę nie jest to, co się dzieje, ponieważ Python sprawdza, czy łańcuch jest pośrednikiem i dokonuje jakiejś optymalizacji. Więc nie jest tak źle, jak tworzenie niepotrzebnych tablic.

W przypadku małych napisów i/lub interakcyjnego użycia nie zauważy się różnicy. Ale inne sposoby mają tę zaletę, że są bardziej czytelne.

Alternatywy mogłoby być (dwa pierwsze są kopiowane z @MKemps odpowiedzieć):

  • "Total score for {} is {}".format(name, score)
  • "Total score for %s is %s" % (name, score) (również stary!)
  • "Total score for {name} is {score}".format(name=name, score=score)
  • f"Total score for {name} is {score}" (bardzo nowy - wprowadzony w Pythonie 3.6)

Szczególnie te dwa ostatnie przykłady pokazują, że można nawet odczytać ciąg szablonów bez konieczności wstawiania czegokolwiek.

+0

Dlaczego używałbyś trzeciej alternatywy, jeśli będziesz wpisywać nazwę i wynik (np. Nazwy zmiennych) więcej niż raz? Dla jasności wkleiłem alternatywę poniżej. print ("Ogólna liczba punktów za {name} to {score}" .format (name = nazwa, score = score)) – heretoinfinity

+2

@funkcja intonowania Ponieważ dodaje nazwę i dlatego kontekst do symboli zastępczych. Jeśli masz długi ciąg znaków i wiele danych wejściowych, nie chcesz "liczyć", która zmienna reprezentuje ten symbol zastępczy. Nawet bez wstawiania czegokolwiek możesz "odczytać" i "zrozumieć" ciąg znaków. – MSeifert

+4

@heretoinfinity: Moc to możliwość korzystania ze słowników. Przykład: 'dane = {'a': 11," b ": 12," c ": 13}; print ('{b} jest większy niż {a}'. format (** dane)) '. – Matthias

3

Uważa się, że jest stary, ponieważ można użyć "lepszych" sposobów na sformatowanie go przy użyciu Pythona 3 (i późniejszych wersji Pythona 2).

print("Total score for "+str(name)"+ is "+str(score))

można zapisać jako: print("Total score for %s is %s" % (name, score))

Chociaż istnieje wiele różnych sposobów można format wydruku w nowszych wersjach Pythona 2 i powyżej.

Co jest wyżej jest technicznie stary, to jest inny sposób, aby to zrobić w nowszych wersjach Pythona 2 i wyżej.

print('Total score for {} is {}'.format(name, score)

Powiązane problemy