2012-05-24 34 views
5

Tôi bị kẹt ở ví dụ cụ thể này khi nhảy vào pythonNhảy vào trăn và hoặc thất bại

Ví dụ 4.18. Khi and-hoặc Lừa Thất bại

>>>>a = "" 
>>>>b = "second" 
>>>1 and a or b 
>>>>'second' 

Kể từ khi a là một chuỗi rỗng, mà Python xem xét sai trong một bối cảnh boolean, 1 và '' evalutes để '', và rồi '' hoặc 'thứ hai' đánh giá thành 'giây'. Rất tiếc! Đó không phải là những gì bạn muốn. Và − hoặc lừa, bool và a hoặc b, sẽ không hoạt động giống như biểu thức C bool? a: b khi a là sai trong một ngữ cảnh boolean .

Tại sao nó không phải là điều người dùng muốn, ý tôi là 1 và "" sẽ đánh giá Sai, trong khi "" hoặc b sẽ đánh giá "thứ hai", đó là điều hoàn hảo, tôi không t hiểu tại sao nó sai? Tôi thiếu một cái gì đó?

Trả lời

4

Không, bạn không bỏ lỡ điều gì đó.

Điều kiện nội tuyến expr if cond else expr được giới thiệu với Python 2.5 trong PEP 308; trước đó, điều kiện phải có dạng đầy đủ

if cond: 
    expr 
else: 
    expr 

Tuy nhiên, người ta nhận thấy rằng expr and cond or expr sắp xếp của làm việc như một inline có điều kiện, miễn là những biểu hiện đầu tiên đã xảy ra để đánh giá để boolean true. Như hầu hết mọi thứ trong Python là đúng, cú pháp này thường có xu hướng làm việc - và sau đó, tất nhiên, đôi khi thất bại. Đây thực tế là động cơ để thêm vào "đúng" nội tuyến có điều kiện.

2

Dấu "và-hoặc" được sử dụng để mô phỏng toán tử điều kiện bậc ba, condition ? if-true : if-false hoặc tương tự. Vì 1 tương đương với True trong ngữ cảnh boolean, biểu thức dự kiến ​​sẽ mang lại a, không phải b. Vì vậy, bài học là, không sử dụng và-hoặc lừa. Python có điều kiện ternary từ 2.5:

true if condition else false 
+0

Cảm ơn bạn. Tôi nghĩ có điều gì khác mà tôi không hiểu. –

2

Dive vào trăn không phải là một hướng dẫn tốt và should not be followed


Khái niệm x and y or z đã được sử dụng trước khi python có một biểu ternary thích hợp (y if x else z). Phần này là lý do tại sao nó có thể làm bạn ngạc nhiên nếu bạn mong đợi nó hoạt động như C's x ? y : z.


Có danh sách các hướng dẫn trên python wiki. có thể cung cấp cho bạn tài nguyên cập nhật hơn.

+0

Đẹp zed shaw rant. – gary

+0

Tôi nên làm gì sau đó ?, Tôi nghĩ rằng nhảy vào python là đủ như example.I nhận thức được cú pháp, tôi đã tìm kiếm ví dụ để xem làm thế nào những điều có thể được thực hiện tốt hơn với python –

+0

@KartikAnand: Liên kết trong câu trả lời của tôi đã nhiều tùy chọn trong phần "Học Python" (nơi bạn có thể nhận thấy rằng DIP không có mặt dưới bất kỳ hình thức nào.) – Daenyth

0

Tại sao nó nói nó không phải là những gì người dùng muốn, ý tôi là 1 và "" sẽ đánh giá False, trong khi "" hoặc b sẽ đánh giá để "thứ hai", đó là một cách hoàn hảo những gì nên xảy ra, Tôi không hiểu tại sao nó sai? Tôi có bị thiếu một số thứ không?

Tôi cảm thấy phần này của câu hỏi đang bị bỏ qua. condition and if-true or if-false là một mẹo được sử dụng trong các phiên bản> 2.5, như được giải thích trong các câu trả lời khác, để bắt chước các ngôn ngữ khác 'condition ? if-true : if-false hoặc phiên bản mới hơn' if-true if condition else if-false.

Vấn đề với nó là nếu if-true là một đối tượng mà là false ("", [], (), False hoặc 0), sau đó điều này sẽ thất bại, như mong đợi khi bạn nhìn vào việc đánh giá, nhưng mà có thể leo vào dưới dạng lỗi nếu if-true được đặt động và có thể đánh giá là sai.

Kết quả ngây thơ mong đợi của condition and a or b sẽ là nội dung của a ("", chuỗi rỗng), như điều kiện (1) để đánh giá true, nhưng như 1 and a đánh giá để false để bạn có được nội dung của b.

Giải pháp cho vấn đề này là sử dụng cú pháp Python 2.5+ (if-true if condition else if-false) hoặc đảm bảo rằng if-true không bao giờ là sai. Một cách để thực hiện điều thứ hai là để đóng gói if-trueif-false trong một tuple hoặc danh sách, như một iterable rỗng luôn luôn là đúng:

>>> a = "" 
>>> b = "second" 
>>> condition = 1 
>>> condition and a or b 
'second' 

>>> condition and [a] or [b] 
[''] 

>>> (condition and [a] or [b])[0] 
'' 

Đó là một loại giải pháp xấu xí, nhưng nó ở đó nếu bạn cần phải nhắm mục tiêu các phiên bản cũ của Python.

+0

thực sự những gì bạn nói đã được đưa ra trong cuốn sách, và câu hỏi của tôi không phải là cách khắc phục lỗi, câu hỏi là tại sao tác giả nói "nó không phải là những gì người dùng mong đợi" .Khi bạn trả lời câu hỏi của tôi trong phần đầu của câu trả lời của bạn, không cần mã và cảm ơn :) –

+0

@KartikAnand: chắc chắn, tôi chỉ muốn để đảm bảo rằng nếu ai đó tìm thấy câu hỏi này trong tương lai, họ sẽ có ngữ cảnh đầy đủ :) – voyager