我该如何修复此程序,使其不会 return 'unknown' 用于负输入 (boiling_point)
how can I fix this program so it won't return 'unknown' for negative input (boiling_point)
这是我要解决的问题:
*python 编写一个函数,给定从 material 到沸点的映射以及沸点温度,将 return :
- 沸腾对应的material如果在5%以内相差
- 'UNKNOWN'否则
函数签名应如下所示:boiling_material(boiling_map, boiling_point)
一个例子boiling_map:给定输入:
'丁烷':_0.5,
'copper' : 1187,
'Gold' : 2660,
'Mercury' : 357,
'Methane':_161.7,
'Nonane': 150.8,
'Silver' : 2197,
'water': 100}*
具有上述输入的程序示例 运行:
输入沸点 > 359
最近的 material : Mercury
输入沸点 > 2000
最近的material:未知
我试图解决它,当输入为正数时它 return 输出正确,但当输入为负数时它仅 return 输出 'unknown'。
示例:
输入沸点 > -0.475
预期最接近 material :丁烷
实际输出:未知
这是我当前的代码。
boiling_map=dict()
boiling_map['Butane']=-0.5
boiling_map['Copper']=1187
boiling_map['Gold']=2660
boiling_map['Mercury']=357
boiling_map['Methane']=-161.7
boiling_map['Nonane']=150.8
boiling_map['water']=100
def boiling_material(boiling_map,boiling_point):
closest='unknown'
for material in boiling_map:
if abs(boiling_map[material]) >=abs(boiling_point-(boiling_point*5//100)) and abs(boiling_map[material]-boiling_point)<=abs(boiling_point+(boiling_point*5//100)) :
closest=material
return closest
print(boiling_material(boiling_map,359))
print(boiling_material(boiling_map,-0.475))
print(boiling_material(boiling_map,0))
你可以这样做。下面是使用 Python 3.10.4,3.10 以下的任何东西都不支持使用 match
关键字。请注意,对于某些测试温度,您会在某些温标上获得已知结果,但在其他温标上则不然。请注意,此处的结果要么是“未知”,要么是候选列表。
添加了 material 和一些测试温度以使事情变得有趣。
from enum import Enum
import sys;
class TemperatureScale(Enum):
CELCIUS = 1
KELVIN = 2
FAHRENHEIT = 3
# boiling points are in kelvin
materials = { "Butane": 272.65
, "Copper": 1460.15
, "Gold": 2933.15
, "Mercury": 630.15
, "Methane": 111.45
, "Nonane": 423.95
, "Water": 373.15
, "Propyl Alcohol": 370.65
}
def kelvin_to_scale(temp, scale):
match scale:
case TemperatureScale.KELVIN:
return temp
case TemperatureScale.CELCIUS:
return temp - 273.15
case TemperatureScale.FAHRENHEIT:
return 1.8 * (temp - 273.15) + 32
case _:
raise Exception('unknown scale')
def scale_to_kelvin(temp, scale):
match scale:
case TemperatureScale.KELVIN:
return temp
case TemperatureScale.CELCIUS:
return temp + 273.15
case TemperatureScale.FAHRENHEIT:
return (temp*5//9)+459.67
case _:
raise Exception('unknown scale')
def test_material(boiling_point, scale = TemperatureScale.KELVIN):
print(f'Test temperature: {boiling_point} {scale}')
candidates = []
for material in materials:
bp = kelvin_to_scale(materials[material], scale)
margin = abs(boiling_point)*5//100
print(f'Testing {material} using {bp} +/- {margin}:\t{bp - margin} <= {boiling_point} < {bp + margin}')
if (bp - margin <= boiling_point) and (bp + margin > boiling_point):
candidates += [ material ]
return candidates
# test values are in celcius
test_values = [ 2801, 359, -0.475, 0, 95 ]
for test_value in test_values:
kelvin_value = scale_to_kelvin(test_value, TemperatureScale.CELCIUS)
for scale in [ TemperatureScale.CELCIUS, TemperatureScale.KELVIN, TemperatureScale.FAHRENHEIT ]:
print(test_material(kelvin_to_scale(kelvin_value, scale), scale) or 'unknown')
这是我要解决的问题:
*python 编写一个函数,给定从 material 到沸点的映射以及沸点温度,将 return :
- 沸腾对应的material如果在5%以内相差
- 'UNKNOWN'否则
函数签名应如下所示:boiling_material(boiling_map, boiling_point)
一个例子boiling_map:给定输入: '丁烷':_0.5, 'copper' : 1187, 'Gold' : 2660, 'Mercury' : 357, 'Methane':_161.7, 'Nonane': 150.8, 'Silver' : 2197, 'water': 100}*
具有上述输入的程序示例 运行:
输入沸点 > 359 最近的 material : Mercury
输入沸点 > 2000 最近的material:未知
我试图解决它,当输入为正数时它 return 输出正确,但当输入为负数时它仅 return 输出 'unknown'。 示例: 输入沸点 > -0.475 预期最接近 material :丁烷 实际输出:未知
这是我当前的代码。
boiling_map=dict()
boiling_map['Butane']=-0.5
boiling_map['Copper']=1187
boiling_map['Gold']=2660
boiling_map['Mercury']=357
boiling_map['Methane']=-161.7
boiling_map['Nonane']=150.8
boiling_map['water']=100
def boiling_material(boiling_map,boiling_point):
closest='unknown'
for material in boiling_map:
if abs(boiling_map[material]) >=abs(boiling_point-(boiling_point*5//100)) and abs(boiling_map[material]-boiling_point)<=abs(boiling_point+(boiling_point*5//100)) :
closest=material
return closest
print(boiling_material(boiling_map,359))
print(boiling_material(boiling_map,-0.475))
print(boiling_material(boiling_map,0))
你可以这样做。下面是使用 Python 3.10.4,3.10 以下的任何东西都不支持使用 match
关键字。请注意,对于某些测试温度,您会在某些温标上获得已知结果,但在其他温标上则不然。请注意,此处的结果要么是“未知”,要么是候选列表。
添加了 material 和一些测试温度以使事情变得有趣。
from enum import Enum
import sys;
class TemperatureScale(Enum):
CELCIUS = 1
KELVIN = 2
FAHRENHEIT = 3
# boiling points are in kelvin
materials = { "Butane": 272.65
, "Copper": 1460.15
, "Gold": 2933.15
, "Mercury": 630.15
, "Methane": 111.45
, "Nonane": 423.95
, "Water": 373.15
, "Propyl Alcohol": 370.65
}
def kelvin_to_scale(temp, scale):
match scale:
case TemperatureScale.KELVIN:
return temp
case TemperatureScale.CELCIUS:
return temp - 273.15
case TemperatureScale.FAHRENHEIT:
return 1.8 * (temp - 273.15) + 32
case _:
raise Exception('unknown scale')
def scale_to_kelvin(temp, scale):
match scale:
case TemperatureScale.KELVIN:
return temp
case TemperatureScale.CELCIUS:
return temp + 273.15
case TemperatureScale.FAHRENHEIT:
return (temp*5//9)+459.67
case _:
raise Exception('unknown scale')
def test_material(boiling_point, scale = TemperatureScale.KELVIN):
print(f'Test temperature: {boiling_point} {scale}')
candidates = []
for material in materials:
bp = kelvin_to_scale(materials[material], scale)
margin = abs(boiling_point)*5//100
print(f'Testing {material} using {bp} +/- {margin}:\t{bp - margin} <= {boiling_point} < {bp + margin}')
if (bp - margin <= boiling_point) and (bp + margin > boiling_point):
candidates += [ material ]
return candidates
# test values are in celcius
test_values = [ 2801, 359, -0.475, 0, 95 ]
for test_value in test_values:
kelvin_value = scale_to_kelvin(test_value, TemperatureScale.CELCIUS)
for scale in [ TemperatureScale.CELCIUS, TemperatureScale.KELVIN, TemperatureScale.FAHRENHEIT ]:
print(test_material(kelvin_to_scale(kelvin_value, scale), scale) or 'unknown')