To zawsze mnie dezorientowało. Wydaje się, że tak byłoby ładniej:
my_list = ["Hello", "world"]
print(my_list.join("-"))
# Produce: "Hello-world"
niż to:
my_list = ["Hello", "world"]
print("-".join(my_list))
# Produce: "Hello-world"
Czy jest jakiś konkretny powód, dla którego tak się dzieje?
Dzieje się tak dlatego, że każda iterowalna może być połączona, nie tylko listy, ale wynik i "joiner" są zawsze łańcuchami.
Na przykład:
import urllib2
print('\n############\n'.join(
urllib2.urlopen('http://data.stackexchange.com/users/7095')))
Ponieważ metoda join()
jest w klasie string, a nie w klasie list?
Zgadzam się, że wygląda to zabawnie.
Zobacz http://www.faqs.org/docs/diveintopython/odbchelper_join.html:
Historyczna notatka. Kiedy po raz pierwszy nauczyłem się Pythona, spodziewałem się, że join będzie metodą listy, która będzie przyjmować delimiter jako argument. Mnóstwo ludzi czuje to samo, i jest historia kryjąca się za metodą join. Przed do Pythona 1.6, łańcuchy nie miały wszystkich tych użytecznych metod. Istniał oddzielny moduł string, który zawierał wszystkie funkcje łańcuchowe; każda z nich funkcja przyjmowała ciąg znaków jako swój pierwszy argument. Funkcje te zostały uznane za wystarczająco ważne, aby umieścić je na same ciągi, co miało sens dla funkcji takich jak lower, upper, i split. Ale wielu zatwardziałych programistów Pythona programistów sprzeciwiało się nowej metodzie join argumentując, że powinna to być metoda metoda listy zamiast tego, lub że nie powinna się w ogóle ruszać, ale po prostu pozostać częścią starego modułu string (który wciąż ma w sobie wiele przydatnych rzeczy). Używam wyłącznie nowej metody join, ale zobaczysz kod napisany w dowolny sposób, a jeśli naprawdę ci to przeszkadza, możesz możesz użyć starej funkcji string.join zamiast tego.
--- Mark Pilgrim, Dive into Python