Τι ακριβώς κάνει η μέθοδος .join();

Είμαι αρκετά νέος στην Python και είμαι εντελώς μπερδεμένος με την .join() που έχω διαβάσει ότι είναι η προτιμώμενη μέθοδος για τη συνένωση συμβολοσειρών.

Δοκίμασα:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring().join(strid)

και πήρα κάτι σαν:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Γιατί λειτουργεί έτσι; Δεν θα έπρεπε το "595" να προστεθεί αυτόματα;

Λύση

Κοιτάξτε προσεκτικά την έξοδό σας:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Έχω επισημάνει τα "5", "9", "5" της αρχικής συμβολοσειράς σας. Η μέθοδος της Python join() είναι μια μέθοδος συμβολοσειράς, και παίρνει μια λίστα πραγμάτων για να συνδεθεί με τη συμβολοσειρά. Ένα απλούστερο παράδειγμα μπορεί να βοηθήσει στην εξήγηση:

>>> ",".join(["a", "b", "c"])
'a,b,c'

Το "," παρεμβάλλεται μεταξύ κάθε στοιχείου της δοσμένης λίστας. Στην περίπτωσή σας, η "λίστα" είναι η αναπαράσταση της συμβολοσειράς "595", η οποία αντιμετωπίζεται ως η λίστα ["5", "9", "5"].

Φαίνεται ότι αναζητάτε το +:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Σχόλια (4)

Η join παίρνει ένα επαναλήψιμο πράγμα ως όρισμα. Συνήθως είναι μια λίστα. Το πρόβλημα στην περίπτωσή σας είναι ότι μια συμβολοσειρά είναι η ίδια επαναλήψιμη, δίνοντας κάθε χαρακτήρα με τη σειρά. Ο κώδικάς σας αναλύεται ως εξής:

"wlfgALGbXOahekxSs".join("595")

το οποίο ενεργεί το ίδιο με αυτό:

"wlfgALGbXOahekxSs".join(["5", "9", "5"])

και έτσι παράγει τη συμβολοσειρά σας:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Οι συμβολοσειρές ως iterables είναι ένα από τα πιο μπερδεμένα θέματα έναρξης με την Python.

Σχόλια (1)

Η join() είναι για τη συνένωση όλων των στοιχείων της λίστας. Για τη συνένωση μόνο δύο συμβολοσειρών το "+" θα είχε περισσότερο νόημα:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid
Σχόλια (0)