更多pythonic方式的条件变量

时间:2016-03-31 10:35:54

标签: python if-statement

这就是我想要做的事情:

  1. 获取少量参数
  2. 根据参数,形成一个字符串
  3. 返回字符串
  4. 然而,为此,我可以看到3种可能的方式:

    def form_statement(subject, verb, object):
        greetings = ""
        if subject in ("Paul", "Raj"):
            greetings = "mister"
        return "%s %s %s %s" % (subject, verb, object, greetings)
    

    第二种方式是:

    def form_statement(subject, verb, object):
        if subject in ("Paul", "Raj"):
            greetings = "mister"
        else:
            greetings = ""
        return "%s %s %s %s" % (subject, verb, object, greetings)
    

    第三种方式是:

    def form_statement(subject, verb, object):
        greetings = "mister" if subject in ("Paul", "Raj") else ""
        return "%s %s %s %s" % (subject, verb, object, greetings)
    

    有没有其他更好的方法来做这样的事情?现在我选择了第一种方式,因为“处理”获得问候字符串本身就是一个函数,当第三种方式使用时,该行超过80个字符。

    编辑:似乎有些人感到困惑,我在问哪一个更好用(因为他们投票赞成以意见为基础)。在这里,我试图找出是否有更好的方法,并举例说明我能想到的事情是什么,以便其他人可能不会给他们作为答案。正如其中一个答案中所提到的,我发现在类似情况下使用字典对我来说更好。

4 个答案:

答案 0 :(得分:1)

一种pythonic方式是使用字典来保存主题及其相对greetings,然后使用dict.get()方法,该方法也接受第二个参数,如果在字典中遗漏了键,将返回该参数。

main_dict = {"Paul":"mister", "Raj": "mister"}

def form_statement(main_dict, subject, verb, object):
    greetings = main_dict.get(subject, '')
    return "{} {} {} {}".format(subject, verb, object, greetings)

当您处理更大的数据集时,此方法将显示其功能。因为字典使用哈希表,它们的索引顺序是O(1)。此外,您还可以为每个动词使用不同的结果。

答案 1 :(得分:1)

当条件为真时,第一个版本对greetings进行两次赋值。

其他两个版本是等效的。 作为一般规则,应该使用更易读的。 请记住,开发人员的时间是宝贵的资源。 这就是为什么我会说if-else构造总是合适的,而三元条件(A if cond else B)对于单行是好的。

如果要增强现有代码,请保留其样式。

顺便说一下,使用集合name in {"Paul", .... }

可以实现最快的查找

答案 2 :(得分:0)

您可以从应该具有“mister”的所有名称动态创建字典,并且名称应具有相似的标题。然后,只有get来自该字典的值,或""作为默认值,以防该名称不存在。

pairings = [(("Paul", "Raj"), "mister"), (("Anna", "Paula"), "madam")]
greetings = {name: title for names, title in pairings for name in names}

def form_statement(subject, verb, object):
    return "%s %s %s %s" % (subject, verb, object, greetings.get(subject, ""))

答案 3 :(得分:0)

您可以将函数参数视为列表,并将它们与空格连接起来。当args作为元组出现时,必须先将其转换为列表。

def form_statement(*args):
    args = list(args)
    if args[0] in ["Paul", "Raj"]:
        args.append("mister")
    return " ".join(args)

这是我的小型测试套件(与上面的函数存储在同一个文件中并通过$ py.test greet.py运行:

def test_paul():
    assert form_statement("Paul", "get", "well") == "Paul get well mister"


def test_raj():
    assert form_statement("Raj", "get", "well") == "Raj get well mister"


def test_else():
    assert form_statement("John", "get", "well") == "John get well"

编辑:添加了更明确的版本:

正如@thiruvenkadam正确指出的那样,原始版本不是很明确。这是函数的一个改进版本。

def form_statement(subject, verb, object):
    if subject in ["Paul", "Raj"]:
        return " ".join([subject, verb, object, "mister"])
    else:
        return " ".join([subject, verb, object])

上述两种实现的小优点是,没有尾随空格 本。