2017-04-23 93 views
2

所以我有3個不同的變量。許多if語句的替代方法?

模型它是一個字符串,並定義 iPhone模型。

存儲這是定義手機存儲一個整數。

最後的價格,這是定義手機的價格的整數。

例子:

model = iPhone 7 
storage = 64 (GB) 
price = 700 ($) 

又如:

model = iPhone 5s 
storage = 16 
price = 150 

現在,我想我的計劃通知我,如果我可以通過購買和倒賣做出一個很好的協議,我的問題是,我該怎麼辦以最有效的方式做到這一點?

我知道,我可以使用if語句,但沒有任何方法來拯救我的寫作或elif的語句很多不同勢?

例子:

if model == "iPhone 7" and storage == 64 and price <= 700: 
print("do_something") 

這是很多的代碼只有1模型和存儲選項。如果我將使用這種方法,我不得不再寫29個。

+1

除非你可以比你的例子中有更少的具體規則,你必須寫這些if語句。但是,你可以找到一個更好的方式來編寫它們。舉個例子,把這些信息放在每個模型的不同類中,讓這些類有一個方法可以返回「True」來存儲任何適當的存儲/價格組合? –

+0

@Denkan,請看看我的「詞典」方法,並告訴我是否有幫助。 –

回答

0

在這種情況下,我更喜歡的字典。

創建辦根據項目,並通過數據的特定任務不同的處理器(功能)。請參見下面的代碼:

# Different handlers, each takes keyword args and can work specific task 
def fun1(**kwargs): 
    print (kwargs) 
    print("fun1") 


def fun2(**kwargs): 
    print("fun2") 

def fun3(**kwargs): 
    print("fun3") 

def fun4(**kwargs): 
    print("fun4") 


# Example data. key is phoneModel_storage 
a = { 
    'iPhone1_64': { 
     "storage": 64, 
     "action": fun1, 
     "price":1235 
    }, 
    'iPhone1_32': { 
     "storage": 64, 
     "action": fun3, 
     "price":1235 
    }, 
    'iPhone2_16': { 
     "storage": 16, 
     "action": fun1, 
     "price":1235 
    }, 
    'iPhone3_32': { 
     "storage": 32, 
     "action": fun3, 
     "price":1235 
    }, 
    'iPhone4_128': { 
     "storage": 128, 
     "action": fun4, 
     "price":1235 
    }, 
} 

model = "iPhone1" 
storage = 64 

data = a.get(model + "_" + str(storage), None) 
if data: 
    data['action'](**data) 
+0

通常的關注點適用於將可變對象用作函數參數的默認值。 –

+0

@AdamSmith關鍵字參數工作正常嗎? –

+0

它只是'def foo(some_arg = something_mutable):'因爲'soemthing_mutable'只被調用一次,所以函數的突變會意外地影響函數的全局狀態。 –

1

這是正常的,你必須創建一個「決策規則」,不管怎樣你的程序使其accessable。

1-2提示:

時,你必須採取行動,您可能只指定的條件,你沒有指定的人,你沒有做任何事情。

您可以使用類型的字典,而不是 「和」 s這樣導致更少的代碼:

deal2action = { 
('iphone 7', '64', '700'):'ACT' 
} 

用法:

my_deal = ('iphone 7', '64', '700') 
my_action = deal2action[my_deal] 
0

你可以利用類,以儘量減少重複代碼:

class Phone(): 
    BEST_MODELS = ["IPHONE7", "IPHONE 5S", "Galaxy S3"] 
    MIN_STORAGE = 100 
    MAX_STORAGE = 200 
    MIN_PRICE = 1000 
    MAX_PRICE = 3000 
    def __init__(self, model, storage, price): 
     self.model = model 
     self.storage = storage 
     self.price = price 

    def is_good_deal(self): 
     return (self.model in Phone.BEST_MODELS 
      and Phone.MIN_STORAGE <= self.storage <= Phone.MAX_STORAGE 
      and Phone.MIN_PRICE <= self.price <= Phone.MAX_PRICE) 

p1 = Phone("IPHONE7", 150, 1700) 
p2 = Phone("LG G1", 150, 700) 

print(p1.is_good_deal()) # True 
print(p2.is_good_deal()) # False 

如果,例如,你有電話的集合,你可以做到以下幾點:

lots_of_phones = [p1, p2] 

good_deal_phones = (phone for phone in lots_of_phones if phone.is_good_deal()) 
+0

一個類似乎過於複雜。與命名的元素和更多功能的方法的東西會更好的imo。 –

0
if model, storage, price == "iPhone 7", 64, 700: 
    print("do_something") 

通常我做了一些小領域特定語言 和DEFI NE的價格在一個字符串,或CSC文件

table = 
"""Iphone 7, 64, 700 
Iphone 6, 34, 500""" 

lines = table.split('\n) # for wider tables use standard csv package, but or for 3 columns 
dico = dict((r[0], r[1]), r[2]) for r in line.split(', ') for line in lines)) 
def good_deal(model, memory, price): 
    return dico.get((model, memory), 10000000) > price 
0

如果你只關心如果特定的模式完全匹配的數據,您已經,然後比較字典中的一段路要走檢查:

>>> reference = {"model": "iPhone 5s", "storage": 16, "price": 550} 
>>> tested = {"model": "iPhone 5s", "storage": 16, "price": 550} 
>>> reference == tested 
True 

然而,如果你想要更廣泛的標準,如價格落在一定範圍內,這將失敗。

然後,而不是寫29個if S,你可以存儲參考詞典列表,並檢查您的測試模型是在該列表中有簡單的

0

你的使用情況是完美的一個HashMap(字典)用元組或最好命名爲tuple的東西。

from collections import namedtuple 

Phone = namedtuple("Phone", "model storage price") 

funcmap = {Phone("iPhone 7", 64, 700): \ 
      lambda p: print("Do something to ", p), 
      Phone(...): # etc 
      ..., 
      ... } 

phone = Phone("iPhone 7", 64, 700) 
f = funcmap[phone] # maybe funcmap.get(phone, lambda _: None) in case it's new? 
f(phone) 

這就是說一個決策算法似乎更好。

def is_good_deal(phone: Phone) -> (bool, None): 
    value_dict = {Phone("iPhone 7", 64, 700): 600, 
        ...} 
    try: 
     return phone.value < value_dict[phone] 
    except KeyError: 
     # phone isn't in value_dict 
     return None 
0

定義的方法來打印東西

def method1(): 
    print "Yippee I have best iPhone 7 :)" 

def method2(): 
    print "Oh! still it is an iPhone 7" 

def method3(): 
    print "Yeah! I have best iPhone 5 :)" 

def method4(): 
    print "Oh! base iPhone 5"  

詞典的if-else

stuff = {'iPhone 7' : {'64GB' : { '$700' : method1}, '32GB' : { '$500' : method2}}, 'iPhone 5' : {'32GB' : { '$250' : method3}, '16GB' : { '$150' : method4}}} 

訪問喜歡的語句,並添加異常處理需要

stuff['iPhone 7']['64GB']['$700']() 

enter image description here

參考How to avoid a lot of if else conditions

0

有SOOOO很多答案在這裏,但還是沒有接受,所以我會放在一起另一個問題:

# Prepare a list of what you know will be good deals: 
dctGoodDeals = {} 
dctGoodDeals[('iPhone 7', 64)] = 700 
dctGoodDeals[('iPhone 5s', 16)] = 150 

# You have got at that point in your code from somewhere: 
model = 'iPhone 7'; storage=64; price=500 
# model = 'iPhone S'; storage=64; price=500 

#所以你可以把在該點成您的代碼如下: try: if (price <= dctGoodDeals[(model, storage)]): print("do something") except: print("not yet in dctGoodDeals:", model, "with", storage, "GB")

通過這種方式,您可以獲得所有打印輸出的內容,並節省一些編寫所有if的打字工作量。