2013-04-30 8 views
5

wielu języków programowania, w tym Python, wspierają operację tak:Semantyka obracając listy do łańcucha

", ".join(["1","2","3"]) 

która zwraca ciąg

"1, 2, 3" 

Rozumiem, że jest to przypadek, ale nie rozumiem decyzji projektowej stojącej za tym - z pewnością byłoby bardziej semantycznie ważne, aby wykonać operację join na liście, na przykład:

["1","2","3"].join(", ") 

Jeśli ktoś mógłby wyjaśnić decyzję dotyczącą projektu i rzucić trochę światła na to, byłbym wdzięczny.

Edycja: Wygląda na to, że Javascript ma na liście metodę join; jeśli ktoś ma przykłady, dla których konwencja występuje w określonych językach, nie krępuj się komentować/odpowiadać na temat wyboru również w tym języku.

+0

Zauważ, że twój przykład * nie działa * w pythonie. Lista musi zawierać tylko ciągi. – mgilson

+0

Listy są w pewnym sensie niższym poziomem (podstawową częścią) języka. więc łańcuchy znają listy, ale listy nie znają łańcuchów. –

+0

Edytowałem składnię, aby to odzwierciedlić - pytanie dotyczyło raczej ogólnej semantyki niż ta konkretna operacja :) – jackweirdy

Odpowiedz

3

Dla Pythona jest kilka argumentów przeciwko niemu. Po pierwsze, jeśli jest to metoda typu string, która akceptuje dowolną iterowalną, to wystarczy tylko obsłużyć metodę join w obiektach typu string i automagicznie działa z każdą iteracją. W przeciwnym razie, niestandardowe iterowalny obiekty musiałaby także wspierać metodę join itp itd

rozważenia:

", ".join(["1","2","3"]) 
", ".join(("1","2","3")) 
", ".join(str(x) for x in xrange(1,4)) 
", ".join({'1':None,'2':None,'3':None}) 
", ".join({'1','2','3'}) #set literal syntax -- python2.7+ 
", ".join("123") 

6 różnych typów wszystko obsługiwane w bardzo prosty sposób za pomocą jednej metody (i mam tylko dotknął wbudowane typy).

Po drugie, można tylko join listę, jeśli wszystko w nim jest typu basestring. Wydaje się głupie, aby dostarczyć metodę na liście, która podniosłaby wyjątek, jeśli używałbyś go na liście z niewłaściwą zawartością - Przynajmniej interfejs API wydaje się nieco trudny (dla mnie). Oczywiście można argumentować, że list.remove może wywołać wyjątek, jeśli zostanie wywołany z niepoprawnymi argumentami. I to prawda - ale ogólnie rzecz biorąc usuwasz tylko jeden przedmiot. Działa na niższym poziomie niż join powinien. Oczywiście ten argument jest słabszy od pierwszego, który zaproponowałem, więc jeśli ci się nie podoba, po prostu powróć do argumentu 1.