Seite 1 von 3
zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 14:41
von ickiucki
Hallo,
in einer Schleife will ich alle Zahlen, die auf 5 enden, überspringen.
In Perl wüsste ich: next if ($fünf =~/5$/);
In Python komm ich nicht weiter. Mein Versuch:
import math
import time
import re
start = 1
ende = 20
while start < ende:
if start == r"5\Z":
print "AHA"
break
print start
start += 2
teiler = 2
geht nicht. Vielleicht, weil da noch ein Leerzeichen hinter der 5 ist?
Danke und Grüsse
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 15:09
von nomnom
Es macht so gar keinen Sinn … In Perl konvertiert man Zahlen bestimmt auch nicht zu Strings und überprüft dann, ob sie auf 5 enden. Dafür gibt es einen Operator: % (Modulo). Du kannst ja mal danach suchen, dann wirst du vielleicht selber auf die Idee kommen. Am besten liest du dir mal ein Tutorial/Buch zu Python durch … Z. B. das deutsche »offizielle«
Tutorial, der Code sieht nämlich noch ziemlich holprig aus …
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 15:18
von /me
ickiucki hat geschrieben:Code: Alles auswählen
start = 1
ende = 20
while start < ende:
if start == r"5\Z":
print "AHA"
break
print start
start += 2
geht nicht. Vielleicht, weil da noch ein Leerzeichen hinter der 5 ist?
Nein, deshalb nicht. Es liegt daran, dass du eine Zahl mit einem String vergleichst.
Dein Code sieht außerdem so aus, als würdest du eine andere Sprache 1:1 in Python übersetzen wollen. Abgesehen davon passt der Code nicht zur Beschreibung. Du würdest beim ersten Auftreten der "5" bereits die Schleife verlassen.
start ist außerdem ein unglücklich gewählter Name für einen Bezeichner der den Startwert nur ganz zu Schleifenbeginn enthält.
Was du im Endeffekt brauchst ist eine passende Schleife a la Python und eine Möglichkeit, den Schleifenzähler in einen String zu konvertieren. Anschließend musst du dann nur noch das letzte Zeichen mit einer '5' vergleichen.
Code: Alles auswählen
for i in xrange(1, 21, 2):
if not str(i).endswith('5'):
print i
Eine Alternative wäre es, die Stringkonvertierung komplett wegfallen zu lassen und stattdessen mit dem Modulo-Operator zu arbeiten.
Code: Alles auswählen
for i in xrange(1, 21, 2):
if not i % 5 and i % 10:
continue
print(i)
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 15:43
von derdon
/me: Man kann auch einfach die Bedingung umkehren und sich so das continue-Statement sparen:
Code: Alles auswählen
>>> for i in xrange(1, 21, 2):
... if i % 5 and i % 10:
... print i
...
1
3
7
9
11
13
17
19
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 15:44
von nezzcarth
/me hat geschrieben:
Eine Alternative wäre es, die Stringkonvertierung komplett wegfallen zu lassen und stattdessen mit dem Modulo-Operator zu arbeiten.
Code: Alles auswählen
for i in xrange(1, 21, 2):
if not i % 5 and i % 10:
continue
print(i)
Die 10 und ihre Vielfachen müssen allerdings dann auch dran glauben.
Wäre vielleicht
bzw. die entsprechende Schleifenvariante besser?
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 15:57
von nomnom
Ich dachte eher an
Code: Alles auswählen
>>> for i in range(1, 21):
... if i % 10 != 5:
... print i
...
1
2
3
4
6
…
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 16:02
von sma
Aus `next if ($fünf =~/5$/);` würde ich dann wie dies machen (es braucht Python 3.x damit das `ü` im Variablennamen funktioniert) : `if fünf % 10 == 5: continue`. Anmerken möchte ich noch, dass `fünf` natürlich ein schlechter Variablenname ist – nicht wegen des Umlauts, sondern weil die Variable da eine beliebige Zahl, vielleicht einen Zähler, enthält.
Stefan
Re: zahl die auf 5 endet überspringe
Verfasst: Dienstag 3. Januar 2012, 17:35
von problembär
@ickiucki: Willkommen! Schön, daß sich hier mal ein weiterer Perl-Anwender meldet.
Perl mit seinen Skalarvariablen unterscheidet ja nicht zwischen Zeichenketten und Zahlen. Python dagegen schon:
Code: Alles auswählen
>>> a = "5"
>>> print type(a)
<type 'str'>
>>> a = 5
>>> print type(a)
<type 'int'>
>>> a = 5.5
>>> print type(a)
<type 'float'>
Wenn Du wie in Deinem Beispiel mit Zahlen rechnen willst, sind die bisherigen Vorschläge oben zu Modulo (%) gut. Modulo gibt's ja auch in Perl:
Reguläre Ausdrücke zur Untersuchung und Änderung von Strings gibt's in Python auch (Modul "re").
Für einfache Suchen- und Ersetzen-Operationen bietet Python aber spezielle String-Funktionen an, die oft sogar besser lesbar sind. Wenn Du das Ende eines Strings prüfen willst, bietet sich ".endswith()" an:
Code: Alles auswählen
#!/usr/bin/python
# coding: iso-8859-1
a = "abcdef5"
if a.endswith("5"):
print "Aha"
Da in Python die Einrückungen von Bedeutung sind, ist es noch wichtig, hier im Forum die Code-Tags zu verwenden. Sonst kann man Deinen Code praktisch nicht verstehen.
Viel Spaß noch mit Python!
Re: zahl die auf 5 endet überspringe
Verfasst: Mittwoch 4. Januar 2012, 13:27
von ickiucki
Vielen Dank für die Antworten.
Ich versuche mich gerade in Python reinzuarbeiten mittels einem dickem
Wälzer von Galileopress. Ich habe auch schon die Funktion "math.fmod(x, y)" bzw. %
gefunden, hielt sie aber für unpassend, denn ich will nicht einen Rest berechnen
und dann entscheiden, das ich die Zahl nicht brauche, sondern es einfacher
mache wollte: wenn Zahl auf fünf endet, dann überspringen! (das mit $fünf war nur
Unachtsamkeit, normal nehme ich auch keine Umlaute).
Ich werde die ganzen Beispiele durcharbeiten.
Herzlichen Dank
Re: zahl die auf 5 endet überspringe
Verfasst: Mittwoch 4. Januar 2012, 14:02
von BlackJack
@ickiucki: Falls es „das umfassende Handbuch“ von Galileo ist, dann ist das nicht so toll um Python zu lernen, weil die Autoren teilweise ziemlich „unpythonischen“ Quelltext zeigen. Insbesondere beim Thema OOP scheinen sie Wissen von anderen Programmiersprachen einfach 1:1 auf Python übertragen zu haben, was nicht immer gut funktioniert.
Um heraus zu finden ob eine Zahl auf 5 endet, muss man letztendlich immer Modulo-Operationen ausführen. Die Frage ist nur wann man das macht, und wie oft. Wenn man es selber macht, dann muss man zweimal Modulo rechnen; wenn man über die Umwandlung in eine Zeichenkette geht, dann fällt dort für jede Dezimalziffer einmal Modulo und Division an.
Re: zahl die auf 5 endet überspringe
Verfasst: Mittwoch 4. Januar 2012, 22:45
von problembär
ickiucki hat geschrieben:... denn ich will nicht einen Rest berechnen und dann entscheiden, das ich die Zahl nicht brauche, sondern es einfacher
mache wollte: wenn Zahl auf fünf endet, dann überspringen!
Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück), z.B.:
Code: Alles auswählen
#!/usr/bin/python
# coding: iso-8859-1
start = 1
ende = 20
while start < ende:
start = str(start)
if start.endswith("5"):
print "AHA"
else:
print start
start = int(start)
start += 2
Da muß (sogar) ich dann doch lachen: Das würde man in Python einfach nicht so machen. Eben weil man hier stärker int, float und str unterscheidet als in Perl.
Wenn man eine Zahlenoperation durchführen will, rechnet man mit Zahlen (int, float), wenn man eine Zeichenkettenoperation durchführen will, verwendet man Strings (str). Man würde eigentlich nicht auf die Idee kommen, eine Zahl auf ihr letztes ASCII-Zeichen zu untersuchen. Das ist Perl-typisches Denken, eben weil da einfach alles in einer Skalarvariablen zusammengeschmissen wird (was eigentlich nicht sehr sauber ist).
Übrigens kann Perl das sogar noch nichtmal ganz durchhalten: Bei if-Abfragen wird dann plötzlich doch wieder zwischen " == " (Zahlenvergleich) und " eq " (Stringvergleich), bzw. " != " und " ne " unterschieden. Auch nicht sehr sauber.
Re: zahl die auf 5 endet überspringe
Verfasst: Mittwoch 4. Januar 2012, 23:22
von Hyperion
problembär hat geschrieben:
Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück),
OMG... das ist ja grausam und derbe ineffizient! Selbst Dir sollte das auffallen, dass man das Wandeln und das Testen durchführen kann, ohne das Ergebnis an einen Namen zu binden. Aber selbst wenn man das wieso auch immer machen will, wieso kommst Du auf die Idee, den Namen zu überschreiben, der den Zahlenwert hält? Umständlicher geht es doch kaum...
Code: Alles auswählen
# Extremer Anti-Pattern:
zahl = str(zahl)
...
zahl = int(zahl)
Zudem erklärte BlackJack ja schon, dass das Wandeln in einen String nicht gerade ein Effizienzwunder ist und man mit einem einfachen Modulo hier schneller arbeitet.
Zudem sollte man keine `while`-Schleife benutzen, wenn man das Ende einer Sequenz kennt. Da drängt sich `for` doch sofort auf.
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 00:40
von problembär
Hyperion hat geschrieben:problembär hat geschrieben:
Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück),
OMG... das ist ja grausam und derbe ineffizient! Selbst Dir sollte das auffallen, dass man das Wandeln und das Testen durchführen kann, ohne das Ergebnis an einen Namen zu binden.
OMG .. Selbst Dir sollte auffallen, daß ich mich so nah' wie möglich an das Ausgangsbeispiel des Fragestellers im ersten Posting gehalten habe. Damit er die Entwicklung versteht.
Aber es ist ja nicht das erste Mal, daß ihr an den Leuten, die hier hoffnungsvoll Fragen stellen, komplett vorbeidenkt und -schreibt.
Python: Wunderbare Sprache - absolut miese Community. Hier jedenfalls. Warum nur?
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 00:48
von BlackJack
@problembär: Wenn man jemanden der Perl bereits kann, also kein Programmieranfänger ist, Quelltext mit einer ``for``-Schleife zeigt, dann denkt und schreibt man doch nicht komplett an ihm vorbei.
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 00:55
von Hyperion
problembär hat geschrieben:
OMG .. Selbst Dir sollte auffallen, daß ich mich so nah' wie möglich an das Ausgangsbeispiel des Fragestellers im ersten Posting gehalten habe. Damit er die Entwicklung versteht.
OMG... das hatte /me doch schon in seinem
ersten Posting und dort im zweiten Quellcode-Schnipsel gezeigt. Er hat eine `for`-Schleife benutzt - aber das entscheidende Wandeln in einen String und die Abfrage sind genau das, was Du letztlich zeigen wolltest. Nur eben in "richtig"...
problembär hat geschrieben:
Aber es ist ja nicht das erste Mal, daß ihr an den Leuten, die hier hoffnungsvoll Fragen stellen, komplett vorbeidenkt und -schreibt.
Wieso vorbei denkt? Es sind doch schon ausreichend Postings geschrieben worden, die ziemlich genau erklären, wie man das Problem lösen kann - sogar auf mehrere Arten! Das Konstrukt in eine `while`-Schleife zu übertragen ist doch auch von einem Anfänger nicht zu viel verlangt, wenn er es denn unbedingt so modellieren will.
Meine Kritik bezog sich ja vor allem auf den von mir hervorgehobenen Teil bei Dir... die `while`-Schleife ist ja nur "Nebenkritik" gewesen.
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 11:21
von deets
problembär hat geschrieben:
Aber es ist ja nicht das erste Mal, daß ihr an den Leuten, die hier hoffnungsvoll Fragen stellen, komplett vorbeidenkt und -schreibt.
Python: Wunderbare Sprache - absolut miese Community. Hier jedenfalls. Warum nur?
Das einzige, was hier mies ist, sind deine mangelhaften Programmierkenntnisse. Im Allgemeinen, wie auch bezogen auf Python selbst. Weil du das aber offensichtlich selbst nicht erkennen kannst, hast du dich auf deinen laecherlichen kleinen Kreuzzug wider gutes programmieren in Python begeben...
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 14:21
von Dobi
@problembär: Also ich schreib hier im Forum zwar selten was, les' aber schon seit einiger Zeit mit, und mir ist die Community hier sehr sympathisch (freundlicher Ton und kompetente Hilfe). Klar, einzelne Problembä... äh Problemkinder gibts in jedem Forum, aber auch das find' ich hier alles recht harmlos.

Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 14:42
von snafu
Wenn es denn unbedingt "sprechender" sein soll...
Code: Alles auswählen
class Number(int):
def endswith(self, digit):
if not 0 <= digit < 10:
raise ValueError('digit must be in range 0-9')
return (self % 10 == digit)
Kann man übrigens gern für mehrstellige Abfragen und um Typprüfungen erweitern.
Um `floats` zu erkennen, eignet sich natürlich bestens ein `'.' in str(digit)`. *scnr*
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 16:01
von Kebap
problembär hat geschrieben:es ist ja nicht das erste Mal, daß ihr an den Leuten, die hier hoffnungsvoll Fragen stellen, komplett vorbeidenkt und -schreibt. Python: Wunderbare Sprache - absolut miese Community. Hier jedenfalls. Warum nur?
Das muss ein Troll sein. Hier ist ungefähr die beste und zudem deutschsprachige Community, die ich kenne. Gut, ich kenne nicht viele Python Communities. Aber viele nicht-Python Communities, und selbst da rangiert diese hier nicht sonderlich weit hinten. Falls das also tatsächlich ernst gemeint sein sollte: Bitte verlinke doch ein paar bessere Python Communities, gerne in nem eigenen Thread und nenne Sachen, die dort einfach besser laufen.
Re: zahl die auf 5 endet überspringe
Verfasst: Donnerstag 5. Januar 2012, 16:22
von deets
@Kebap
Ja, der problembaer ist ... ein problembaer

auch haarig & zottelig wie ein Troll. Riecht auch streng..
