2012-02-15 36 views
9

Tôi muốn để xác định xem một danh sách chứa một chuỗi nào đó, vì vậy tôi sử dụng một biểu thức máy phát điện, như vậy:Python biểu hiện phát ngoặc kỳ quặc

g = (s for s in myList if s == myString) 
any(g) 

Tất nhiên tôi muốn nội tuyến này, vì vậy tôi làm:

any((s for s in myList if s == myString)) 

Sau đó, tôi nghĩ rằng nó sẽ trông đẹp hơn với dấu ngoặc đơn, vì vậy tôi cố gắng:

any(s for s in myList if s == myString) 

không thực sự expe cting nó hoạt động. Sự ngạc nhiên! nó!

Vậy đây là Python hợp pháp hay chỉ là một cái gì đó mà triển khai của tôi cho phép? Nếu nó hợp pháp, quy tắc chung ở đây là gì?

Trả lời

11

Điều này là hợp pháp và quy tắc chung là bạn cần dấu ngoặc đơn xung quanh biểu thức trình tạo. Là một ngoại lệ đặc biệt, các dấu ngoặc đơn từ một hàm gọi cũng được tính (đối với các hàm chỉ có một tham số). (Documentation)

Lưu ý rằng thử nghiệm nếu my_string xuất hiện trong my_list là dễ dàng như

my_string in my_list 

Không biểu hiện máy phát điện hoặc gọi đến any() cần thiết!

+0

Cảm ơn câu trả lời. 'my_string in my_list' là điều đầu tiên tôi đã thử, nhưng nó không tìm thấy một chuỗi đã có. Tôi kết luận rằng nó đã làm so sánh đối tượng hơn là so sánh giá trị, đó là những gì tôi cần. Tôi sẽ kiểm tra lại. – Ari

+0

@Ari: Không, nó so sánh giá trị. Tôi không biết những gì đã xảy ra trong trường hợp của bạn. –

+0

Yup, nó hoạt động. Tôi đoán tôi đã có một số lỗi khác ở đó. – Ari

3

Đó là "hợp pháp" và được hỗ trợ rõ ràng. Quy tắc chung là "((x)) luôn giống như (x)" (mặc dù (x) không phải lúc nào cũng giống như x tất nhiên) và được áp dụng cho biểu thức trình tạo đơn giản để thuận tiện.

+2

Chỉ cần làm rõ, 'x' không phải là nơi lưu giữ bất cứ thứ gì ở đây. 'f ((a, b))' tất nhiên khác với 'f (a, b)'. –

+1

Vâng, thực sự, đó là trình giữ chỗ cho một biểu thức duy nhất. –

+0

Bạn có thể cung cấp một tham chiếu cho quy tắc này (rằng ((x)) luôn giống như (x)) không? – Ari

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