Python 当循环运行一次时?

Python 当循环运行一次时?,python,list,function,while-loop,Python,List,Function,While Loop,新的编码和我试图解决这个编码问题的学习 提示: 如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。求1000以下所有3或5的倍数之和 这将导致在控制台上打印[3][5] 您的返回是循环的一部分,这意味着在迭代结束时,您只需从函数返回,而不用进行另一次迭代。将其移出循环,即: def threeList(): n = 1 while (n*3<1000): result = n*3 three.a

新的编码和我试图解决这个编码问题的学习

提示:

如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。求1000以下所有3或5的倍数之和

这将导致在控制台上打印[3][5]

您的返回是循环的一部分,这意味着在迭代结束时,您只需从函数返回,而不用进行另一次迭代。将其移出循环,即:

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
    return three
事实上,由于两个函数的差别很小,您应该重构代码,让一个函数只接受乘法器,因为这是唯一的区别并返回填充列表。这次我们使用局部变量来创建结果列表,因此这次您需要返回它,否则结果列表在函数外部将不可用:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

事实上,您可以将其与print合并,因为three和five没有其他用途,因此最终代码如下所示:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

print(my_func(3), my_func(5))
您的返回是循环的一部分,这意味着在迭代结束时,您只需从函数返回,而不是执行另一个迭代。将其移出循环,即:

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
    return three
事实上,由于两个函数的差别很小,您应该重构代码,让一个函数只接受乘法器,因为这是唯一的区别并返回填充列表。这次我们使用局部变量来创建结果列表,因此这次您需要返回它,否则结果列表在函数外部将不可用:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

事实上,您可以将其与print合并,因为three和five没有其他用途,因此最终代码如下所示:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

print(my_func(3), my_func(5))

要以Pythonic的方式解决您的问题,请使用类似的:

代码: 测试代码: 结果:
要以Pythonic的方式解决您的问题,请使用类似的:

代码: 测试代码: 结果:
除了Marcin的精彩答案之外,请注意,您还可以提前计算要使用哪些元素,并完全避免while循环。他是你的朋友

multiples_of_five = range(5, 1001, step=5)
multiples_of_three = range(3, 1001, 3)
由于范围的停止是独占的,但我们希望所有3和5的倍数都达到1000,因此我们必须停止在1001。这简化了Marcin在上面列出的my_func

def list_multiples(n):
    result = []
    for i in range(n, 1001, n):
        result.append(i)
    return result
不过,如果我们更仔细地研究一下,你会发现我们基本上只是对列表进行转换并返回。让我们直接做吧

def list_multiples(n):
    return list(range(n, 1001, n))
从那里我们可以找到五的倍数和三的倍数

fives = list_multiples(5)
threes = list_multiples(3)
设置为删除重复项15的强制转换是5和3的倍数,但不应求和两次

all_nums = set(fives + threes)
并将结果相加

result = sum(all_nums)

除了Marcin的精彩答案之外,请注意,您还可以提前计算要使用哪些元素,并完全避免while循环。他是你的朋友

multiples_of_five = range(5, 1001, step=5)
multiples_of_three = range(3, 1001, 3)
由于范围的停止是独占的,但我们希望所有3和5的倍数都达到1000,因此我们必须停止在1001。这简化了Marcin在上面列出的my_func

def list_multiples(n):
    result = []
    for i in range(n, 1001, n):
        result.append(i)
    return result
不过,如果我们更仔细地研究一下,你会发现我们基本上只是对列表进行转换并返回。让我们直接做吧

def list_multiples(n):
    return list(range(n, 1001, n))
从那里我们可以找到五的倍数和三的倍数

fives = list_multiples(5)
threes = list_multiples(3)
设置为删除重复项15的强制转换是5和3的倍数,但不应求和两次

all_nums = set(fives + threes)
并将结果相加

result = sum(all_nums)

这比我的尝试容易多了!从没想过要这样做。谢谢。虽然这是正确的,但如果不解释genexps的工作原理,这对初学者来说并不是一个有用的答案。现有的答案听起来好像这是sum的一个功能,而不是对生成器表达式进行sum操作。@AdamSmith您已经提供了初学者的答案,这还不够吗?请记住,堆栈溢出的目标是创建一个QnA风格的有用信息存储库,这并不总是意味着迎合最低公分母。尽管一些额外的解释总是有帮助的,但缺乏这些解释并不能证明这里的反对票是正确的…@coldspeed耸耸肩你可能是对的,但这本质上是一个只使用代码的答案,虽然没有错,但肯定不是很好。@AdamSmith,我一直发现一个概念,即一行代码的答案是多么不充分。拥抱Python。其他人解释了OPs代码的基本问题。但为什么不解释一下如何做对呢?20行代码可以替换为一行!一行易于阅读的代码。为什么这是件坏事?这比我的尝试容易多了!从没想过要这样做。谢谢。虽然这是正确的,但如果不解释genexps的工作原理,这对初学者来说并不是一个有用的答案。现有的答案听起来好像这是sum的一个功能,而不是对生成器表达式进行sum操作。@AdamSmith您已经提供了初学者的答案,这还不够吗?请记住,堆栈溢出的目标是在中创建有用的信息存储库
QnA风格,这并不总是意味着迎合最低的公分母。尽管一些额外的解释总是有帮助的,但缺乏这些解释并不能证明这里的反对票是正确的…@coldspeed耸耸肩你可能是对的,但这本质上是一个只使用代码的答案,虽然没有错,但肯定不是很好。@AdamSmith,我一直发现一个概念,即一行代码的答案是多么不充分。拥抱Python。其他人解释了OPs代码的基本问题。但为什么不解释一下如何做对呢?20行代码可以替换为一行!一行易于阅读的代码。为什么这是件坏事?我就知道事情很简单!我现在将阅读有关变量范围的内容。非常感谢。我唯一要做的是,虽然这正确地捕获了OP的预期结果,但他的实现在某种程度上是错误的,您没有纠正重复项,可能不应该添加两次。否则,这是一个极好的回答:我知道事情很简单!我现在将阅读有关变量范围的内容。非常感谢。我唯一要做的是,虽然这正确地捕获了OP的预期结果,但他的实现在某种程度上是错误的,您没有纠正重复项,可能不应该添加两次。否则,一个很好的答案:YMMV,我考虑任何while循环,但真正的代码气味。肯定有地方可以使用它们,但一般来说,只要有可能,您就应该将其分解为for循环。很好的解释。将来将尝试避免While循环。关于真实性的问题。我们只是在想永远运行一个函数时才使用它吗?@BenWallace在默认状态为循环的任何时候,并且只有在例外情况下才应该中断该循环。当True为:user\u in=inputsome提示符时,通常以这种方式请求用户输入;如果IsValueUsSeriIn:在YMMV中断时,我考虑任何while循环,而代码代码闻起来是真的。肯定有地方可以使用它们,但一般来说,只要有可能,您就应该将其分解为for循环。很好的解释。将来将尝试避免While循环。关于真实性的问题。我们只是在想永远运行一个函数时才使用它吗?@BenWallace在默认状态为循环的任何时候,并且只有在例外情况下才应该中断该循环。当True为:user\u in=inputsome提示符时,通常以这种方式请求用户输入;如果你是瓦利杜瑟,那就休息吧