ubuntuusers.de

[PYTHON] : Summenzeichen

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

SirMax

Anmeldungsdatum:
15. Oktober 2010

Beiträge: Zähle...

Hallo,

ich bin gerade dabei ein kleines Programm zu schreiben, was mir die mittlere Atommasse berechnet, wenn ich vorher den Anteil und die Atommasse der einzelnen Isotope angegeben habe. Ich habe das Ganze so programmiert, dass ich am Anfang aufgefordert werde, anzugeben, wieviele Isotope beteiligt sind und dann möchte ich die einzelnen Werte eingeben. Das Problem ist jetzt die Summenfunktion am Ende, da mir dort gesagt wird, dass über float-Objekte nicht iteriert werden kann. Bestimmt gibt es irgendeinen Trick, den ich nocht nicht kenne, da ich noch nicht solange programmiere. Es wäre cool, wenn mir jemand helfen könnte, da mir auch mein Buch im Moment nicht weiterhilft!

P.S. Ich kann gerade nur das Internet an einem "etwas" veralteten PC nutzen. Aus irgendeinem Grund kann ich den Codeblock nicht hinzufügen. Ich werde das später nachholen. Vielleicht kann mir aber schonmal bis dahin jemand helfen! =)

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Servus,

wenn du eine Liste der Zahlen hast, kannst du darauf die „sum“-Funktion anwenden:

1
2
3
4
#!/usr/bin/env python2

werte = [1.0, 2.3, 3.1]
print sum(werte)

Das gibt dann „6.4“ aus.

Ich vermute aber, dass dein Problem woanders liegt, wenn er dir sagt, dass er über Floats nicht iterieren kann. ☺ Im Zweifel zeige doch mal den Code, den du bisher hast. Sollte das mit dem Code-Block nicht klappen (eigentlich musst du aber nur „{{{“, dann deinen Code und dann „}}}“ eingeben), kannst du auch die Ablage benutzen.

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Über ein einzelnes Float-Objekt kannst du nicht iterieren. Aber sum ist ja eigentlich auch nur bei einer Liste von Objekten sinnvoll, und da kannst du es auch verwenden:

>>> sum ((0.1, 0.2, 0.005, 3.14));
3.4450000000000003

SirMax

(Themenstarter)

Anmeldungsdatum:
15. Oktober 2010

Beiträge: 77

# Anzahl der Isotope
print "Bitte geben Sie die Anzahl der Isotope an!"
iso = input()
Iso = int(iso)

# Berechnung
for i in range(1, Iso+1):
      print "Bitte geben Sie den Anteil des", i, ". Isotops am Element an!"
      x = input()
      Xi = float(x)
      print "Bitte geben Sie die Atommasse des", i, ". Isotops an!"
      y = input()
      Yi = float(y)

A = Xi*Yi
print "mittlere Atommasse:", A

Ich habe gerade versucht, das nicht über die Summenfunktion sum() zu berechnen, aber leider "vergisst" er quasi die Xi- und Yi-Werte, d.h. er berechnet mir nur das A für den zuletzt eingegeben Xi- und Yi-Wert. Ich möchte das für 3 Isotope z.B. in der Form "X1*Y1 + X2*Y2 + X3*Y3" haben.

Danke für die Hilfe! =)

SirMax

(Themenstarter)

Anmeldungsdatum:
15. Oktober 2010

Beiträge: 77

Ok, dass das bisher noch nicht klappt ist mir eigentlich klar, aber ich weiß leider nicht, wie ich das schreiben muss, damit er alle bisher definierten Xi und Yi berücksichtigt. Ich habe halt an etwas wie das Summenzeichen aus der Mathematik gedacht, was in bestimmten Grenzen gilt. Wie das hier geht, weiß ich nicht. Geht das vielleicht über NumPy?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Deine Denkweise funktioniert so zwar in der Mathematik, aber Programmiersprachen brauchen’s da etwas ausführlicher. ☺

Wenn du einfach so „Xi“ schreibst, dann legt Python einfach nur eine einzige Variable namens „Xi“ an. Dein Index wird nicht verstanden – der geht einfach verloren. Die Variable heißt wirklich wortwörtlich „Xi“. Das heißt, deine Schleife liest ein „Xi“ ein und ein „Yi“, aber beim nächsten Schleifendurchlauf werden diese beiden Werte wieder überschrieben. Du musst hier ganz explizit eine Liste von Werten anfertigen. Zum Beispiel so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python2
# coding: utf-8

# Anzahl der Isotope
print "Bitte geben Sie die Anzahl der Isotope an!"
iso = raw_input()
iso = int(iso)

# Lege Xi und Yi als leere Listen an. In der Schleife wird in jedem
# Durchlauf ein Element an diese Listen angehängt.
Xi = []
Yi = []
for i in range(1, iso+1):
    print "Bitte geben Sie den Anteil des", i, ". Isotops am Element an!"
    x = raw_input()
    Xi += [float(x)]
    print "Bitte geben Sie die Atommasse des", i, ". Isotops an!"
    y = raw_input()
    Yi += [float(y)]

A = sum(map(lambda a, b: a * b, Xi, Yi))
print "mittlere Atommasse:", A

Du siehst da auch, dass du in (zumindest in Python) Variablen neue Werte zuordnen kannst. Ist nicht in allen Programmiersprachen so, hier aber schon. Deswegen brauchst du zum Beispiel kein „iso“ und „Iso“, sondern kannst das „iso“ einfach überschreiben. Oder du wendest das „int()“ direkt auf „raw_input()“ an. Bezüglich „input()“ übrigens mal die Warnung hier lesen.

Das „A“ am Ende bedarf wohl auch noch einer Erklärung. Ich habe das jetzt so verstanden, dass du ursprünglich

A = \sum_{i = 0}^{iso - 1} x_i \cdot y_i

gemeint hast. Das heißt für den ersten Schritt, zwei zusammengehörige Werte aus den Listen „Xi“ und „Yi“ müssen multipliziert und als neuer Wert irgendwo gespeichert werden. Das macht die „map“-Funktion mit dem „lambda“-Ausdruck. Um das mal isoliert zu betrachten, so sieht das aus:

1
2
3
4
>>> Xi = [1, 2, 3, 4]
>>> Yi = [3, 3, 3, 3]
>>> map(lambda a, b: a * b, Xi, Yi)
[3, 6, 9, 12]

map“ durchläuft beide Listen und wendet den Ausdruck darauf an. „lambda a, b: a * b“ sieht also im ersten Fall für „a“ eine 1 (erster Wert aus „Xi“) und für „b“ eine 3. Das wird verrechnet und als 3 in der neuen Liste gespeichert. Danach kommt „2 * 3“, dann „3 * 3“ und so weiter. Bei diesem Vorgang entsteht die neue Liste „[3, 6, 9, 12]“.

Im letzten Schritt wird auf diese neue Liste dann „sum“ angewendet.

Hilft dir das so irgendwie weiter?

SirMax

(Themenstarter)

Anmeldungsdatum:
15. Oktober 2010

Beiträge: 77

Cool, vielen Dank für die ausführliche Hilfe! Ich werde mir das gleich mal in Ruhe durchlesen und umsetzen! =)

SirMax

(Themenstarter)

Anmeldungsdatum:
15. Oktober 2010

Beiträge: 77

So, ich habe das gestern Abend noch in mein Programm eingebaut. Das funktioniert jetzt alles genauso, wie ich es mir vorgestellt habe. Danke für die Hilfe! ☺

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Als kleine Anmerkungen noch:

  • Bezeichner schreibt man in Python klein; also besser xi und yi. Wobei ich das "i" auch weglassen würde. Ggf. kann man die Listen auch sinnvoller anhand des Inhalts benennen. Wie wäre es mit "amounts" und "masses"?

  • Anstelle sich mittels lambda eine Funktion fürs Multiplizieren zu basteln, kann man auch die bereits in der Standardlib eingebaute nutzen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
In [31]: from operator import mul

In [33]: list(map(mul, x, y))
Out[33]: [3, 6, 9, 12]

In [34]: sum(map(mul, x, y))
Out[34]: 30

In [35]: from itertools import imap

In [36]: sum(imap(mul, x, y))
Out[36]: 30

Da "map()" eine neue Liste erzeugt, die hier eigentlich nicht gebraucht wird, empfiehlt es sich in Python 2.x mit imap aus dem itertools-Modul zu arbeiten.

  • Anstelle des "+="-Operators würde ich hier doch "[].append()" nutzen. Liest sich imho klarer.

  • Beim print-Statement würde ich die Stringformatierungsmöglichkeiten von Python nutzen, speziell "".format():

1
print "Bitte geben Sie den Anteil des {0}. Isotops am Element an!".format(str(i))
Antworten |