2009-09-15 43 views
17

Tôi đang cố kiểm tra từng chỉ mục trong chuỗi nhị phân 8 chữ số. Nếu đó là '0' thì đó là 'OFF' nếu không thì 'ON'.Python có tương đương với 'chuyển' không?

Có cách nào ngắn gọn hơn để viết mã này bằng tính năng giống như chuyển đổi không.?

+5

bạn đang cố gắng để làm [{ '0': 'Tắt', '1': 'Bật'}. Get (b) cho b trong "01.101.101"] – joeforker

Trả lời

21

Không có. Khi nói đến chính ngôn ngữ, một trong những nguyên tắc cốt lõi của Python là chỉ có một cách để làm điều gì đó. Công tắc chuyển đổi dự phòng thành:

if x == 1: 
    pass 
elif x == 5: 
    pass 
elif x == 10: 
    pass 

(không có sự sụt giảm, tất nhiên).

Chuyển đổi ban đầu được giới thiệu là tối ưu hóa trình biên dịch cho C. Trình biên dịch hiện đại không còn cần những gợi ý này để tối ưu hóa loại câu lệnh logic này nữa.

+11

Bất cứ ai nghĩ rằng Python "chỉ có một cách để làm điều gì đó" là rất bối rối. –

+0

Đã sửa lỗi. Tôi đoán tôi có thể đã tuyên bố rằng đó là mã giả python-esque, hehe. – Soviut

+14

@Glenn Maynard: Có thể có nhiều cách để làm điều đó, nhưng "Phải có một - và tốt hơn là chỉ có một - ** rõ ràng ** cách để làm điều đó", theo PEP 20 ("The Zen of Python "). –

28
+0

Tôi đã nhúng một đoạn trích từ liên kết rất tốt của bạn, cuộn lại nếu bạn không thích nó. –

+0

Điều đó cũng không bị ảnh hưởng. – dlamblin

+0

Trong lý thuyết * *, bạn có thể triển khai một lớp lót với thông qua bằng cách sử dụng defaultdict: >>> từ bộ sưu tập nhập mặc địnhdict >>> functions = defaultdict (lambda: not_found, a = function_1, b = function_2) nhưng có lẽ không phải là một ý tưởng hay trong thực tế, đặc biệt nếu trường hợp thông qua là phổ biến :) –

7

Hãy thử điều này thay vì:

def on_function(*args, **kwargs): 
    # do something 

def off_function(*args, **kwargs): 
    # do something 

function_dict = { '0' : off_function, '1' : on_function } 

for ch in binary_string: 
    function_dict[ch]() 

Hoặc bạn có thể sử dụng một sự hiểu biết danh sách hoặc biểu hiện máy phát điện nếu chức năng của bạn trở về giá trị:

result_list = [function_dict[ch]() for ch in binary_string] 
+0

Điều này thực sự thông minh. – twneale

0

khác-nếu là xấu thực hành, vì chúng là không an toàn khi họ nhận được quá lâu, và liên quan đến phân nhánh có điều kiện không cần thiết (có thể ảnh hưởng đến trình biên dịch/bộ nhớ đệm).

thử này ...

class Functions(): 
    @staticmethod 
    def func(): 
     print("so - foo") 
    @staticmethod 
    def funcWithArgs(junk): 
     print(junk, "foo") 

# fill in your cases here... 
cases = { 
    "a" : Functions.func , 
    "b" : Functions.funcWithArgs , 
    "c" : Functions.funcWithArgs 
} 

def switch(ch, cases, *args): 
    try: 
     len(*args) # empty args 
    except TypeError: 
     return cases[ ch ]() 
    return cases[ ch ](*args) 

# try out your switch... 
switch("a", cases) # "so - foo" 
switch("b", cases, "b -") # "b - foo" 
switch("c", cases, "c -") # "c - foo" 
+0

các chức năng cần thiết để chuyển các biến vào phạm vi – Jason

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