Είμαι αρκετά νέος στην 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
Η join
παίρνει ένα επαναλήψιμο πράγμα ως όρισμα. Συνήθως είναι μια λίστα. Το πρόβλημα στην περίπτωσή σας είναι ότι μια συμβολοσειρά είναι η ίδια επαναλήψιμη, δίνοντας κάθε χαρακτήρα με τη σειρά. Ο κώδικάς σας αναλύεται ως εξής:
"wlfgALGbXOahekxSs".join("595")
το οποίο ενεργεί το ίδιο με αυτό:
"wlfgALGbXOahekxSs".join(["5", "9", "5"])
και έτσι παράγει τη συμβολοσειρά σας:
"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"
Οι συμβολοσειρές ως iterables είναι ένα από τα πιο μπερδεμένα θέματα έναρξης με την Python.
Η join() είναι για τη συνένωση όλων των στοιχείων της λίστας. Για τη συνένωση μόνο δύο συμβολοσειρών το "+" θα είχε περισσότερο νόημα:
strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid