我有一个特定的编程任务

时间:2017-06-15 19:10:10

标签: python list sum

给定3个int值,a b c,返回它们的总和。但是,如果任何值是青少年 - 在13..19(含)范围内 - 则该值计为0,除了15和16不算青少年。写一个单独的帮助器“def fix_teen(n):”,它接受一个int值并返回为青少年规则修复的值。这样,您可以避免重复青少年代码3次(即“分解”)。在主no_teen_sum()。下面定义帮助程序,并在与主no_teen_sum()相同的缩进级别。

我的解决方案: -

def no_teen_sum(a,b,c):
    sum=0
    lst=[13,14,15,16,17,18,19]
    def fix_teen(n):
      s=0
      if n >=13 and n<= 19:
        if n==15:
          s=15
        elif n==16:
          s=16
        else:
          s=0
      return s
    if (a not in lst) and (b not in lst) and (c not in lst):
        sum=a+b+c
    elif  a in lst :
        sum=fix_teen(a)+b+c
        if b in lst:
            sum=fix_teen(a)+fix_teen(b)+c
    elif b in lst:
        sum=a+fix_teen(b)+c
        if c in lst:
            sum=a+fix_teen(b)+fix_teen(c)
    elif c in lst:
        sum=a+b+fix_teen(c)
        if a in lst:
            sum=fix_teen(a)+b+fix_teen(c)
    else:
        sum=fix_teen(a)+fix_teen(b)+fix_teen(c)
    return sum

输出:

>>> no_teen_sum(14,1,13)
14                                                 #  the answer should be 1
>>> no_teen_sum(14,2,17)
19                                                 #  the answer should be 2
>>> no_teen_sum(16,17,18)
34                                                 # the answer should be 16

>>> no_teen_sum(17,18,19)
19                                                 # the answer should be 0

任何建议都将非常感谢。在此先感谢.......

3 个答案:

答案 0 :(得分:3)

问题是你如何写修复青少年。你应该简单地发送数字来修复青少年并将其写成如下:

def fix_teen(n):
    if (n >= 13 and n <=19):
        if (n!= 15 and n != 16):
            n = 0
    return n

然后您的常规方法可能只是:

def no_teen_sum(a,b,c):
    return fix_teen(a) + fix_teen(b) + fix_teen(c)

这会缩短您的代码并修复您的错误。

答案 1 :(得分:2)

你做的事情超级复杂:你应该不要写所有那些if语句,简单地概括fix_teen(n)规则就足够了。< / p>

一个数字计为 teen ,因为它在13到19之间,但不是15或16.所以我们可以写:

def fix_teen(n):
    if n >= 13 and n <= 19 and (n < 15 or n > 16):
        return 0
    return n

或更优雅:

def fix_teen(n):
    if  13 <= n <= 19 and not (15 <= n <= 16):
        return 0
    return n

接下来我们可以简单地写一下:

def no_teen_sum(a,b,c):
    return sum(fix_teen(n) for n in (a,b,c))

我们也可以使用*args轻松概括这一点:

def no_teen_sum(*args):
    return sum(fix_teen(n) for n in args)

现在我们可以用任意个值来调用它。这导致:

>>> no_teen_sum(14,1,13)
1
>>> no_teen_sum(14,2,17)
2
>>> no_teen_sum(16,17,18)
16
>>> no_teen_sum(17,18,19)
0

答案 2 :(得分:1)

带列表推导的简单方法:

def no_teen_sum(*args):  # *args means that it can take any number of arguments and pass it as a tuple to the function
    no_teens = [n for n in args if any([n in (15, 16), n not in range(13, 20)])]  # List comprehension that will iterate the passed arguments and omit anything between 13-19 except 15 & 16
    return sum(no_teens)  # return the sum

编辑:再次阅读你的问题后,我注意到你需要一个teen_fix方法,我认为是分配的要求,在这种情况下使用以下解决方案,尽管上面的方法完全有效。

def no_teen_sum(a, b, c):
    no_teens = [teen_fix(n) for n in [a, b, c]]
    return sum(no_teens)

def teen_fix(n):
    return n if any([n in (15, 16), n not in range(13, 20)]) else 0