我们列出了10点坐标。 x和y如下:
注意:这里我们不使用numpy.array迭代x,y和br的列表,因为在不久的将来,我会将它复制到Fortran77中。
x = [7., -6., 7., -7., 8., 9., 5., 4., -5., 0.]
for i, x[i] in enumerate(x):
print 'The values of x =', x[i]
y = [3., 6., 3., 9., 1., 9., -2., 0., 3., 7.]
for i, y[i] in enumerate(y):
print 'The values of y =', y[i]
br = [1., 2., 8., 0., 7., 9., 6., 9., 7., 4.]
for i, br[i] in enumerate(br):
print 'brightness = ',br[i]
注意:rad_cut是圆的半径(r ^ 2 = x ^ 2 + y ^ 2) rad_cut = input(“请提供rad_cut的值:”)
br_total = 0
for i in xrange(0,10):
if x[i]**0.5 + y[i]**0.5 < rad_cut:
br_total += br[i]
print 'The total brightness = ', br_total
我遇到的问题如下:
in <module>
if x[i]**0.5 + y[i]**0.5 < rad_cut:
ValueError: negative number cannot be raised to a fractional power
如果有人能帮我解决这个问题,我将不胜感激。我试图使用复数,因为可迭代列表中的负数x[i+0j]**0.5 + y[i+0j]**0.5 < rad_cut:
但它不起作用。
答案 0 :(得分:3)
如评论中所述,您需要将这些x&amp; y值,而不是取其平方根。
这是编写程序的更多Pythonic方法。此代码适用于Python 2.6及更高版本,它也可以在Python 3上正常运行。
主要更改是它使用sum()
函数中的generator expression来添加相应的br
值。
#!/usr/bin/env python
from __future__ import print_function
x = [7., -6., 7., -7., 8., 9., 5., 4., -5., 0.]
y = [3., 6., 3., 9., 1., 9., -2., 0., 3., 7.]
br = [1., 2., 8., 0., 7., 9., 6., 9., 7., 4.]
print(' x y br')
for i, (xi, yi, bri) in enumerate(zip(x, y, br)):
print('{0}: {1:4.1f} {2:4.1f} {3:4.1f}'.format(i, xi, yi, bri))
rad_cut = input("Please provide a value of rad_cut: ")
rad_cut = float(rad_cut)
rad_sq = rad_cut ** 2
br_total = sum(bri for xi, yi, bri in zip(x, y, br)
if xi**2 + yi**2 < rad_sq)
print('The total brightness = {0:.1f}'.format(br_total))
典型输出
x y br
0: 7.0 3.0 1.0
1: -6.0 6.0 2.0
2: 7.0 3.0 8.0
3: -7.0 9.0 0.0
4: 8.0 1.0 7.0
5: 9.0 9.0 9.0
6: 5.0 -2.0 6.0
7: 4.0 0.0 9.0
8: -5.0 3.0 7.0
9: 0.0 7.0 4.0
Please provide a value of rad_cut: 10
The total brightness = 44.0
注意:在Python 2中使用raw_input()
而不是input()
会更好,因为input()
的Python 2版本在输入的数据上使用了潜在的dangerous eval()
function; {3}的Python 3版本与Python 2的input()
相同。