2013-03-22 34 views
6

Tôi đã viết một đoạn mã phức tạp không cần thiết này trên con đường của mình để tìm hiểu cách sử dụng câu lệnh in để làm cho các câu lệnh if hoạt động tốt hơn. Tôi có hai câu hỏi sau đoạn mã.Lệnh python "in" tự động trả lại là đúng

answer = ['Yes', 'yes', 'YES'] 
answer2 = ['No', 'no', 'NO'] 
ans = raw_input() 
for i in range(0, 3): 
    if ans in answer[i]: 
     print "Yes!" 
    elif ans in answer2[i]: 
     print "No!" 
    else: 
     print "Don't know what that means" 

Câu hỏi đầu tiên: Tôi nghĩ if n in listname: trả về là True hoặc False tự động. Có ai biết nếu đó là trường hợp?

Câu hỏi thứ hai: mã ở trên trả về 3 dòng khác nhau tùy thuộc vào nếu ans thực sự là trong answer hoặc answer2. Tôi cố gắng để loại bỏ điều đó bằng cách thay thế các phần có liên quan như sau:

if ans in answer[i] == True:

này có tác dụng kỳ lạ của tạo đầu ra mã chỉ lệnh else:. Vì vậy, bất cứ ai có thể giải thích cho tôi sự khác biệt giữa cách python diễn giải if ans in answer[i]:if ans in answer[i] == True:, xin vui lòng?

Trả lời

5

Theo như sự khác biệt giữa ans in answer[i]ans in answer[i] == True, đơn giản: Python mở rộng biểu mẫu thứ hai thành ans in answer[i] and answer[i] == True, dĩ nhiên là False vì chuỗi không bằng True.

Một ví dụ đơn giản có thể giúp minh họa điều này:

>>> a = [1, 2, 3] 
>>> 2 in a 
True 
>>> 2 in a == True 
False 
>>> 2 in a and a == True 
False 
>>> (2 in a) == True 
True 
>>> 2 in a == [1, 2, 3] 
True 
>>> 2 in a and a == [1, 2, 3] 
True 

Chú ý cách thêm dấu ngoặc đơn thay đổi hành vi - điều này cũng giống như việc mở rộng như 1 < x < 5, như trái ngược với (1 < x) < 5.

Là một lưu ý phụ, thường được coi là kiểu kém để kiểm tra rõ ràng True hoặc False - tốt hơn là chỉ viết if x in y.

15

Để trả lời các câu hỏi của bạn theo thứ tự ngược lại, lý do tại sao so sánh rõ ràng với True không phù hợp với bạn là Python đã không diễn giải biểu thức theo cách bạn mong đợi. Các phân tích cú pháp Python có xử lý đặc biệt của so sánh biểu thức để bạn có thể chuỗi chúng lại với nhau và có được một kết quả hợp lý, như thế này:

>>> "a" == "a" == "a" 
True 

ý rằng Python có để điều trị toàn bộ điều này là một hoạt động, bởi vì nếu bạn chia nó vào hai hoạt động một trong hai cách bạn không nhận được kết quả tương tự:

>>> ("a" == "a") == "a" 
False 
>>> "a" == ("a" == "a") 
False 

những hành xử khác nhau bởi vì một phần trong ngoặc đơn được đánh giá đầu tiên và trả True, nhưng True != "a" nên toàn bộ biểu thức trả về false.

Bởi các quyền trên không thực sự có tác động đến chương trình của bạn cả. Thật không may, Python xử lý in qua cơ chế tương tự như == vì thế khi bạn chuỗi này lại với nhau chúng được diễn giải như là một chuỗi như trên, vì vậy Python thực sự đánh giá nó như sau:

>> "a" in ["a"] == True 
False 
>>> ("a" in ["a"]) and ("a" == True) 
False 

Đó là lập dị và cho là phản trực giác, nhưng đó không may là cách nó hoạt động.Để có được hành vi bạn muốn bạn cần phải sử dụng dấu ngoặc đơn để buộc Python để đánh giá phần đầu tiên cách riêng biệt:

>>> ("a" in ["a"]) == True 
True 

Với tất cả những gì đã nói, các == True là không cần thiết bởi vì, như bạn nghi ngờ, khái niệm đã trả về một boolean và tuyên bố if chỉ có thể đánh giá nó như là.

Để quay lại vấn đề khác của bạn, tôi tin rằng những gì bạn đang cố làm là lấy một dòng đầu vào và tạo ra một dòng đầu ra tương ứng tùy thuộc vào những gì người dùng đã nhập. Bạn có thể áp dụng các nhà điều hành in thành một chuỗi và một danh sách để xem nếu chuỗi nằm trong danh sách, cho phép bạn để loại bỏ for vòng lặp của bạn hoàn toàn:

answer = ['Yes', 'yes', 'YES'] 
answer2 = ['No', 'no', 'NO'] 
ans = raw_input() 
if ans in answer: 
    print "Yes!" 
elif ans in answer2: 
    print "No!" 
else: 
    print "Don't know what that means" 

này kiểm tra đầu tiên nếu đầu vào phù hợp với bất kỳ chuỗi trong answer, sau đó tương tự cho answer2. Tất nhiên, bạn có thể đạt được hiệu ứng tương tự nhưng cũng hỗ trợ các dạng khác như YeS bằng cách chuyển đổi đầu vào thành chữ thường và so sánh nó với dạng chữ thường:

if ans.lower() == "yes": 
    print "Yes!" 
# (and so forth) 
Các vấn đề liên quan