2011-02-10 15 views
6

Tôi là một 'neophyte python' và cố gắng nắm bắt các hoạt động bên trong của kiểu dữ liệu từ điển. Đêm qua tôi đã cố gắng sử dụng nó như một cấu trúc điều khiển (tức là câu lệnh switch) cho đầu vào bàn phím trên một chương trình OpenGL.Python: Sử dụng từ điển khi công tắc không hoạt động

Bài toán là vì lý do nào đó từ điển tiếp tục đánh giá TẤT CẢ các trường hợp (hai trong trường hợp này) thay vì chỉ từ khóa được nhấn.

Dưới đây là một mảnh ví dụ về mã:

def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 
    values.get(key, default)() 

tôi đã dành một giờ hoặc đêm qua nhiều cố gắng tìm câu trả lời cho lý do tại sao tất cả các 'trường hợp' được đánh giá, tôi đã có một vài ý tưởng, nhưng không thể tìm ra câu trả lời cho câu hỏi "tại sao". Vì vậy, ai đó có thể tử tế, đủ để giải thích cho tôi tại sao khi tôi nhấn phím 'n' (đại diện ascii là 110) đoạn mã này cũng đánh giá mục nhập dưới 27 (phím ESC) không? Không.

Xin lỗi nếu chủ đề này đã bị đánh đập đến chết nhưng tôi đã xem và không thể tìm thấy câu trả lời rõ ràng một cách dễ dàng (có thể tôi đã bỏ qua nó).

Cảm ơn bạn.

Trả lời

3
def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 

Trong trường hợp này, bạn đang xây dựng một dict chứa giá trị trở lại của "discoMode()" được gán cho 110, và giá trị trở lại của "exit()" để 27.

gì bạn có nghĩa là để viết là:

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 

Điều này sẽ gán 110 cho hàm discoMode (không gọi hàm!), tương tự như vậy để thoát. Ghi nhớ các hàm là các đối tượng lớp đầu tiên: chúng có thể được gán, lưu trữ và được gọi từ các biến khác.

15

Bạn không nên gọi các chức năng. Chỉ cần lưu trữ các đối tượng chức năng tự trong từ điển, không giá trị trả về của họ:

def keyboard(key): 
    values = { 
     110: discoMode, 
     27: exit 
    } 
    values.get(key, default)() 

f() là lời kêu gọi các chức năng f và đánh giá với giá trị trở lại của cuộc gọi này. f là chính đối tượng hàm.

+0

Và đảm bảo rằng giá trị cho 'mặc định' cũng giống như đối tượng hàm (nghĩa là gọi' default() 'là hợp pháp và thực hiện điều gì đó hợp lý.) –

0

Chỉ cần xóa dấu ngoặc đơn, do đó bạn tham chiếu hàm thay vì kết quả của cuộc gọi đến hàm. Nếu không, bạn nói rõ ràng: "gọi hàm này để lấy giá trị để liên kết với khóa này".

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 
    values.get(key, default)() 
Các vấn đề liên quan