2013-04-30 39 views
5

Nhiều ngôn ngữ lập trình, trong đó có Python, hỗ trợ phẫu thuật như thế này:Semantics biến danh sách thành chuỗi

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

mà trả về chuỗi

"1, 2, 3" 

Tôi hiểu rằng đây là trường hợp, nhưng tôi không hiểu quyết định thiết kế đằng sau nó - chắc chắn nó sẽ hợp lý hơn về mặt ngữ nghĩa để thực hiện thao tác join trong danh sách, như vậy:

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

Nếu có ai đó có thể giải thích về quyết định thiết kế và làm sáng tỏ nó, tôi sẽ đánh giá cao nó.

Chỉnh sửa: Có vẻ như Javascript có phương thức join trong danh sách; nếu có ai có các ví dụ về các ngôn ngữ cụ thể theo quy ước, vui lòng bình luận/trả lời về lựa chọn trong ngôn ngữ cụ thể đó.

+0

Lưu ý rằng ví dụ của bạn * không hoạt động * trong python. Danh sách chỉ được chứa các chuỗi. – mgilson

+0

Các danh sách, theo một nghĩa nào đó, một mức độ thấp hơn (phần cơ bản hơn) của ngôn ngữ. để các chuỗi biết về các danh sách, nhưng các danh sách không biết về các chuỗi. –

+0

Tôi đã chỉnh sửa cú pháp để phản ánh điều đó - câu hỏi đã được thêm về ngữ nghĩa tổng thể hơn so với hoạt động cụ thể đó mặc dù :) – jackweirdy

Trả lời

3

Đối với trăn, có một số đối số chống lại nó. Đầu tiên, nếu nó là một phương thức chuỗi chấp nhận một biến lặp tùy ý, thì bạn chỉ cần hỗ trợ phương thức join trên các đối tượng chuỗi và nó tự động làm việc với bất kỳ thứ gì có thể lặp lại được. Nếu không, tùy chỉnh đối tượng iterable cũng sẽ cần phải hỗ trợ một phương pháp join, vv vv

xem xét:

", ".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 loại khác nhau tất cả các hỗ trợ rất đơn giản bằng một phương pháp duy nhất (và tôi đã chỉ chạm BUILTIN loại).

Thứ hai, bạn chỉ có thể join một danh sách nếu mọi thứ trong đó là loại basestring. Dường như ngớ ngẩn để cung cấp một phương thức trên một danh sách mà sẽ tăng một ngoại lệ nếu bạn sử dụng nó trên một danh sách có nội dung sai - Ít nhất, API ở đây có vẻ hơi phức tạp (đối với tôi). Tất nhiên, bạn có thể tranh luận rằng list.remove có thể tăng ngoại lệ nếu được gọi với các đối số sai. Và đó là sự thật - Nhưng nói chung, bạn chỉ xóa một mục duy nhất. Nó hoạt động ở mức thấp hơn join. Tất nhiên, đối số này yếu hơn đối số đầu tiên tôi đề xuất, vì vậy nếu bạn không thích, chỉ cần quay trở lại đối số 1.

Các vấn đề liên quan