Tôi đã chơi với Python và tôi nhận ra rằng chúng tôi không cần phải sử dụng toán tử '+' để nối các chuỗi tĩnh. Nhưng nó thất bại nếu tôi gán nó cho một biến.
Ví dụ:
string1 = 'Hello' 'World' #1 works fine
string2 = 'Hello' + 'World' #2 also works fine
string3 = 'Hello'
string4 = 'World'
string5 = string3 string4 #3 causes syntax error
string6 = string3 + string4 #4 works fine
Bây giờ tôi có hai câu hỏi:
- Tại sao câu lệnh 3 không hoạt động trong khi câu lệnh 1 có?
- Có bất kỳ sự khác biệt kỹ thuật như tốc độ tính toán, vv giữa câu lệnh 1 và 2?
Được hỏi ngày 17 tháng 9 năm 2013 lúc 6:34Sep 17, 2013 at 6:34
Ibrahimibrahimibrahim
3.1467 Huy hiệu vàng40 Huy hiệu bạc56 Huy hiệu Đồng7 gold badges40 silver badges56 bronze badges
3
Từ các tài liệu:
Nhiều trình tự chuỗi liền kề [được phân định bởi khoảng trắng], có thể sử dụng các quy ước trích dẫn khác nhau, được cho phép và ý nghĩa của chúng giống như sự kết hợp của chúng. Do đó, "Xin chào" 'Thế giới' tương đương với "Helloworld".
Tuyên bố 3 không hoạt động vì:
Toán tử ‘++phải được sử dụng để kết hợp các biểu thức chuỗi tại thời điểm chạy.
Lưu ý rằng tiêu đề của người phụ trong tài liệu cũng là "Concatenation theo nghĩa đen". Điều này chỉ hoạt động cho các chuỗi chữ, không phải các đối tượng khác.
Có lẽ không có sự khác biệt. Nếu có, có lẽ nó cực kỳ nhỏ bé và không có gì mà bất cứ ai cũng nên lo lắng.
Ngoài ra, hãy hiểu rằng có thể có những nguy hiểm cho điều này:
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
Đây là một ví dụ hoàn hảo về nơi mà lỗi không bao giờ được truyền lặng lẽ. Điều gì sẽ xảy ra nếu tôi muốn "bill"
là đối số baz
? Tôi đã quên một dấu phẩy, nhưng không có lỗi nào được nêu ra. Thay vào đó, sự kết hợp đã diễn ra.
Đã trả lời ngày 17 tháng 9 năm 2013 lúc 6:40Sep 17, 2013 at 6:40
TerryaterryaTerryA
57K11 Huy hiệu vàng117 Huy hiệu bạc138 Huy hiệu đồng11 gold badges117 silver badges138 bronze badges
10
Đây là sự kết hợp theo nghĩa đen của chuỗi. Nó chỉ xảy ra với các chữ theo chuỗi, không phải các biến hoặc các biểu thức khác đánh giá theo chuỗi. Đã từng có một sự khác biệt về hiệu suất [nhỏ], nhưng ngày nay, trình tối ưu hóa nhìn trộm sẽ khiến các hình thức về cơ bản tương đương.
Đã trả lời ngày 17 tháng 9 năm 2013 lúc 6:38Sep 17, 2013 at 6:38
user2357112user2357112user2357112
242K26 Huy hiệu vàng393 Huy hiệu bạc470 Huy hiệu Đồng26 gold badges393 silver badges470 bronze badges
Để trả lời câu hỏi thứ hai của bạn: Không có sự khác biệt nào cả [ít nhất là với việc thực hiện tôi sử dụng]. Tháo rời cả hai tuyên bố, chúng được hiển thị là
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
0. Họ tương đương.Đã trả lời ngày 17 tháng 9 năm 2013 lúc 6:39Sep 17, 2013 at 6:39
HyperboreushyperboreusHyperboreus
31.4K9 Huy hiệu vàng45 Huy hiệu bạc84 Huy hiệu đồng9 gold badges45 silver badges84 bronze badges
2
Bạn có thể sử dụng
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
1 vì điều này hiệu quả hơn so với sử dụng + dấu.>>> string2 = "%s %s" %['Hello', 'World']
>>> string2
'Hello World'
[OR]
Một phương pháp nữa là
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
2>>> string2 = "{0} {1}".format["Hello", "World"]
>>> string2
'Hello World'
>>>
Đã trả lời ngày 24 tháng 6 năm 2016 lúc 7:44Jun 24, 2016 at 7:44
SupernovasupernovaSuperNova
Phim thương hiệu vàng 23K66 gold badges87 silver badges60 bronze badges
Câu lệnh 3 không hoạt động như khi bạn kết hợp hai biểu thức chuỗi để tạo chuỗi mới, bạn cần một toán tử '+'.
Trong khi đó trong trường hợp đánh dấu 1,2 và 4, các chữ lân cận được phân tách bằng không gian trắng sử dụng các quy ước trích dẫn khác nhau. Chúng được phép làm cho chúng in giống như sự kết hợp của chúng.
Ngoài ra, sẽ không có bất kỳ chênh lệch thời gian đáng kể hoặc đáng chú ý nào trong việc chạy 2 hoạt động đó.
%%timeit -n 1
s1='ab'
s2='ba'
print[s1+s2]
O/P chạy chậm nhất mất nhiều thời gian dài hơn 17,08 lần so với nhanh nhất. Điều này có thể có nghĩa là một kết quả trung gian đang được lưu trữ. 57,8 Phass ± 92,5 Pha mỗi vòng [trung bình ± std. Dev. Của 7 lần chạy, 1 vòng mỗi]
%%timeit -n 1
s3='ab' 'ba'
print[s3]
O/P Chạy chậm nhất mất 4,86 lần so với nhanh nhất. Điều này có thể có nghĩa là một kết quả trung gian đang được lưu trữ. 25,7 TiếtS ± 21 Pha mỗi vòng [trung bình ± std. Dev. Của 7 lần chạy, 1 vòng mỗi]
Đã trả lời ngày 31 tháng 3 năm 2018 lúc 16:33Mar 31, 2018 at 16:33
Shrayshrayshray
Phù hiệu bằng đồng 1122 bronze badges
Tại sao câu lệnh 3 không hoạt động trong khi câu lệnh 1 có?
Bởi vì, trong tuyên bố đầu tiên, chúng tôi đang gán một số hằng số cho một biến. Việc gán biến là đủ đơn giản để chúng ta có thể tiếp tục đặt nhiều hằng số vào một biến duy nhất và bài tập vẫn sẽ được thực hiện. Các thuật ngữ
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
3 và >>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
4 là hai hằng số cùng loại. Vì vậy, tuyên bố đã làm việc.Nếu chúng tôi làm như sau, chúng tôi sẽ nhận được
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
5string1 = "Hello" 1
Lý do là chúng tôi đã cung cấp nhiều hằng số trong một gán biến. Python bối rối này và nó đã ném nó ra như một lỗi.
Câu lệnh 3 là tất cả về việc gán một biến dựa trên hai biến. Điều này sẽ tạo ra
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
5 vì Python không biết nó có thể làm gì với 2 biến trước khi gán nó cho biến.Có bất kỳ sự khác biệt kỹ thuật như tốc độ tính toán, vv giữa câu lệnh 1 và 2?
Đúng. Sự khác biệt kỹ thuật duy nhất là khả năng đọc hơn là bất cứ điều gì khác. Khả năng đọc quan trọng nhất trong Python. Đối với một con mắt chưa được đào tạo,
>>> def foo[bar, baz=None]:
... return bar
...
>>> foo["bob"
... "bill"]
'bobbill'
7 có thể trông giống như trình biên dịch sẽ thêm không gian vào các chuỗi. Đó không phải là trường hợp.Tuy nhiên,
"hello" + "world"
là rõ ràng và bình thường. Gần như luôn luôn, rõ ràng là tốt hơn tiềm ẩn.
Đã trả lời ngày 16 tháng 7 năm 2018 lúc 10:24Jul 16, 2018 at 10:24
Thiruvenkadamthiruvenkadamthiruvenkadam
4.0283 Huy hiệu vàng26 Huy hiệu bạc26 Huy hiệu đồng3 gold badges26 silver badges26 bronze badges