Tại sao nó string.join(list)
thay vì list.join(string)
?
Điều này là do join
một phương pháp "chuỗi"! Nó tạo ra một chuỗi từ bất kỳ lặp đi lặp lại. Nếu chúng ta mắc kẹt phương thức trong danh sách, vậy còn khi chúng ta có các lần lặp không có danh sách thì sao?
Điều gì nếu bạn có một chuỗi các chuỗi? Nếu đây là một list
phương thức, bạn sẽ phải truyền mọi chuỗi lặp như vậy list
trước khi bạn có thể nối các phần tử thành một chuỗi! Ví dụ:
some_strings = ('foo', 'bar', 'baz')
Hãy cuộn phương pháp tham gia danh sách của riêng chúng tôi:
class OurList(list):
def join(self, s):
return s.join(self)
Và để sử dụng nó, lưu ý rằng trước tiên chúng ta phải tạo một danh sách từ mỗi lần lặp để nối các chuỗi trong lần lặp đó, gây lãng phí cả bộ nhớ và khả năng xử lý:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Vì vậy, chúng tôi thấy chúng tôi phải thêm một bước nữa để sử dụng phương thức danh sách của mình, thay vì chỉ sử dụng phương thức chuỗi dựng sẵn:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Hiệu suất Caveat cho máy phát điện
Thuật toán Python sử dụng để tạo chuỗi cuối cùng str.join
thực sự phải vượt qua lần lặp hai lần, vì vậy nếu bạn cung cấp cho nó một biểu thức trình tạo, nó phải cụ thể hóa nó thành một danh sách trước khi có thể tạo chuỗi cuối cùng.
Vì vậy, trong khi truyền xung quanh máy phát điện thường tốt hơn so với hiểu danh sách, str.join
là một ngoại lệ:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
Tuy nhiên, str.join
hoạt động vẫn là một hoạt động "chuỗi" về mặt ngữ nghĩa, do đó, nó vẫn có ý nghĩa để có nó trên str
đối tượng hơn trên các công cụ lặp lại linh tinh.
-
tuyên bố rằng bạn đang tham gia một danh sách và chuyển đổi thành một chuỗi. Đó là định hướng kết quả.