给定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
任何建议都将非常感谢。在此先感谢.......
答案 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