2017-04-23 10 views
2

私は3つの異なる変数を持っています。多くのif文の代わりに使用できますか?

モデルは文字列で、 iPhoneモデルを定義しています。

storage(電話機のストレージを定義する整数)。

最後に価格。電話の価格を定義する整数です。

例:

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

もう一つの例:今、私は私が購入し、転売して良好な取引をすることができれば私のプログラムは私を通知したい、と私の質問は、私を行う方法です

model = iPhone 5s 
storage = 16 
price = 150 

それは最も効率的なやり方で行うのですか?

私はif文を使うことができると知っていますが、別の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

「決定ルール」を作成して何らかの形でプログラムでアクセスできるようにするのが普通です。

1-2ヒント:

あなたが行動しなければならないときにのみ、条件を指定するかもしれない、とあなたは何もしないものを指定しないでください。

あなたは代わりにdictsを使用することができます "と" 少ないコードにつながるこのような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

ここでは、クラスがあまりにも複雑に見えます。名前付きトゥループとより機能的なアプローチで何かがより良くなります。 –

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

とそのリストにあるかどうかを確認することができますあなたのユースケースは、ハッシュマップ(辞書)に最適ですタプル、または好ましくは名前付きタプルのようなもので。

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

のif-else

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

アクセスのためのようなステートメントを何か

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"  

辞書を印刷し、必要に応じて例外処理を追加するためのメソッドを定義

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

enter image description here

リファレンスHow to avoid a lot of if else conditions

0

ありサイコー多くの答えがここにありますが、まだどれも受け入れられていないので、私は一緒に別のものを置く:

# 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をすべて書くという手間を省きます。

関連する問題