Python:嵌套循环以10的倍数执行计算

时间:2014-09-19 17:40:29

标签: python loops math nested-loops

我是使用python的新手,这个程序的目标是让它自己添加(1/2)和(1/3)很多次,如下面的输出所示。我认为我需要做的是让外循环确定从“1000”开始时添加多少次,然后从那里增加10倍(1000,10000,100000等等)。内循环是我想要实际添加(1/2)和(1/3)的地方。下面是我目前编写的代码,它不执行我需要的代码以及代码应该执行的示例输出。我觉得我走在正确的轨道上我只是不知道还能做什么,我觉得我已经尝试了一切。任何有关这方面的帮助将不胜感激!谢谢!

我的代码:

def main():

    for count in range(1000, 1000000000):
        sum12 = 0.0
        sum13 = 0.0
        for count2 in (1000, 1000000000):
            sum12 = sum12 + (1.0 / 2.0)
            sum13 = sum13 + (1.0 / 3.0)

        print(sum12, sum13)

main()

示例输出:

Iterations, 1/2 sum, 1/2 product, diff, 1/3 sum, 1/3 product, diff

1000 500.0 500.0 0.0 333.33333333333184 333.3333333333333 -1.4779288903810084e-12

10000 5000.0 5000.0 0.0 3333.3333333337314 3333.333333333333 3.9835867937654257e-10

100000 50000.0 50000.0 0.0 33333.33333328976 33333.33333333333 -4.3568434193730354e-08

1000000 500000.0 500000.0 0.0 333333.3333322413 333333.3333333333 -1.092033926397562e-06

10000000 5000000.0 5000000.0 0.0 3333333.3337136623 3333333.333333333 0.00038032932206988335

100000000 50000000.0 50000000.0 0.0 33333333.28415699 33333333.333333332 -0.04917634278535843

1000000000 500000000.0 500000000.0 0.0 333333332.6651181 333333333.3333333 -0.6682152152061462

2 个答案:

答案 0 :(得分:0)

  

我认为我需要做的是让外循环确定在" 1000"开始时添加多少次。从那里上升十倍的倍数(1000,10000,100000等等)。

换句话说,您的问题是如何撰写与range(1000, 1000000000)类似的内容,而不是为您提供所有值10001001,...,{ {1}},它只会为您提供10000000001000等,对吧?所以,就像10000一样,除了乘以,而不是在每次迭代时添加range(start, stop, step)


让我们从step工作原理的简化版开始:

range

真实def range(start, stop, step): while start < stop: yield start start += step 实际上是一个序列,而不是迭代器,它处理负步值等事情,但是让我们忽略它;这个最小的版本就是你所需要的。


如果您不理解range位,请阅读Iterators以及教程中关于生成器的以下部分,但目前您可以假装它是更智能的版本这样:

yield

那么,我们如何将其转换为乘以而不是相加的几何范围?只需将def range(start, stop, step): result = [] while start < stop: result.append(start) start += step return result 更改为+

即可
*

答案 1 :(得分:0)

  

我认为我需要做的是让外循环确定在&#34; 1000&#34;开始时添加多少次。从那里上升十倍的倍数(1000,10000,100000等等)。

这正是示例输出建议您应该做的事情。

有很多方法可以做到这一点。我将从一个易于理解的方法开始,这将使大多数经验丰富的python程序员畏缩并构建一些希望不会让那个经验丰富的python程序员畏缩的东西。

这是易于理解的非pythonic方法:

count = 100 # Note that I'm starting at 100 rather than 1000
while count < 1000000000 : 
    count = count * 10
    # Rest of your code goes here

一般来说,使用for循环比使用while循环更好,并且使用某种类型的生成器会更好。你想要做的是对数字10 3 ,10 4 ,...,10 8 进行分析。这建议使用整数3,4,5,...,8。在python中,用range(3,9)表示。

for log10count in range(3,9) :
    count = 10**log10count
    # Rest of your code goes here

一位经验丰富的python程序员可能不会对上述事情感到畏缩,但会说有更好的方法。更好的方法从python map函数开始,以python列表推导结束。 map函数接受一个函数,一个 iterable (或一组 iterables ; map是一个非常强大的工具)作为参数。映射的结果是通过将函数应用于 iterable 的每个元素而形成的列表。例如:

def pow10 (n) :
    return 10**n
for count in map (pow10, range(3,9))
    # Rest of your code goes here

以上内容将其余代码应用于列表[1000, 10000, 100000, 1000000, 10000000, 100000000]。上面有一些问题。首先,我必须定义最有可能在其他任何地方都不会使用的函数pow10。 Python有一个匿名函数的概念,使用lambda关键字实现。我们可以通过使用lambda表达式来消除该函数pow10

for count in map (lambda n : 10**n, range(3,9))
    # Rest of your code goes here

我们仍未解决所有问题。一个问题是使用maplambda表达式,虽然当然是pythonic,但可能有点过于深奥。另一个问题是map返回一个列表。使用仅在需要时生成值的生成器会更好。围绕这两个问题的方法是python的列表理解的概念。列表推导也使用匿名函数,但lambda是隐含的。将列表推导视为map的更紧凑和易于理解的版本。除了映射之外,列表推导还可以在应用匿名映射之前过滤掉事物。列表理解非常强大。这是使用列表理解的程序的开始:

for count in (10**n for n in range(3,9)) :
    # Rest of your code goes here