-6

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

4

1 回答 1

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()

如果您在第一次迭代中使用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的功能做的不仅仅是“显示”:)

于 2013-10-19T10:29:49.407 回答