许多if语句的替代方法?

时间:2017-04-23 22:07:41

标签: python python-3.x if-statement

所以我有3个不同的变量。

模型是一个字符串并定义了 iPhone型号。

存储,它是一个定义电话存储的整数。

最后是价格,这是一个定义手机价格的整数。

示例:

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个。

8 个答案:

答案 0 :(得分:1)

您必须创建一个&#34;决策规则&#34;这是正常的。并以某种方式让你的程序可以访问它。

1-2提示:

您可能只在必须采取行动时指定条件,而您没有指定您不做任何事情的条件。

您可以使用dicts代替&#34;和&#34; s这样可以减少代码:

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

用法:

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

答案 1 :(得分: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)

答案 2 :(得分: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())

答案 3 :(得分:0)

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

通常我会做一些迷你域特定语言 并在字符串或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

答案 4 :(得分:0)

如果您只关心检查特定模型是否与您拥有的数据完全匹配,那么比较字典是一种方法:

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

但是,如果您需要更广泛的标准,例如价格在一定范围内,则会失败。

然后,您可以在列表中存储参考词典,并检查您的测试模型是否在最简单的列表中

,而不是编写29 if s。
tested in reference_list:
    # do something

答案 5 :(得分:0)

您的用例非常适合使用类似元组或最好是名为元组的散列图(dict)。

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

答案 6 :(得分: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

答案 7 :(得分: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的打字工作量。

相关问题