-3

可能重复:
函数中的函数

我怎样才能使功能。显示所有不好的值,而不仅仅是一个?

def get_bad_results(person_results):
        for i in person_results:
                if i[1]>i[3] or i[1]<i[2]:
                    return i[0]

test_results = [["White blood cells",8.5,2,7],
                ["Neutrophils",5.3,2.5,5],
                ["Red blood cells", 12.4, 9,15]]

a = get_bad_results(test_results)
print a

显示White blood cells

代替

White blood cells, Neutrophils
4

4 回答 4

4

您正在寻找yield生成生成器的关键字:

def get_bad_results(person_results):
        for i in person_results:
                if i[1]>i[3] or i[1]<i[2]:
                    yield i[0]

然后,您可以迭代函数的结果(例如,调用list()以创建列表)。生成器比直接生成列表更可取,因为这意味着值是延迟生成的,这在很多情况下更节省内存。

作为旁注,索引i有点难看,在这种情况下,解包值将使您的代码更具可读性:

def get_bad_results(person_results):
        for name, age, height, weight in person_results:
                if age > weight or age < height:
                    yield name

(当然,我在这里编了名字,因为我不知道上下文)。

于 2012-11-10T16:58:32.707 回答
2

该函数将返回符合该语句的第一个匹配项。要全部返回,您可以将它们保存在列表中,当循环完成时,返回列表。

for i in person_results:
    bads = []
    if i[1]>i[3] or i[1]<i[2]:
        bads.append(i[0])
return bads
于 2012-11-10T16:51:03.570 回答
1

如果您不想使用生成器,可以将坏元素附加到列表中,然后将其返回:

def get_bad_results(person_results):
    bad_results = []
    for i in person_results:
        if i[1] > i[3] or i[1] < i[2]:
            bad_results.append(i[0])
    return bad_results

或使用列表推导:

def get_bad_results(person_results):
    return [i[0] for i in person_results if i[1] > i[3] or i[1] < i[2]]
于 2012-11-10T16:51:50.450 回答
0

为什么不从已经进行比较的函数中打印?然后你不需要任何额外的东西来跟踪

def get_bad_results(person_results):
        for i in person_results:
                if i[1]>i[3] or i[1]<i[2]:
                    print i[0]
于 2012-11-10T16:55:58.873 回答