在 python 中查找随机列表的浮点平均值
Finding float average of random list in python
我查看了几个网站、书籍和文档,但我无法弄清楚我做错了什么。我尝试寻求帮助作为最后的手段,这样我就可以自己学习,但是我花了太长时间试图弄清楚这个问题,而且我确信我做错的事情非常简单,但是我我正在学习。代码每次为 运行 时都会产生一个不同的结果。该代码产生以下错误:
26.8
追溯(最近一次通话):
文件 "main.py",第 7 行,位于
tot = sum(运行d)/len(运行d)
类型错误:'float' 对象不可迭代
import random
for x in range (10000):
rand = random.uniform(10, 100)
print(round(rand, 1))
tot = sum(rand)/len(rand)
print (round(tot, 1))
在 sum 函数中,您必须解析一个可迭代对象,但您解析的是一个浮点对象。
为避免此错误,您应该将最后两行放在 for 循环之外,并将 rand
附加到列表中。我不知道这是不是你想做的,但它告诉你如何使用 sum
:
import random
l = []
for x in range(10000):
rand = random.uniform(10, 100)
l.append(rand)
print(round(rand, 1))
tot = sum(l)/len(l)
print(round(tot, 1))
您实际上并不是在生成列表,而是在生成单个值。
您真的要在获得最终结果的过程中打印出 10000 个值吗?
如果答案是"no!",那么你的代码可以简化为:
import random
N = 10000
print(round(sum(random.uniform(10, 100) for _ in range(N)) / N, 1))
或者,如果您更愿意将其分解一些以提高可读性:
import random
N = 10000
total = sum(random.uniform(10, 100) for _ in range(N))
average = total / N
print(round(average, 1))
如果这超出了您所学的范围,您可以在初始化为零的循环外创建 total
,在遍历循环时用每个新值更新它,然后计算最终答案:
import random
N = 10000
total = 0.0
for _ in range(N): # use '_' instead of x, since x was unused in your prog
total += random.uniform(10, 100)
average = total / N
print(round(average, 1))
这避免了为包含 10000 个值的列表浪费存储空间,并避免了您还不熟悉的 append()
。当然,如果您稍后出于其他目的需要这 10000 个值,则需要将它们隐藏在列表中:
import random
N = 10000
l = [random.uniform(10, 100) for _ in range(N)]
total = sum(l)
print(round(total / N, 1))
附录
只是为了好玩,你也可以递归地这样做:
import random
def sum_of_rands(n):
if n > 1:
half_n = n // 2
return sum_of_rands(half_n) + sum_of_rands(n - half_n)
elif n == 1:
return random.uniform(10, 100)
N = 10000
print(round(sum_of_rands(N) / N, 1))
print(sum_of_rands(0)) # returns None because nothing is being summed
在每个递归调用中将问题分成两半(平均)使堆栈保持为 O(log N)。
我实际上建议您坚持使用列表理解或循环,但我想向您展示有很多不同的方法可以得到相同的结果。
我查看了几个网站、书籍和文档,但我无法弄清楚我做错了什么。我尝试寻求帮助作为最后的手段,这样我就可以自己学习,但是我花了太长时间试图弄清楚这个问题,而且我确信我做错的事情非常简单,但是我我正在学习。代码每次为 运行 时都会产生一个不同的结果。该代码产生以下错误: 26.8 追溯(最近一次通话): 文件 "main.py",第 7 行,位于 tot = sum(运行d)/len(运行d) 类型错误:'float' 对象不可迭代
import random
for x in range (10000):
rand = random.uniform(10, 100)
print(round(rand, 1))
tot = sum(rand)/len(rand)
print (round(tot, 1))
在 sum 函数中,您必须解析一个可迭代对象,但您解析的是一个浮点对象。
为避免此错误,您应该将最后两行放在 for 循环之外,并将 rand
附加到列表中。我不知道这是不是你想做的,但它告诉你如何使用 sum
:
import random
l = []
for x in range(10000):
rand = random.uniform(10, 100)
l.append(rand)
print(round(rand, 1))
tot = sum(l)/len(l)
print(round(tot, 1))
您实际上并不是在生成列表,而是在生成单个值。 您真的要在获得最终结果的过程中打印出 10000 个值吗?
如果答案是"no!",那么你的代码可以简化为:
import random
N = 10000
print(round(sum(random.uniform(10, 100) for _ in range(N)) / N, 1))
或者,如果您更愿意将其分解一些以提高可读性:
import random
N = 10000
total = sum(random.uniform(10, 100) for _ in range(N))
average = total / N
print(round(average, 1))
如果这超出了您所学的范围,您可以在初始化为零的循环外创建 total
,在遍历循环时用每个新值更新它,然后计算最终答案:
import random
N = 10000
total = 0.0
for _ in range(N): # use '_' instead of x, since x was unused in your prog
total += random.uniform(10, 100)
average = total / N
print(round(average, 1))
这避免了为包含 10000 个值的列表浪费存储空间,并避免了您还不熟悉的 append()
。当然,如果您稍后出于其他目的需要这 10000 个值,则需要将它们隐藏在列表中:
import random
N = 10000
l = [random.uniform(10, 100) for _ in range(N)]
total = sum(l)
print(round(total / N, 1))
附录
只是为了好玩,你也可以递归地这样做:
import random
def sum_of_rands(n):
if n > 1:
half_n = n // 2
return sum_of_rands(half_n) + sum_of_rands(n - half_n)
elif n == 1:
return random.uniform(10, 100)
N = 10000
print(round(sum_of_rands(N) / N, 1))
print(sum_of_rands(0)) # returns None because nothing is being summed
在每个递归调用中将问题分成两半(平均)使堆栈保持为 O(log N)。
我实际上建议您坚持使用列表理解或循环,但我想向您展示有很多不同的方法可以得到相同的结果。