Python条件语句

时间:2011-08-07 11:33:32

标签: python conditional conditional-statements

def Fitness(a, b, c):  
    if ((a&b&c) >= 4) & ((a+b+c) >= 13):  
        return('Gold')  
    if ((a&b&c) >= 3) & ((a+b+c) >= 10):  
        return('Silver')   
    if ((a&b&c) >= 2) & ((a+b+c) >= 07):  
        return('Pass')  
    else:  
        return('Fail')

现在问题是当给出Fitness(2,2,5)时,控件跳转到默认值即。 '失败'。 实际输出在哪里是'通过'。 ?

5 个答案:

答案 0 :(得分:17)

请注意

a&b&c >= 2

不同
a>=2 and b>=2 and c>=2.

我认为你的意思是第二个,即所有值都大于2。 (第一个带有binary and的所有值,并将其与值二进行比较。)

答案 1 :(得分:5)

使用and代替&(二进制和)。并且不要写07 - 以0开头的数字可能会被解释为八进制,具体取决于您的Python版本。

与霍华德的灵感一起,我建议:

def Fitness(a, b, c):
    if all(x>=4 for x in (a,b,c)) and (a+b+c) >= 13:
        return('Gold')
    if all(x>=3 for x in (a,b,c)) and (a+b+c) >= 10:
        return('Silver') 
    if all(x>=2 for x in (a,b,c)) and (a+b+c) >= 7:
        return('Pass')
    return('Fail')

此外,你很遗憾没有获得铜牌......

答案 2 :(得分:3)

  

实际输出在哪里是'通过'。

不,不是。 2(0b010)& 2& 5(0b101)为0,因此即使您将&更改为将and分隔为{{1}},表达式也将全部失败。也许你打算使用完全不同的表达方式?

答案 3 :(得分:2)

我发布这篇文章是对Tim Pietzcker的答案的评论,因为它只是对它的改进,但评论字段会弄乱格式化,所以我将它作为一个单独的答案。

def fitness(*args):
    arg_sum = sum(args)
    smallest_arg = min(args)

    if smallest_arg >= 4 and arg_sum >= 13:
        return 'Gold'
    if smallest_arg >= 3 and arg_sum >= 10:
        return 'Silver'
    if smallest_arg >= 2 and arg_sum >= 7:
        return 'Pass'
    return 'Fail'

首先是重要的事情:

  1. 将括号中的返回值包含在return('Gold')中,这本身并没有错,但会让读者感到困惑; return是一个陈述,而不是一个功能。它仍然有效,因为括号生效silently ignored。如果您想要的是事实上返回一个包含单个字符串元素的元组,请执行return ('Gold',)
  2. DRY:计算一次参数的和和最小元素,并使用if块中的计算值,如上所示。
  3. 由于参数都被平等对待并一起处理,因此将它们收集在*args元组中。这也将概括函数以使用任意数量的参数。如果不允许这样做,请将其添加到函数的开头:

    if len(args) != 3:
        raise TypeError("Need exactly 3 arguments, got {0}".format(len(args)))
    
  4. 最后,根据python style guide,我只会提到函数应该lower_case_names。风格指南当然不是强制性的,只是推荐。 :)

答案 4 :(得分:-1)

def fitness(*args):
    arg_sum = sum(args)
    smallest_arg = min(args)

    if smallest_arg >= 4 and arg_sum >= 13:
        return 'Gold'
    if smallest_arg >= 3 and arg_sum >= 10:
        return 'Silver'
    if smallest_arg >= 2 and arg_sum >= 7:
        return 'Pass'
    return 'Fail'