【问题标题】:For Loop - Range - Python - Question on the increment logicFor Loop - Range - Python - 关于增量逻辑的问题
【发布时间】:2020-11-13 01:32:20
【问题描述】:

我正在尝试将下面的 for 循环转换为 Python。

for (i = 5; i < n; i = i*5):

当我希望将 i 值设置为 5 的倍数时,我不确定如何使用 Range 函数。例如,第一次我希望 i 为 5,然后是 25,然后是到 125,它应该会继续。

以下是我尝试过的:

i = 5 
for i in range (i, n+1, i*5)

上面的问题是,i 的值增加了 25,使其变为 30,而我希望 i 在第二次迭代中为 25。使用 while 循环非常容易。但我正在查看是否有一种方法可以在 for 循环中实现相同的功能。请帮忙。提前致谢。

【问题讨论】:

  • 除非您实现自定义迭代,否则您不能。

标签: python for-loop range


【解决方案1】:

当我希望将 i 值设置为 5 的倍数时,我不确定如何使用 Range 函数

那样做是行不通的。 range 只能创建等差数列;每次相乘创建一个几何序列。

您可以做的是利用i 值是5 的连续幂的事实;所以对所需的指数值进行循环,并在循环内计算i

# Computing the `limit` in terms of `n` is left as an exercise.
# Just in case you were already computing `n` in terms of an existing `limit`,
# in which case you could just use it directly ;)
for j in range(limit):
    i = 5**j

【讨论】:

    【解决方案2】:

    计算机科学中有一个定理指出,任何“C 风格”for 循环都可以转换为等效的while 循环。这是需要转换的情况之一:

    i = 5
    while i < n:
       # Loop body goes here
        i *= 5
    

    您可以将循环逻辑隐藏在生成器后面:

    def multrange(start, stop, ratstep):
        i = start
        while i < stop:
            yield i
            i *= ratstep
    
    list(multrange(5, 10000, 5))
    #[5, 25, 125, 625, 3125]
    

    【讨论】:

      【解决方案3】:

      您可以使用yield 定义自己的range 函数!

      def range(i, j, k):
          while i * k < j:
              i *= k
              yield i
      
      
      for i in range(5, 2000, 5):
          print(i)
      

      输出:

      25
      125
      625
      

      【讨论】:

      • 请不要建议任何人重新定义内置函数。此外,您的功能以错误的方式开始
      【解决方案4】:

      大多数 Python 程序员只会使用 while 循环:

      i = 5
      while i < n: 
          ....
          i = i * 5
      

      如果你真的非常想要一个 for 循环:

      import itertools
      for i in itertools.takewhile(lambda x: x < n, (5 ** i for i in itertools.count(1))):
          ... whatever ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 2014-10-29
        • 2020-12-22
        • 1970-01-01
        相关资源
        最近更新 更多