我想得到以下简单的碳排放计算用最毕达通/直截了当的方式。
FUEL_FACTORS = {'diesel': {'energy_factor': 38.6,
'co2_emission_factor': 69.9,
'ch4_emission_factor': 0.1,
'n2o_emission_factor': 0.5
},
'petrol': {'energy_factor': 34.2,
'co2_emission_factor': 67.4,
'ch4_emission_factor': 0.5,
'n2o_emission_factor': 1.8
},
'avgas': {'energy_factor': 33.1,
'co2_emission_factor': 67.0,
'ch4_emission_factor': 0.05,
'n2o_emission_factor': 0.7}
}
FIRE_FACTORS = {'gwp_co2': 1,
'gwp_ch4': 25,
'gwp_n2o': 298,
'ch4_co2_mass_ratio': 7.182e-3,
'n2o_co2_mass_ratio': 1.329e-5,
}
def get_fuel_emission_factor(fuel):
"""Get fuel total CO2 emission factor."""
factors = FUEL_FACTORS[fuel]
energy_f = factors['energy_factor']
fuel_emission_factor = 0
for i in ['co2', 'ch4', 'n2o']:
gas_emission_factor = factors[i + '_emission_factor']
fuel_emission_factor += energy_f * gas_emission_factor * 1e-3
return fuel_emission_factor
def fuel_to_co2(fuel, quantity):
"""Get total tCO2 emission by kL of fuel."""
fuel_emission_factor = get_fuel_emission_factor(fuel)
return fuel_emission_factor * quantity
def burned_c_to_co2(tC):
"""Get CH4 and N2O emissions in tCO2 from tonnes of C burned"""
ch4_emissions = tC * FIRE_FACTORS['gwp_ch4'] * FIRE_FACTORS['ch4_co2_mass_ratio']
n2o_emissions = tC * FIRE_FACTORS['gwp_n2o'] * FIRE_FACTORS['n2o_co2_mass_ratio']
return ch4_emissions + n2o_emissions
fuel_emissions = fuel_to_co2('petrol', 2.7395)
fire_emissions = burned_c_to_co2(5.74)发布于 2019-12-20 06:53:56
为温室气体GHG定义一个常数,以避免在单独的函数中对它们进行硬编码:
GHG = ('co2', 'ch4', 'n2o') # greenhouse gasesget_fuel_emission_factor函数带累积的for循环简明地替换为生成器表达式上的内置sum函数: def get_fuel_emission_factor(燃料):“”获取燃料总CO2排放因子“”。因子= FUEL_FACTORS燃料,燃料返回和(温室气体中气体的因子能量_因子的*F‘{gas}_发射量_因子’/ 1000 )fuel_to_co2函数内插变量技术可以应用于: def fuel_to_co2(燃料,数量):“通过kL获取燃料的总tCO2排放量”。返回get_fuel_emission_factor(燃料)*数量发布于 2019-12-20 10:10:24
我看到的最大问题是您的函数严重依赖dicts的结构,这可能最终不是一个问题,例如,如果这些函数是脚本的一部分,您不希望在将来更改或重复使用。如果您想要改进,我的建议是使用TDD,因为您的功能非常适合TDD。当您循环通过TDD步骤时,您将反复改进您的设计。我认为这将是一项有价值的运动。最后,您可以比较这两种解决方案,并判断它们的不同之处。我建议你在做最后的比较之前先把代码放在视线之外一段时间。
https://codereview.stackexchange.com/questions/234365
复制相似问题