返回 不要像打印一样转动 [关闭]

Return Don't turn like print [closed]

提问人:Marwan Rabi 提问时间:8/15/2023 最后编辑:BarmarMarwan Rabi 更新时间:8/15/2023 访问量:74

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

3个月前关闭。

我在codewars kata https://www.codewars.com/kata/58cbfe2516341cce1e000001/train/python 中有问题

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(n+1):
        if i % 2 == 0 and i != 0:
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    return c

我通过了测试,但在尝试中,任何大数字都会返回零

返回的测试:the tests with return

返回的尝试:the attempts with return

但是,当我使用打印时,所有答案都是正确的

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(n+1):
        if i % 2 == 0 and i != 0:
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    print (c)

尝试打印

attempts with print请帮帮我!

python-3.x 列出 数学 错误处理

评论

3赞 Karl Knechtel 8/15/2023
提示:查看失败的测试用例。输入的数字是奇数还是偶数?现在,仔细想想你的逻辑。如果输入数字是 ,哪些数字将乘以您的代码?(你检查过吗?你能想出一种方法来检查吗?如果您在进行乘法之前尝试显示怎么办?哪些数字应该相乘?你明白为什么这会导致问题吗?9oddeven
1赞 Karl Knechtel 8/15/2023
对于以后的问题,请先尝试自己找到问题。对于这样的问题,我们不会给出完整的答案,因为它们不符合现场标准;我们需要可以帮助他人的具体问题。要创建一个好问题,首先要通过仔细研究代码的作用来寻找问题,一步一步;当您发现问题时,为有问题的部分创建一个适当的最小可重现示例,然后查看是否仍然存在有意义的问题。
1赞 Karl Knechtel 8/15/2023
“但是,当我使用打印时,所有答案都是正确的”——事实并非如此。您没有正确理解测试人员的反馈。您显示的数字与返回的数字相同 - 但您必须满足测试人员的要求。测试人员在调用函数时无法读取屏幕上显示的内容。它必须使用返回值。printreturnreturn
0赞 Barmar 8/15/2023
@KarlKnechtel他在第一个版本中做到了,我相信这是他提交给测试人员的版本。第二个版本只是为了看看它返回了什么。return c
0赞 Karl Knechtel 8/15/2023
@Barmar......是的,我明白。问题说“当我使用打印时,所有答案都是正确的”,但这显然不是真的。它打印了本来会返回的答案,而这些答案显然有一半的时间是错误的。(测试人员在使用打印时会失败,但这是一个单独的问题。

答:

0赞 azro 8/15/2023 #1

问题

你的逻辑是错误的,你总是使用奇数,但据说

  • 如果为奇数,则将奇数相乘,直到nn
  • 如果为偶数,则将偶数相乘,直到nn

修复

将所需的值作为 exercice 状态

def count_zeros_n_double_fact(n): 
    res = []
    oddeven = []
    revers = []
    result = 1
    c = 0
    for i in range(1, n+1):
        if (i % 2 == 0 and n % 2 == 0)  or (i % 2 == 1 and n % 2 == 1):
            oddeven.append(i)
    for x in oddeven:
        result = result * x
    for z in reversed(str(result)):
        if z == '0':
            c+=1
        else:
            break
    return c

提高

只循环每两个值并直接乘以它们,不要将它们存储在列表中

def count_zeros_n_double_fact(n):
    result = 1
    c = 0
    for i in range((n + 1) % 2 + 1, n + 1, 2):
        result *= i
    for z in reversed(str(result)):
        if z == '0':
            c += 1
        else:
            break
    return c

其他方式

from functools import reduce
from operator import mul

def count_zeros_n_double_fact(n):
    result = str(reduce(mul, range((n + 1) % 2 + 1, n + 1, 2)))
    return len(result) - len(result.rstrip("0"))

评论

0赞 Marwan Rabi 8/15/2023
非常感谢您的精彩回答,感谢您的努力