我是使用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
答案 0 :(得分:0)
我认为我需要做的是让外循环确定在" 1000"开始时添加多少次。从那里上升十倍的倍数(1000,10000,100000等等)。
换句话说,您的问题是如何撰写与range(1000, 1000000000)
类似的内容,而不是为您提供所有值1000
,1001
,...,{ {1}},它只会为您提供1000000000
,1000
等,对吧?所以,就像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
我们仍未解决所有问题。一个问题是使用map
和lambda
表达式,虽然当然是pythonic,但可能有点过于深奥。另一个问题是map
返回一个列表。使用仅在需要时生成值的生成器会更好。围绕这两个问题的方法是python的列表理解的概念。列表推导也使用匿名函数,但lambda
是隐含的。将列表推导视为map
的更紧凑和易于理解的版本。除了映射之外,列表推导还可以在应用匿名映射之前过滤掉事物。列表理解非常强大。这是使用列表理解的程序的开始:
for count in (10**n for n in range(3,9)) :
# Rest of your code goes here