Merkwürdiges Verhalten einer eigenen Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cator Canulis
User
Beiträge: 3
Registriert: Samstag 6. Dezember 2014, 18:57

Hallo allerseits,

ich habe heute mit dem Python-Programmieren angefangen. Dies ist meine erste "eigene" Funktion (eigentlich habe ich sie hier http://code.activestate.com/recipes/652 ... se-number/ geklaut).
So schaut sie aus:

Code: Alles auswählen

def base10to12(zahl):
  try:
    zahl = int(zahl)
  except:
    return ""
#
  ziffernliste={10:'z', 11:'e'}  # Festlegen von Zeichen für die Ziffern "zehn"
                                 # und "elf".
  ausgabe=''  # Anelgen einer neuen Ausgabevariable.
  aktuelle_zahl=zahl  # Zunächst soll die übergebene Zahl "aktuell" bearbeitet
# werden.
  while aktuelle_zahl!=0:  # So lange die aktuell zu bearbeitende Zahl nicht
# Null ist…
    rest=(aktuelle_zahl%12)  # Bilde den Rest bei Teilung durch 12. Als mögliche
# Ergebnisse kommen alle Zahlen von 1 bis 11 infrage.
    if 12>rest>9:  # Gleichbedeutend mit: "Wenn rest 10 oder 11 ist."
      restziffer=ziffernliste[rest]  # Ziehe das Zahlensymbol aus der
# ziffernliste.
    else:  # Ansonsten …
      restziffer=str(rest)  # … mache einfach einen String aus der Restziffer.
    ausgabe=restziffer+ausgabe  # Hänge die gerade bestimmte Ziffer an den
# Ergebnisstring.
    aktuelle_zahl=aktuelle_zahl/12  # Führe eine erneute Teilung durch.
  return ausgabe
Ich verwende sie in folgendem Skript:

Code: Alles auswählen

#!/usr/bin/env python3
# coding: utf8
#
#
#
### Vorarbeit ###
from datetime import datetime
from math import floor
#
#
## Einlesen der Funktionsdatei ##
import sys  # Das sys-Modul stellt Informationen in Konstanten, Funktionen und
# Methoden über den Python-Interpreter zur Verfügung.
sys.path.append("/usr/local/lib/")  # Hänge mein eigenes Libraryverzeichnis an.
from func import base10to12 # Importiere von dort aus die benötigte Funktion.
#
#
## Testen ob ein Datum übergeben wurde ##
#TODO
#
#
## Berechnung der Differenz ##
#TODO: Schutzfunktion, falls dem Skript kein korrektes Datumsformat übergeben
# wurde.
d1 = datetime.strptime(sys.argv[1], "%d.%m.%Y")  # Datum aus übergebenem
# Argument auslesen.
d2 = datetime.strptime("10.09.2007", "%d.%m.%Y")  # "Stunde Null" des
# Unionskalenders.
diff=(d1 - d2).days  # Eigentliche Differenzberechnung.
#
#
## Umrechnung uns Unionsformat ##
union_jahr=floor(diff/360)
union_tag=diff%360
print(union_jahr)
print(union_tag)
print(base10to12(union_jahr))
print(base10to12(union_tag))
Führe ich dieses Skript in der BASH aus, erhalte ich folgenden Output (für: "markus@theseus ~ $ Software/EigeneProgramme/uniodate.py 6.12.2014")

Code: Alles auswählen

7
124
1e-3231.5e-3221.774e-3212.1294e-3202.55536e-3193.066413e-3183.679694e-3174.41563276e-3165.29875933e-3156.3585111933e-3147.6302134322e-3139.156256118647e-3121.0987507342379e-3101.31850088108546e-3091.582201057302556e-3081.898641268763067e-3072.2783695225156803e-3062.7340434270188164e-3053.2808521124225797e-3043.937022534907096e-3034.724427041888515e-3025.6693124502662176e-3016.803174940319461e-3008.163809928383353e-2999.796571914060024e-2981.1755886296872028e-2961.4107063556246434e-2951.692847626749572e-2942.0314171520994866e-2932.437700582519384e-2922.9252406990232606e-2913.510288838827913e-2904.2123466065934955e-2895.054815927912195e-2886.065779113494634e-2877.278934936193561e-2868.734721923432273e-2851.0481666308118728e-2831.2577999569742473e-2821.509359948369097e-2811.8112319380429164e-2802.1734783256514997e-2792.6081739907817997e-2783.1298087889381596e-2773.755770546725791e-2764.506924656070949e-2755.408309587285139e-2746.489971504742166e-2737.7879658056906e-2729.34555896682872e-2711.1214670760194463e-2691.3457604912233356e-2681.6149125894680027e-2671.9378951073616033e-2662.325474128833924e-2652.7905689546007087e-2643.3486827455208505e-2634.0184192946250206e-2624.822103153550025e-2615.786523784260029e-2606.943828541112035e-2598.332594249334443e-2589.999113099201332e-2571.1998935719041598e-2551.4398722862849918e-2541.7278467435419902e-2532.0734160922503882e-2522.4880993107004657e-2512.985719172840559e-2503.582863007408671e-2494.299435608890405e-2485.1593227306684866e-2476.191187276802184e-2467.429424732162621e-2458.915309678595145e-2441.0698371614314174e-2421.283804593717701e-2411.5405655124612413e-2401.8486786149534894e-2392.2184143379441872e-2382.6620972055330247e-2373.19451664663963e-2363.8334199759675556e-2354.600103971161067e-2345.52012476539328e-2336.624149718471936e-2327.948979662166323e-2319.538775594599587e-2301.1446530713519505e-2281.3735836856223407e-2271.6483004227468088e-2261.9779605072961706e-2252.3735526087554047e-2242.848263130506486e-2233.417915756607783e-2224.101498907929339e-2214.921798689515207e-2205.906158427418249e-2197.087390112901899e-2188.504868135482279e-2171.0205841762578735e-2151.2247010115094482e-2141.4696412138113379e-2131.7635694565736054e-2122.1162833478883265e-2112.5395400174659917e-2103.04744802095919e-2093.656937625151028e-2084.3883251501812336e-2075.26599018021748e-2066.319188216260976e-2057.58302585951317e-2049.099631031415805e-2031.0919557237698967e-2011.310346868523876e-2001.572416242228651e-1991.886899490674381e-1982.2642793888092573e-1972.717135266571109e-1963.2605623198853307e-1953.912674783862397e-1944.695209740634876e-1935.634251688761851e-1926.761102026514221e-1918.113322431817065e-1909.735986918180478e-1891.1683184301816572e-1871.4019821162179886e-1861.6823785394615862e-1852.0188542473539036e-1842.4226250968246844e-1832.907150116189621e-1823.488580139427545e-1814.186296167313054e-1805.0235554007756646e-1796.028266480930797e-1787.2339197771169565e-1778.680703732540348e-1761.0416844479048418e-1741.25002133748581e-1731.500025604982972e-1721.8000307259795665e-1712.16003687117548e-1702.5920442454105757e-1693.1104530944926907e-1683.732543713391229e-1674.479052456069474e-1665.374862947283369e-1656.449835536740043e-1647.739802644088052e-1639.287763172905662e-1621.1145315807486793e-1601.3374378968984152e-1591.6049254762780983e-1581.9259105715337178e-1572.3110926858404613e-1562.7733112230085534e-1553.327973467610264e-1543.9935681611323167e-1534.79228179335878e-1525.7507381520305355e-1516.900885782436643e-1508.281062938923971e-1499.937275526708766e-1481.192473063205052e-1461.4309676758460622e-1451.7171612110152746e-1442.0605934532183294e-1432.4727121438619955e-1422.9672545726343945e-1413.5607054871612737e-1404.272846584593528e-1395.127415901512234e-1386.152899081814681e-1377.383478898177617e-1368.86017467781314e-1351.0632209613375768e-1331.2758651536050922e-1321.5310381843261107e-1311.8372458211913327e-1302.2046949854295992e-1292.645633982515519e-1283.174760779018623e-1273.809712934822348e-1264.5716555217868176e-1255.485986626144181e-1246.583183951373017e-1237.899820741647621e-1229.479784889977146e-1211.1375741867972576e-1191.365089024156709e-1181.6381068289880507e-1171.9657281947856607e-1162.358873833742793e-1152.8306486004913518e-1143.396778320589622e-1134.0761339847075467e-1124.891360781649056e-1115.869632937978868e-1107.043559525574641e-1098.45227143068957e-1081.0142725716827484e-1061.217127086019298e-1051.4605525032231576e-1041.7526630038677892e-1032.103195604641347e-1022.5238347255696165e-1013.0286016706835396e-1003.6343220048202477e-994.361186405784297e-985.233423686941156e-976.2801084243293876e-967.536130109195265e-959.043356131034318e-941.0852027357241181e-921.3022432828689417e-911.56269193944273e-901.875230327331276e-892.250276392797531e-882.7003316713570375e-873.240398005628445e-863.888477606754134e-854.666173128104961e-845.5994077537259536e-836.719289304471144e-828.063147165365372e-819.675776598438447e-801.1610931918126136e-781.3933118301751363e-771.6719741962101636e-762.0063690354521961e-752.4076428425426353e-742.8891714110511623e-733.4670056932613945e-724.160406831913673e-714.992488198296408e-705.990985837955689e-697.189183005546827e-688.627019606656192e-671.0352423527987431e-651.2422908233584918e-641.4907489880301902e-631.788898785636228e-622.1466785427634737e-612.5760142513161686e-603.0912171015794023e-593.7094605218952826e-584.451352626274339e-575.341623151529207e-566.409947781835048e-557.691937338202058e-549.230324805842469e-531.1076389767010962e-511.3291667720413155e-501.5950001264495786e-491.9140001517394944e-482.2968001820873933e-472.7561602185048722e-463.307392262205847e-453.9688707146470164e-444.76264485757642e-435.715173829091704e-426.858208594910044e-418.229850313892053e-409.875820376670465e-391.1850984452004558e-371.422118134240547e-361.7065417610886565e-352.0478501133063877e-342.457420135967665e-332.948904163161198e-323.5386849957934376e-314.246421994952125e-305.09570639394255e-296.11484767273106e-287.337817207277272e-278.805380648732725e-261.056645677847927e-241.2679748134175124e-231.521569776101015e-221.825883731321218e-212.1910604775854615e-202.6292725731025537e-193.1551270877230642e-183.786152505267677e-174.543383006321213e-165.452059607585455e-156.542471529102546e-147.850965834923055e-139.421159001907666e-121.13053908022892e-101.356646896274704e-091.6279762755296448e-081.9535715306355737e-072.3442858367626884e-062.813143004115226e-050.000337577160493827140.0040509259259259260.048611111111111110.58333333333333347
Traceback (most recent call last):
  File "Software/EigeneProgramme/uniodate.py", line 38, in <module>
    print(base10to12(union_tag))
  File "/usr/local/lib/func.py", line 25, in base10to12
    restziffer=ziffernliste[rest]  # Ziehe das Zahlensymbol aus der
KeyError: 10.333333333333334
Wenn ich die Pythonkonsole öffne, und das Skript Zeile für Zeile ausführen lasse, rechnet "base10to12()" Zahlen korrekt um.

Was mache ich hier falsch?

Viele Grüße und besten Dank im Voraus,
Markus
BlackJack

@Cator Canulis: Ich vermute mal Du verwendest zum testen Python 2 und dann beim ausführen des Programms Python 3. In Python 3 hat sich die Bedeutung des Divisionsoperators bei ganzen Zahlen geändert und das alte Verhalten hat einen eigenen Operator bekommen: ``//`` statt ``/``.
Cator Canulis
User
Beiträge: 3
Registriert: Samstag 6. Dezember 2014, 18:57

Vielen Dank für den Tipp! Es war tatsächlich so, dass die Konsole Python 2.7.6, das Skript aber 3.4.0 nutzt. Leider hat das ändern von "diff/360" in "diff/360" nichts gebracht.

Ich habe daher die Einleitungszeile auf

Code: Alles auswählen

#!/usr/bin/env python
geändert. Das Programm funktioniert jetzt erwartungsgemäß. Zunächst reicht mir Python 2.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Cator Canulis: das Problem liegt ja auch in dieser Zeile:

Code: Alles auswählen

aktuelle_zahl=aktuelle_zahl/12
Antworten