您在这里遇到的问题是您build_sentence()
正在接受一个参数(每个调用都使用一个字符串)但是对其进行迭代并且只返回最后一个结果(因此它返回一个包含字符串的最后一个字符的句子以及其余的静态定义的句子)。
如果您遍历一个字符串,那么您将处理该字符串的每个字符。
就像是:
def build_sentence(benefit):
'''Returns a sentence from a template filling in benefit as the subject'''
return "%s is a benefit of functions!' % benefit
...将与您的其余代码一起使用。
或者,您可以使用以下build_sentences()
功能:
def build_sentences(*benefits):
'''Returns a list of sentences from a template touting each benefit'''
results = list()
for each in benefits:
results.append("%s is a benefit if functions!" % each)
return results
...然后简单地调用该函数,并列出以下好处:
build_sentences('More organized code','More readable code','Easier code reuse','Allowing programmers to share and connect code together')
... 或者
build_sentences(*myList)
这种特殊的形式(*benefits
用作函数定义的参数,或者为函数调用提供可变数量的参数,或者使用该*myList
形式来扩展我的列表的内容,将该列表应用到“varargs”参数列表中更高级一点。(在这种情况下也不是绝对必要的,您可以*
从函数的参数定义和函数的调用参数中删除前缀。在这种情况下,当使用文字列表调用函数时,您必须包装文字字符串参数,[...]
以使它们成为文字字符串:
def tout_benefits(benefits):
'''Given a list of benefits tout them using a template'''
return [ "%s is a benefit of functions!" % x for x in benefits ]
tout_benefits(['More organized code','More readable code','Easier code reuse','Allowing programmers to share and connect code together'])
# Notice called with `[ ..., ..., ... ]`
另请注意,在最后一种形式中,我将for ...
循环简化为更紧凑的“列表理解”......以及返回列表的表达式。我也可以在前面的例子中使用这种形式;但想将它与关于 varargs(可变参数/参数)处理的观点分开介绍。
另请注意,您可以使用+
表达式代替"%s ..." %
所有这些示例。但是,“字符串格式化”运算符让您可以更好地控制值如何插入到模板/字符串中,并允许多个值、类型、数字精度和许多其他功能,这些功能远远超出了简单的字符串连接(使用+
)。