这就是我想要做的事情:
然而,为此,我可以看到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个字符。
编辑:似乎有些人感到困惑,我在问哪一个更好用(因为他们投票赞成以意见为基础)。在这里,我试图找出是否有更好的方法,并举例说明我能想到的事情是什么,以便其他人可能不会给他们作为答案。正如其中一个答案中所提到的,我发现在类似情况下使用字典对我来说更好。答案 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])
上述两种实现的小优点是,没有尾随空格 本。