当我在命令行上输入 - > stringsearch.py joe
时Expected Result: joe foe
Actual Result: joe foe
No String
代码:
#!usr/bin/python
import sys
SearchString = sys.argv[1]
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
def display(self):
if SearchString in per.fname:
print per.fname, per.lname
if SearchString in per.lname:
print per.fname, per.lname
else:
print "No String"
obj=[People("joe","foe"),People("lui","sui")]
for per in obj:
per.display()
我应该在哪里编写else部分以获得预期的输出
答案 0 :(得分:3)
第一个问题:
def display(self):
if SearchString in per.fname:
print per.fname, per.lname
elif SearchString in per.lname:
print per.fname, per.lname
else:
print "No String"
if
语句本身并不构成一组备选方案。要指示使用elif
关键字,因此如果未满足任何条件,则将执行else
部分。
在您的第一个版本中,第一个if
已单独验证。在此之后还有一个单独的替代方案:如果print per.fname, per.lname
或SearchString in per.lname
为真,则print "No String"
,无论第一个if
的评估结果如何。
第二个问题在这里:
obj=[People("joe","foe"),People("lui","sui")]
for per in obj:
per.display()
如果在第一次迭代中以joe
或foe
作为参数运行脚本,它将打印您的预期结果。但是在第二次迭代中,它将不匹配第二个对象中的任何内容并打印"No String"
。
可能的解决方案:
#!usr/bin/python
import sys
SearchString = sys.argv[1]
class People:
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
def isMatching(self, matchString):
return matchString in self.fname or matchString in self.lname
def display(self):
print self.fname, self.lname
obj=[People("joe","foe"),People("lui","sui")]
anyMatched = False
for per in obj:
if per.isMatching(SearchString):
anyMatched = True
per.display()
if not anyMatched:
print "No String"
请注意,我所做的唯一一件事就是让函数的行为与其名称相同。如果你坚持这个简单的规则,它将为你节省很多麻烦。你原来的display
函数做得更多,然后只是“显示”:)