Mal mit den Daten heraus gezogen und der Formel nur *einmal* im Code (Python 2):
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from functools import partial
ZONE_VALUES = [
(0.65, 0.19, 0.91, True), (0.85, 0.25, 1.91, True), (1.1, 0.31, 2.91, False)
]
ZONE_A_FACTOR = 1.25
def _calculate_snow_load(minimum, base, factor, a_factor, altitude):
return max(
minimum, (base + factor * ((altitude + 140) / 740)**2) * a_factor
)
def _create_zone_functions():
result = dict()
for i, (minimum, base, factor, has_a_zone) in enumerate(ZONE_VALUES, 1):
name = str(i)
result[name] = partial(_calculate_snow_load, minimum, base, factor, 1)
if has_a_zone:
result[name + 'a'] = partial(
_calculate_snow_load,
round(minimum * ZONE_A_FACTOR, 2),
base,
factor,
ZONE_A_FACTOR
)
return result
NAME_TO_ZONE_FUNCTION = _create_zone_functions()
def calculate_snow_load(zone_name, altitude):
return NAME_TO_ZONE_FUNCTION[zone_name](altitude)
def ask_zone_name():
prompt = 'Welche Zone ({0}): '.format(
', '.join(sorted(NAME_TO_ZONE_FUNCTION))
)
while True:
result = raw_input(prompt)
if result in NAME_TO_ZONE_FUNCTION:
return result
else:
print('Fehler! Bitte eine der vorhandenen Zonen wählen.')
def ask_altitude():
while True:
try:
result = float(raw_input('Höhe über dem Meeresspiegel (in m): '))
except ValueError:
print('Fehler! Bitte eine Zahl eingeben.')
else:
if result < 0:
print('Fehler! Die Höhe muss eine positive Zahl sein.')
else:
return result
def main():
zone_name = ask_zone_name()
altitude = ask_altitude()
snow_load = calculate_snow_load(zone_name, altitude)
print(
'Der sk-Wert der Zone {0} beträgt {1:.2f} kN/m²'.format(
zone_name, snow_load
)
)
if __name__ == '__main__':
main()