Rozumiem, że powinniśmy używać %s
do konkatenacji łańcucha zamiast +
w Pythonie.
Mógłbym wykonać dowolną z następujących czynności:
hello = "hello"
world = "world"
print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])
Ale dlaczego miałbym używać czegoś innego niż +
? Szybsze jest pisanie konkatenacji za pomocą prostego +
. Następnie, jeśli spojrzeć na ciąg formatowania, można określić na przykład rodzaje %s
i %d
oraz takie. Rozumiem, że lepiej byłoby wyraźnie powiedzieć o typie.
Ale potem przeczytałem, że +
należy unikać używania do konkatenacji, chociaż łatwiej jest pisać. Czy istnieje wyraźny powód, dla którego łańcuchy powinny być łączone na jeden z tych innych sposobów?
%s
Nie jest łączenie, to opis konwersji do formatowania łańcuch pochodzący z C naprintf(3)
. Istnieją przypadki użycia tego lub operatora konkatenacji; których używasz, powinny opierać się na ocenie sytuacji, a nie dogmatach. To, jak łatwo jest napisać kod, jest całkowicie nieistotne, ponieważ zrobisz to tylko raz.print(f"{hello} {world}")
, ma czytelność konkatenacji, ponieważ zmienne są widoczne tam, gdzie występują w ciągu, i jest szybszy niżstr.format
.Odpowiedzi:
Czytelność. Składnia ciągu formatu jest bardziej czytelna, ponieważ oddziela styl od danych. Również w Pythonie,
%s
składnia automatycznie wymusić żadnych innych niżstr
typy nastr
; podczas gdy konkatenacja działa tylko zstr
, a nie możesz łączyć sięstr
zint
.Występ. W Pythonie
str
jest niezmienny, więc lewy i prawy ciąg należy skopiować do nowego ciągu dla każdej pary konkatenacji. Jeśli połączysz cztery ciągi o długości 10, będziesz kopiować (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 znaków, a nie tylko 40 postacie. A wraz ze wzrostem liczby i rozmiaru struny sytuacja staje się kwadratowo gorsza. Java czasami optymalizuje ten przypadek, przekształcając serię konkatenacji do użyciaStringBuilder
, ale CPython nie.W niektórych przypadkach biblioteka rejestrująca udostępnia interfejs API, który używa lasera formatującego do leniwego tworzenia łańcucha wpisu dziennika (
logging.info("blah: %s", 4)
). Jest to świetne dla poprawy wydajności, jeśli biblioteka rejestrująca zdecydowała, że bieżący wpis dziennika zostanie odrzucony przez filtr dziennika, więc nie trzeba formatować łańcucha.źródło
Czy jestem jedynym, który czyta od lewej do prawej?
Dla mnie używanie
%s
jest jak słuchanie niemieckiego mówcy, gdzie muszę poczekać do końca bardzo długiego zdania, aby usłyszeć, co to jest czasownik.Który z nich jest szybszy na pierwszy rzut oka?
lub
źródło
n
dziesięcioleciach mój umysł też tak działa ;-) Ale nadal trzymam się mojej odpowiedzi, druga jest jaśniejsza i łatwiejsza do odczytania, dlatego też do utrzymania. A to staje się bardziej widoczne, im więcej masz parametrów. W końcu, jeśli jest to show dla jednego człowieka, idź z tym, co znasz i czujesz się komfortowo; jeśli jest to wysiłek zespołu, wymuszaj spójność i sprawdzaj kod; ludzie mogą się przyzwyczaić.f"your {object} is in the {location}"
."your '" + object + "' is in the '" + location + "'"
... nie jestem nawet pewien, czy właśnie to teraz dostałem ...Przykład wyjaśniający argument dotyczący czytelności:
(Pamiętaj, że drugi przykład jest nie tylko bardziej czytelny, ale także łatwiejszy do edycji, możesz zmienić szablon w jednym wierszu i listę zmiennych w innym)
Osobnym problemem jest to, że kod% s również konwertuje na ciąg, w przeciwnym razie musisz użyć wywołania str (), które jest również mniej czytelne niż kod% s.
źródło
Korzystanie
+
powinien nie można uniknąć w ogóle. W wielu przypadkach jest to właściwe podejście. Używanie%s
lub.join()
jest preferowane tylko w szczególnych przypadkach i zwykle jest to całkiem oczywiste, kiedy są lepszym rozwiązaniem.W twoim przykładzie łączysz trzy ciągi razem, a użycie przykładu
+
jest wyraźnie najprostsze i najbardziej czytelne, a zatem zalecane.%s
lub.format()
są przydatne, jeśli chcesz interpolować ciągi lub wartości w środku większego ciągu. Przykład:W takim przypadku użycie
%s
go jest bardziej czytelne, ponieważ unikasz pocięcia pierwszego ciągu na wiele segmentów. Zwłaszcza jeśli interpolujesz wiele wartości..join()
jest odpowiedni, jeśli masz sekwencję łańcuchów o zmiennej wielkości i / lub chcesz połączyć wiele łańcuchów z tym samym separatorem.źródło
Ponieważ kolejność słów może się zmieniać w różnych językach, forma z
%s
jest niezbędna, jeśli chcesz poprawnie obsługiwać tłumaczenie ciągów w swoim oprogramowaniu.źródło