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

2024-04-25 00:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在命令行上输入-->;字符串搜索.py乔

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部分来获得预期的输出


Tags: noinselfstringdefdisplaysysresult
1条回答
网友
1楼 · 发布于 2024-04-25 00:22:12

第一个问题:

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函数所做的远远不止“显示”:

相关问题 更多 >