Mein erstes kleines Programm...

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.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Code: Alles auswählen

    [Liste.append(Elemente)
     for Elemente in Zahlen
     if not Liste.count(Elemente)]
Da biste durcheinandergekommen. In der LC muss man eben *kein* append machen.

Ich meinte eher Folgendes: nimm wieder deine alte Umwandlungsfunktion ohne den *, und wenn du eine Liste von Strings zu Zahlen machen willst, tust du folgendes:

Code: Alles auswählen

[umwandlung(zahl) for zahl in zahlen]
So ähnlich solltest du die Variablennamen auch vergeben, wie Bj schon schrieb.

Edit: Kann es sein, dass du denkst, LCs wären ein eigener Datentyp? Das ist nicht der Fall, LCs sind ne Technik zum Erstellen normaler Listen.
PS: Die angebotene Summe ist beachtlich.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Üpsilon hat geschrieben:

Code: Alles auswählen

    [Liste.append(Elemente)
     for Elemente in Zahlen
     if not Liste.count(Elemente)]
Da biste durcheinandergekommen. In der LC muss man eben *kein* append machen.

Ich meinte eher Folgendes: nimm wieder deine alte Umwandlungsfunktion ohne den *, und wenn du eine Liste von Strings zu Zahlen machen willst, tust du folgendes:

Code: Alles auswählen

[umwandlung(zahl) for zahl in zahlen]
So ähnlich solltest du die Variablennamen auch vergeben, wie Bj schon schrieb.

Edit: Kann es sein, dass du denkst, LCs wären ein eigener Datentyp? Das ist nicht der Fall, LCs sind ne Technik zum Erstellen normaler Listen.
In VB6 gibt es eine Art Container, und die nennen wir Collection. Dort kann man alle Objekte hinlegen, und diese dann direkt ansprechen. Und da ich den LC wie einen Container betrachte, dachte ich, kann man auf die einzelnen Daten/Objekte innerhalb dieses Containers zugreifen. Demzufolge wollte ich die Objekte in diesem Container einlesen und die entsprechenden Zeichen ersetzen.

Nun zu dir, ich will meine Liste von Strings nicht zu Zahlen machen, sondern, die Zeichenketten einlesen und die entsprechenden Zeichen ersetzen. Ich habe gehofft, dass ich mir diesen Zwischenschritt sparen könnte. Ist ein direkter Weg nicht möglich? Müssen die Strings erst in Zahlen "umgewandelt" werden, ehe man bestimmte Zeichen in einem String durch andere Zeichen ersetzen kann?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sophus hat geschrieben:

Code: Alles auswählen

def Umwandlung(*Parameter):
    Liste = []
    [Liste.append(Elemente)
     for Elemente in Zahlen
     if not Liste.count(Elemente)]
    return Liste 
    
def main():
    Zahl = [
    "5,2",
    "7,0",
    "8.0",
    "2,6"
    ]
    
    Ergebnis = Umwandlung(Zahl)
    print Ergebnis # Ausgabe [['5,2', '7,0', '8.0', '2,6']]

if __name__ == "__main__":
    main()
Einen Paramter Parameter zu nennen ist nicht sinnvoll. Dass es ein Parameter ist, sehe ich daran, dass er syntaktisch an einer Stelle steht, die ihn zum Parameter macht. Wenn ich Code lese will ich aber wissen, was der Parameter im Programm für eine Bedeutung hat. Ein Parameter, der eine Zahl beinhaltet, repräsentiert dann zB. das Alter einer Person. Dann sollte man ihn alter nennen, aber nicht parameter. Übrigens sollte man ihn auch nicht zahl nennen. Denn wenn ich das lese, weiß ich nur den Typ des Parameters, aber nicht, was die Zahl bedeutet. Das Alter? Die Größer einer Person in cm? Den mittleren Abstand der Person von Betelgeuze?

Und der * vor Parameter ... warum steht der da? Das x in def f(*x): beinhaltet ein Tupel, dass die übergebenen Argumente als Elemente hat. In deinem Fall also ein Tupel, dass als erstes (und einziges) Element eine Liste von Strings besitzt. Also das hier:

Code: Alles auswählen

(["5,2", "7,0", "8.0", "2,6"],)
Wenn ich auf das dritte Element der Liste zugreifen möchte, muss ich das folglich so tun:

Code: Alles auswählen

x = Parameter[0][2]
Das Ergebnis ist dann "8.0". Auch das ist übrigens keine Zahl, sondern ein String, der Buchstaben enthält, aus denen zB. die Funktion float() eine Zahl erzeugen kann:

Code: Alles auswählen

>>> type("8.0")
<type 'str'>
>>> float("8.0")
8.0
>>> type(float("8.0"))
<type 'float'>
Als nächstes die List Comprehension (LC). Eine LC benötigt kein append(). Hier zum Vergleich ohne LC:

Code: Alles auswählen

>>> zahl_strings = ["5.2", "7.0", "8.0", "2.6"]
>>> zahlen = []
>>> for each in zahl_strings:
...     print each, ':', type(each)
...
5.2 : <type 'str'>
7.0 : <type 'str'>
8.0 : <type 'str'>
2.6 : <type 'str'>
>>> for each in zahl_strings:
...     zahlen.append(float(each))
...
>>> for each in zahlen:
...     print each, ':', type(each)
...
5.2 : <type 'float'>
7.0 : <type 'float'>
8.0 : <type 'float'>
2.6 : <type 'float'>
Und hier mit LC:

Code: Alles auswählen

>>> zahlen = [float(each) for each in zahl_strings]
>>> for each in zahlen:
...     print each, ':', type(each)
...
5.2 : <type 'float'>
7.0 : <type 'float'>
8.0 : <type 'float'>
2.6 : <type 'float'>
Wenn du die Kommata in den Strings zu Dezimalpunkten umwandeln und danach aus dem Ergebnis eine Zahl zu erzeugenmöchtest, dann kannst du das einfach so machen:

Code: Alles auswählen

>>> zahl_strings = ["5,2", "7,0", "8.0", "2,6"]
>>> zahlen = [float(each.replace(',', '.')) for each in zahl_strings]
>>> for each in zahlen:
...     print each, ':', type(each)
...
5.2 : <type 'float'>
7.0 : <type 'float'>
8.0 : <type 'float'>
2.6 : <type 'float'>
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo pillmuncher, ich habe mich an deinem Beispiel gehalten und es wie folgt umgesetzt (ignorieren wir jetzt mal die sinnlosen Namensgebungen):

Code: Alles auswählen

# -*- coding: cp1252 -*-
def umandeln(Parameter):
    f = [float(Elemente.replace(',', '.')) for Elemente in Parameter]
    for Elemente in f:
          return Elemente

def main():
    Zahlen = [
    "5,2",
    "7,0",
    "8.0",
    "2,6"
    ]
    n = len(Zahlen) # Anzahl der Einträge aus der Liste Zahlen erfahren
    
    Ergebnis = umandeln(Zahlen) # An die Funktion die Zahlen aus der Liste Zahlen übergeben
    Rueckgabe = umandeln(Ergebnis[0-n])   # Da ich nicht nur einen bestimmten Eintrag zurückhaben will,
                                        # sondern so viele, wie in der Liste waren, also benutze ich hier n (hier: 0-4 Einträge - also alle Einträge)
    print Rueckgabe
    
if __name__ == "__main__":
    main()

Fehlermeldungen:
Traceback (most recent call last):
File "D:\Dan\Python\Übung\Calc\Neues Textdokument.py", line 22, in <module>
main()
File "D:\Dan\Python\Übung\Calc\Neues Textdokument.py", line 17, in main
Rueckgabe = umandeln(Ergebnis[n]) # Da ich nicht nur einen bestimmten Eintrag zurückhaben will,
TypeError: 'float' object has no attribute '__getitem__'
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Du erinnerst mich an jemanden, der mal mit mir im Informatik-Wahlfach war. Der war auch so n Kandidat, ey.. :roll:

Wenn in einer Funktion return gemacht wird, dann ist die Funktion fertig gelaufen. Das, was du hier probierst, macht man afaik mit yield. Aber egal. In Wirklichkeit willst du doch die ganze Liste zurückgeben! :|

liste[0-n] macht übrigens etwas völlig anderes, als du denkst. Auch hier willst du die ganze Liste übergeben. :cry:

Lies meine Signatur! :D
PS: Die angebotene Summe ist beachtlich.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Üpsilon hat geschrieben:Du erinnerst mich an jemanden, der mal mit mir im Informatik-Wahlfach war. Der war auch so n Kandidat, ey.. :roll:

Wenn in einer Funktion return gemacht wird, dann ist die Funktion fertig gelaufen. Das, was du hier probierst, macht man afaik mit yield. Aber egal. In Wirklichkeit willst du doch die ganze Liste zurückgeben! :|

liste[0-n] macht übrigens etwas völlig anderes, als du denkst. Auch hier willst du die ganze Liste übergeben.
Verdammt, ich sehe schon was du meinst. Das ich quasi zwei Mal eine Rückgabe erwarte, obwohl die Funktion schon längst fertig ist.

Aber meine Modifkation macht es trotzdem nicht leichter:

Code: Alles auswählen

# -*- coding: cp1252 -*-
def umandeln(Parameter):
    f = [float(Elemente.replace(',', '.')) for Elemente in Parameter]
    for Elemente in f:
          return Elemente

def main():
    Zahlen = [
    "5,2",
    "7,0",
    "8.0",
    "2,6"
    ]
    n = len(Zahlen) # Anzahl der Einträge aus der Liste Zahlen erfahren
    
    Ergebnis = umandeln(Zahlen[0-n])-1        # An die Funktion die Zahlen aus der Liste übergeben
                                              # Da ich nicht nur einen bestimmten Eintrag zurückhaben will,
                                              # sondern so viele, wie in der Liste waren, benutze ich hier n
                                              # Da man in der Liste wie folgt Zählt: 0, 1, 2 etc. also mit der
                                              # Zahl Null beginnt, muss ich 1 von n abziehen.
    print Ergebnis
    
if __name__ == "__main__":
    main()

Fehlermeldung:
Traceback (most recent call last):
File "D:\Dan\Python\Übung\Calc\Neues Textdokument.py", line 24, in <module>
main()
File "D:\Dan\Python\Übung\Calc\Neues Textdokument.py", line 16, in main
Ergebnis = umandeln(Zahlen[0-n])-1 # An die Funktion die Zahlen aus der Liste übergeben
File "D:\Dan\Python\Übung\Calc\Neues Textdokument.py", line 3, in umandeln
f = [float(Elemente.replace(',', '.')) for Elemente in Parameter]
ValueError: could not convert string to float: .
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sophus hat geschrieben:ignorieren wir jetzt mal die sinnlosen Namensgebungen
Lieber nicht. Elemente sind zB. keine Elemente, sondern nur ein einziges Element. Zur Veranschaulichung: "Guten Tag, darf ich Ihnen meine Frauen vorstellen? Ihre Namen sind Christine". "Meine Autos habe ich vor der Tür geparkt. Es sind VWs." - "Wieviele Autos haben sie denn?" - "Na eines!".

Namen sind in der Programmierung nicht Schall und Rauch. Guckstu:

Code: Alles auswählen

def a(b):
    c = [float(d.replace(',', '.')) for d in b]
    for e in c:
          return e
Oder:

Code: Alles auswählen

def giesskannen(albatross):
    schlafanzug = [float(liebe_und_gesetze.replace(',', '.')) for liebe_und_gesetze in albatross]
    for genesungswuensche in schlafanzug:
          return genesungswünsche
Ein Klassiker der informatischen Aphorismen ist dieser von Phil Karlton:
There are only two hard things in Computer Science: cache invalidation and naming things.
Die richtige Benennung von Dingen ist nicht etwas nebensächliches, oder kosmetisches, was man hinterher anflanschen könnte sobald alles läuft. Die richtige Benennung von Dingen ist die Basis dafür, etwas überhaupt richtig programmieren zu können. Und es betrifft eben nicht in erster Linie andere Personen, die deinen Source Code verstehen wollen, sonder dich selber. Wenn du etwas nicht vernünftig benennen kannst, ist das ein starkes Indiz dafür, dass du es nicht verstanden hast, und dann kannst duch auch nichts richtiges damit programmieren. Solange du dir dein Leben selber so schwer machst, kann ich dir nicht helfen.

Aber dieser Hinweis noch: zurecht hast du festgestellt, dass das return im for-Loop nicht das Ergebnis liefert, das du zunächst erwartet hast. Dann aber eine neue Version zu programmieren, die genau denselben Fehler wieder beinhaltet, erinnert mich an den Betrunkenen, der Nachts unter einer Straßenlaterne seinen Schlüssel sucht. Auf die Frage eines Passanen, wo er in denn verloren habe, antwortet er: "Da drüben im Dunkeln". Aber warum er denn dann hier suche? "Na, hier sieht man wenigstens etwas".
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

pillmuncher hat geschrieben: Ein Klassiker der informatischen Aphorismen ist dieser von Phil Karlton:
There are only two hard things in Computer Science: cache invalidation and naming things.
Die richtige Benennung von Dingen ist nicht etwas nebensächliches, oder kosmetisches, was man hinterher anflanschen könnte sobald alles läuft. Die richtige Benennung von Dingen ist die Basis dafür, etwas überhaupt richtig programmieren zu können. Und es betrifft eben nicht in erster Linie andere Personen, die deinen Source Code verstehen wollen, sonder dich selber. Wenn du etwas nicht vernünftig benennen kannst, ist das ein starkes Indiz dafür, dass du es nicht verstanden hast, und dann kannst duch auch nichts richtiges damit programmieren. Solange du dir dein Leben selber so schwer machst, kann ich dir nicht helfen.

Aber dieser Hinweis noch: zurecht hast du festgestellt, dass das return im for-Loop nicht das Ergebnis liefert, das du zunächst erwartet hast. Dann aber eine neue Version zu programmieren, die genau denselben Fehler wieder beinhaltet, erinnert mich an den Betrunkenen, der Nachts unter einer Straßenlaterne seinen Schlüssel sucht. Auf die Frage eines Passanen, wo er in denn verloren habe, antwortet er: "Da drüben im Dunkeln". Aber warum er denn dann hier suche? "Na, hier sieht man wenigstens etwas".
Verzeih, wenn ich euch zu Nahe gekommen bin oder euch das Gefühl vermittel, dass ich Python nicht ernst nehme. Ich habe es wie folgt betrachtet: Wir besprechen hier einen minimalen Schnipsel, welcher zum einen völlig aus dem Kontext gezogen worden ist und zum anderen sehr übersichtlich ist. Aus diesem Grund sah ich mich nicht dazu veranlasst um die sinnvollen Namensgebung zu kümmern. Durchaus weiß ich aber, dass bei Projekten, welche man ernsthaft angehen will, die Namensgebungen eine wichtige Rolle spielen. Denn dieses Grundelement ist in allen Sprachen gleich.

Um es mal bildlich zu sprechen: Wenn ich in der Werkstatt bin und mir einen Prototypen von irgendetwas basteln möchte, achte ich zunächst nicht auf den Feinschliff, zum Beispiel alle Bauteile die gleiche Farbe haben oder die Bauteile "hübsch" aussehen. Beim Prototyp möchte ich zunächst einmal "grob" basteln, später, wenn alles so läuft wie ich es mir vorstelle, kann ich dann all die anderen Dinge berücksichtigen.

Aber zu meinem Anliegen: Wie bekomme ich all die Werte zurück? Bis jetzt habe ich immer nur einen Wert zurück bekommen.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Code: Alles auswählen

def giesskannen(albatross):
    schlafanzug = [float(liebe_und_gesetze.replace(',', '.')) for liebe_und_gesetze in albatross]
    for genesungswuensche in schlafanzug:
          return genesungswünsche
:D :) :lol: :P :D :D
Wo issen der Like-Knopf?

Edit:
Aber zu meinem Anliegen: Wie bekomme ich all die Werte zurück? Bis jetzt habe ich immer nur einen Wert zurück bekommen.
Hab ich doch oben schon geschrieben. Jetzt machst du erstmal ein Schläfchen, und morgen nach dem Frühstück schaust du dir diesen Thread nochmal durch. Wenn du es dann nicht hinkriegst, ist Programmieren (zumindest mit Erwachsenen-Sprachen wie Python) wohl nix für dich (Sorry).
Gute Nacht von Mister Y.
PS: Die angebotene Summe ist beachtlich.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sophus hat geschrieben:Ich habe es wie folgt betrachtet: Wir besprechen hier einen minimalen Schnipsel, welcher zum einen völlig aus dem Kontext gezogen worden ist und zum anderen sehr übersichtlich ist. Aus diesem Grund sah ich mich nicht dazu veranlasst um die sinnvollen Namensgebung zu kümmern.
Dann drehen wir die Sache einfach mal um: Du hast keine Lust Dinge vernünftig zu benennen, wir sollen aber den Code verstehen können um dir zu helfen. Du machst es den Helfenden also mit Absicht schwer es zu verstehen und vergibst zusätzlich noch irreführende Namen. Jetzt stellt sich mir natürlich die Frage warum man dir noch helfen sollte, wenn du gemütlich alle sinnvollen Ratschläge ignorierst und einfach weiter rätst statt strukturiert an das Problem zu gehen. Die meisten der Helfenden hier im Thread verdienen ihr Geld mit dem Kram und wissen sehr genau was sie tun. Wenn du die Ratschläge nicht annehmen willst, dann ist das deine Sache. Dann musst du aber damit rechnen, dass du bald gar keine Ratschläge mehr bekommst.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo EyDu,

du hast Recht. Man sollte sich von Anfang an diszipliniert verhalten. Ich habe mich nochmal hingesetzt, und die Namengebungen nach meinem Stil gestaltet:

Code: Alles auswählen

# -*- coding: cp1252 -*-
def zeichen_umwandeln(str_zahlen):
     zeichen_ersetzt = [float(eintraege.replace(',', '.')) for eintraege in str_zahlen]
     for gleitkommazahl in zeichen_ersetzt:
          return gleitkommazahl

def main():
    str_liste_kommazahl = [
    "5,2",
    "7,0",
    "8.0",
    "2,6"
    ]

    ergebnis= zeichen_umwandeln(str_liste_kommazahl)       # Der Funktion die Zahlen aus der Liste übergeben.
    print ergebnis # Ausgabe: 5.2
    
if __name__ == "__main__":
    main()
Entschuldigt, wenn ich keine englischen Begriffe verwende. Ich bin ein Verfechter der "Sprachen-Trennung". Solange es nicht nötig ist, englisch zu sprechen bzw. zu schreiben, kommuniziere ich auch in meiner Muttersprache. Jedoch mache ich in der Pflege meiner Muttersprache eine Ausnahme, und zwar bei der Formatierung der Umlaute. Eigentlich sind sie in dieser Schreibweise gänzlich falsch. Grund für diese Ausnahme:Es handelt sich hierbei um Variablen. Das Kürzel str benutze ich immer stellvertretend für den Typus String.

Zurück zum Problem: Er gibt mir nur einen Eintrag aus der Liste zurück. Wie ist es möglich alle Einträge zu bekommen?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Sophus hat geschrieben:Wie ist es möglich alle Einträge zu bekommen?
Indem Du alle Einträge zurückgibst... :wink: Jetzt überleg' doch mal selbst: Über die Schleife greifst Du Element für Element auf alle Einträge zu. Und wo sind alle Einträge?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

mutetella hat geschrieben:
Sophus hat geschrieben:Wie ist es möglich alle Einträge zu bekommen?
Indem Du alle Einträge zurückgibst... :wink: Jetzt überleg' doch mal selbst: Über die Schleife greifst Du Element für Element auf alle Einträge zu. Und wo sind alle Einträge?

mutetella
Alter Falter, wieso komme ich nicht selbst darauf? Besten Dank. :-)

Code: Alles auswählen

# -*- coding: cp1252 -*-
def zeichen_umwandeln(str_zahlen):
     zeichen_ersetzt = [float(eintraege.replace(',', '.')) for eintraege in str_zahlen]
     for gleitkommazahl in zeichen_ersetzt:
          return zeichen_ersetzt

def main():
    str_liste_kommazahl = [
    "5,2",
    "7,0",
    "8.0",
    "2,6"
    ]

    resultat = zeichen_umwandeln(str_liste_kommazahl)       # An die Funktion die Zahlen aus der Liste übergeben.
    print resultat
    
if __name__ == "__main__":
    main()

EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sophus hat geschrieben:Entschuldigt, wenn ich keine englischen Begriffe verwende. Ich bin ein Verfechter der "Sprachen-Trennung". Solange es nicht nötig ist, englisch zu sprechen bzw. zu schreiben, kommuniziere ich auch in meiner Muttersprache. Jedoch mache ich in der Pflege meiner Muttersprache eine Ausnahme, und zwar bei der Formatierung der Umlaute. Eigentlich sind sie in dieser Schreibweise gänzlich falsch.
So lange du da konsequent bist und nicht englische und deutsche Namen vermischt ist das auch eher ein kleines Problem.
Sophus hat geschrieben:Grund für diese Ausnahme:Es handelt sich hierbei um Variablen. Das Kürzel str benutze ich immer stellvertretend für den Typus String.
Diese Notation solltest du dir gleich wieder abgewöhnen, das macht man schon seit den Neunzigern nicht mehr. Viel zu unleserlich und unpraktisch. Es ändert sich doch häufiger mal der Typ. Gerade in dynamischen Sprachen mit Duck Typing, da ist das sogar explizit vorgesehen. Dann stehen da entweder falsche Typinformationen oder du musst alles ändern. Und letzteres geht häufig gar nicht, da sich dann die Schnittstelle ändert. Das führt alles nur zu Problemen.

Nutze die Pluralform: Eine Sequenz von Tieren nennst du einfach "tiere" und nicht "liste_tier".
Das Leben ist wie ein Tennisball.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und nun denkst du noch einmal über die Sinnhaftigkeit der for-Schleife in deinem letzten Beitrag nach. Du hast schon wieder so lange geändert, bis es irgendwie funktioniert hat. Du musst schon verstehen, *warum* das so funktioniert und was an der Schleife falsch ist.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

EyDu hat geschrieben:Und nun denkst du noch einmal über die Sinnhaftigkeit der for-Schleife in deinem letzten Beitrag nach. Du hast schon wieder so lange geändert, bis es irgendwie funktioniert hat. Du musst schon verstehen, *warum* das so funktioniert und was an der Schleife falsch ist.
Hallo EyDu, danke für den Hinweis.

Code: Alles auswählen

def zeichen_umwandeln(str_zahlen):
     zeichen_ersetzt = [float(eintraege.replace(',', '.')) for eintraege in str_zahlen]
     for gleitkommazahl in zeichen_ersetzt: # Falscher Fehler:-)
          return zeichen_ersetzt
Ich habe hier zwei Mal die For-Schleife angewendet, was natürlich unsinnig ist. Ich habe die zweite Zeile gänzlich missachtet. :-)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sophus hat geschrieben:Wie ist es möglich alle Einträge zu bekommen?
Wenn man doch nur alle Einträge in eine Datenstruktur packen könnte, zB. eine Liste, und dann diese Liste zurückgeben könnte...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Also, Python scheint mit den importierten Modulen ein Problem zu haben.

Code: Alles auswählen

# -*- coding: utf-8 -*-
import sys
import Bestandteile.Beschaffungskalkulation_Vorwaerts
[...]
def main():
    print "=================== Programmauswahl ======================="
    print ""
    menu = [
        ["Beschaffungskalkulation(Vorwaerts)", Bestandteile.Beschaffungskalkulation_Vorwaerts.BKV],
        ["Beschaffungskalkulation(Rueckwaerts)", BKVR],
        ["Differenzkalkulation", DK],
        ["Absatzkalkulation", AK],
        ["Beenden", quit]
    ]
    
    handle_menu(menu)


if __name__ == "__main__":
    main()
Wir sehen oben im Import, dass das Modul Beschaffungskalkulation_Vorwaerts aus dem Ordner Bestandteile importiert wird. Soweit alles in Ordnung. Wenn ich mir aber Zeile 9 ansehe, könnte ich kreischen. Wieso muss man jedesmal den kompletten Pfad mit angeben, genauso wie im Import? Man stelle sich vor, die Verzeichnis-Struktur wäre noch verzwickter. Dann würde man ja allein für die Pfad-Angabe beschäftigt sein. In PHP ist es wesentlich erträglicher. Sobald eine Datei inkludiert wurde, kann man mit den Variablen und Funktionen aus den anderen Dateien arbeiten. Ich hatte auch die Idee, den Import-Pfad in eine Konstante zu verlegen, so dass ich dann mit der Konstante arbeiten kann. Aber soweit ich informiert bin, gibt es in Python nicht ohne weiteres eine Konstante, bzw. kann man eine Variable nicht in eine Konstante deklarieren. Gibt es Mittel und Wege den Rattenschwanz zu verkürzen?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sophus hat geschrieben:Gibt es Mittel und Wege den Rattenschwanz zu verkürzen?

Code: Alles auswählen

from Bestandteile.Beschaffungskalkulation_Vorwaerts import BKV
Wenn alles geklappt hat, ist anschließend der Name `BKV` im globalen Namensraum des importierenden Moduls verfügbar.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sophus hat geschrieben:Ich hatte auch die Idee, den Import-Pfad in eine Konstante zu verlegen, so dass ich dann mit der Konstante arbeiten kann. Aber soweit ich informiert bin, gibt es in Python nicht ohne weiteres eine Konstante, bzw. kann man eine Variable nicht in eine Konstante deklarieren.
Konstanten und Variablen sind in Python rein über Konventionen bei der Benennung geregelt. Seitens der Sprache gibt es da keine Unterstützung. Mir persönlich macht das auch nichts aus.

Aliase für verschachtelte Namensräume kann man aber genau so gut als Variable anlegen. Falls es sich dabei um Module handelt, sollte man jedoch lieber den von mir bereits gezeigten Weg über die "from ... import ..."-Anweisung gehen.

Übrigens: Falls man ein paar Sachen, von denen man glaubt, dass sie die meistgenutzten Objekte sein werden, für so eine Art "Simple API" freigeben möchte, dann kann man auch ein gesondertes Modul erstellen, welches für die nötigen "from-Importe" sorgt, damit das Leben für den Anwender durch solche Abkürzungen erleichtert wird. Dann muss man sich nur noch mit der tatsächlichen Package-Struktur beschäftigen, wenn man sehr spezielle Anpassungen oder Erweiterungen vornehmen möchte.
Antworten