为什么每次匹配结果时都会执行else部分

时间:2013-10-19 10:27:00

标签: python loops

当我在命令行上输入 - > 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部分以获得预期的输出

1 个答案:

答案 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.lnameSearchString in per.lname为真,则print "No String",无论第一个if的评估结果如何。

第二个问题在这里:

obj=[People("joe","foe"),People("lui","sui")]
for per in obj:
    per.display()

如果在第一次迭代中以joefoe作为参数运行脚本,它将打印您的预期结果。但是在第二次迭代中,它将不匹配第二个对象中的任何内容并打印"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函数做得更多,然后只是“显示”:)