使用嵌套循环生成风寒表
我正在写一个程序,用来打印一个包含风寒指数的表格。每个风寒值都应该对应一个特定的行和列。
def main():
windSpeed = 0
temp = 0
windChill = 35.74 + (0.6215 * temp) - 35.75 * (windSpeed ** 0.16) \
+ 0.4275 * temp * (windSpeed ** 0.16)
# table frame, temps
for temp in range(-20, 70, 10):
print 2 * " ", temp,
print "\n", " " * 2, "-" * 51
#table frame, speeds
for windSpeed in range (0, 35, 5):
print windSpeed
main()
这样就会产生:
-20 -10 0 10 20 30 40 50 60
---------------------------------------------------
0
5
10
15
20
25
30
显然,最难的部分是实际打印出风寒值。我已经对代码进行了很多尝试,但它只打印出第一个风寒值,以及在程序开始时定义的系数值0和0。
2 个回答
1
你需要遍历所有的温度和风速值,每次都重新计算风寒指数。一个不错的方法是把风寒指数重新定义为一个函数。为了让表格打印出来时间隔合适,你可以使用字符串格式化。
def main():
def wind_chill(temp, wind_speed):
return 35.74 + (0.6215 * temp) - 35.75 * (wind_speed ** 0.16) \
+ 0.4275 * temp * (wind_speed ** 0.16)
heading = ' '
for temp in range(-20, 70, 10):
heading += "{:>7d}".format(temp)
print heading + "\n " + "-" * 62
for wind_speed in range (0, 35, 5):
output_line = "{:>2d}".format(wind_speed)
for temp in range(-20, 70, 10):
output_line += "{:>7.1f}".format(wind_chill(temp, wind_speed))
print output_line
main()
另外,你可以先把所有的数据放在一个二维数组里(就是一个列表里面再放列表),然后再用一个长的格式字符串把它打印出来。(这会用到sum
,把列表里的列表合并成一个长的序列。)
def main():
temps = range(-20, 70, 10)
winds = range(0, 35, 5)
chill = [[w] + [35.74 + .6215 * t - 35.75 * w**.16 + .4275 * t * w**.16
for t in temps] for w in winds]
rows = len(winds)
cols = len(temps)
print (' ' + '{:7d}' * cols + '\n ' + '-' * cols * 7
+ ('\n{:2d}' + '{:7.1f}' * cols) * rows).format(*sum(chill, temps))
1
因为已经打印出来的内容无法再修改,所以你需要在打印每一行表格的同时计算风寒指数。与其在每一行中重复写那些比较长的温度和风速的计算公式,不如创建一个单独的函数来计算这个值,然后用这个函数的名字多次调用,这样会更简洁。
Python自带的字符串方法format()
让你以想要的方式显示所有计算的数据变得相对简单,所以花时间去了解它的用法是非常值得的。
下面的代码就是这样做的,同时也尽量遵循了PEP 8 - Python代码风格指南。
def wind_chill(temp, wind_speed):
""" Compute wind chill given temperature and wind speed if the
temperature is 50 degrees Fahrenheit or less and the wind speed is
above 3 mph, otherwise return 'nan' (not-a-number) because it's an
undefined quantity in those situations.
"""
return (35.74 + (0.6215 * temp) - 35.75 * (wind_speed ** 0.16)
+ 0.4275 * temp * (wind_speed ** 0.16)
if temp <= 50 and wind_speed > 3 else
float('nan'))
def main():
# print table header
temps = xrange(-20, 70, 10)
num_temps = len(temps)
data = [" "] + [temp for temp in temps]
print ("{:3s}" + num_temps * " {:5d}").format(*data)
data = [" "] + num_temps * [5 * "-"]
print ("{:3s}" + num_temps * " {:5s}").format(*data)
# print table rows
row_format_string = "{:3d}" + num_temps * " {:5.1F}"
for wind_speed in xrange(0, 35, 5):
data = [wind_speed] + [wind_chill(temp, wind_speed) for temp in temps]
print row_format_string.format(*data)
main()
输出结果:
-20 -10 0 10 20 30 40 50 60
----- ----- ----- ----- ----- ----- ----- ----- -----
0 NAN NAN NAN NAN NAN NAN NAN NAN NAN
5 -34.0 -22.3 -10.5 1.2 13.0 24.7 36.5 48.2 NAN
10 -40.7 -28.3 -15.9 -3.5 8.9 21.2 33.6 46.0 NAN
15 -45.0 -32.2 -19.4 -6.6 6.2 19.0 31.8 44.6 NAN
20 -48.2 -35.1 -22.0 -8.9 4.2 17.4 30.5 43.6 NAN
25 -50.8 -37.5 -24.1 -10.7 2.6 16.0 29.4 42.8 NAN
30 -53.0 -39.4 -25.9 -12.3 1.3 14.9 28.5 42.0 NAN