2017-05-18 13 views
5

Tôi chạy qua một số cú pháp mã python mà tôi chưa từng thấy trước đây. Dưới đây là ví dụ:Biến thể trên trăn nếu cú ​​pháp câu lệnh

i = 0 
for spam in range(10): 
    i += [1, 3][i > 5] 
    print(i) 

Kết quả là chuỗi 1,2,3,4,5,6,9,12,15,18. Vì vậy, nó tăng thêm 1 cho đến i > 5, sau đó tăng thêm 3 sau đó.

Trước đây, tôi sẽ có văn bản dòng như:

if i > 5: 
    i += 3 
else: 
    i += 1 

Vì vậy, các dòng là gì: i += [1, 3][i > 5]?

  • Bạn gọi cấu trúc cú pháp đó là gì?
  • Đây có phải là một số dạng hiểu danh sách hoặc một cái gì đó khác hoàn toàn không?

Cú pháp thú vị và tôi muốn đọc thêm về nó, nhưng không biết phải tìm đâu.

Chỉnh sửa: Cảm ơn Darkstarone. Tôi chưa bao giờ nghĩ đến việc sử dụng một biểu thức để trả về một chỉ mục danh sách. Cái đó rất tuyệt. Điều này có nghĩa là bạn cũng có thể làm những việc như: spam = ["Even", "Odd"][eggs % 2] để trả lại một chuỗi chẵn hoặc lẻ hoặc foo = ["A", "B", "C"][zot % 3] để chuyển qua ba lựa chọn khi lặp qua các giá trị của zot.

Có thể sẽ không tạo thói quen sử dụng cấu trúc này vì các biểu thức khác dễ hiểu hơn. Nhưng, tôi sẽ đưa cái này vào túi 'thủ thuật cho tình huống hoàn hảo đó.

+2

Nó không có tên đặc biệt, chúng chỉ lập chỉ mục vào danh sách: 'True == 1' và' False == 0'. Nó không phải là một danh sách hiểu, mà sẽ có 'for' và' in'. Nó cũng không phải là một cách tuyệt vời để viết nó do chính xác sự nhầm lẫn hiện tại của bạn, so với một biểu thức ternary đơn giản hơn. – jonrsharpe

+0

Đó là "ternary kludge với danh sách chỉ mục", khác biệt với "ternary kludge với và/hoặc" ('i> 5 và 3 hoặc 1') và" cú pháp biểu thức điều kiện thực tế "(' 3 nếu i> 5 khác 1'). – user2357112

+0

Đây là đường cú pháp khá thú vị. Nó khá mơ hồ trong lần xem đầu tiên nhưng sau khi nhận ra nó là ternary trong tự nhiên nó thực sự trở nên rất rõ ràng, mở rộng nó có thể làm xáo trộn nó vì nó là danh sách chỉ mục, về cơ bản ... Tôi đoán bạn chỉ có thể làm tổ. Có thể có một chút lông ... '' '[[1,3] [k> 4], [4,5] [k> 6]] [k> 6]' '' –

Trả lời

3

Vì vậy, những gì tôi tin rằng đang xảy ra ở đây là danh sách ([1,3]) có thể là:

[1,3][0] # 1 

Hoặc

[1,3][1] # 3 

Lợi dụng thực tế là 0 == False1 == True. Nó khá gọn gàng, mặc dù hơi mờ đục. Tôi có thể đã viết nó như vậy:

i = 0 
for _ in range(10): 
    i += 3 if i > 5 else 1 
    print(i) 
0

hành ternary, được viết như thế này:

i += 3 if i > 5 else 1 
+0

Tuy nhiên, điều này không trả lời câu hỏi của OP. Những gì họ đang xem * không * là một biểu thức bậc ba (không phải là toán tử). – jonrsharpe

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