zahl die auf 5 endet überspringe
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
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
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 …
Nein, deshalb nicht. Es liegt daran, dass du eine Zahl mit einem String vergleichst.ickiucki hat geschrieben:geht nicht. Vielleicht, weil da noch ein Leerzeichen hinter der 5 ist?Code: Alles auswählen
start = 1 ende = 20 while start < ende: if start == r"5\Z": print "AHA" break print start start += 2
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
Code: Alles auswählen
for i in xrange(1, 21, 2):
if not i % 5 and i % 10:
continue
print(i)
/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
Die 10 und ihre Vielfachen müssen allerdings dann auch dran glauben./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)
Wäre vielleicht
Code: Alles auswählen
[i for i in range(50) if i%5 or not i%10]
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
…
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
Stefan
@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:
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:
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!
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'>
Code: Alles auswählen
perl -e '$a = 5; print $a % 2 . "\n";'
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"
Viel Spaß noch mit Python!
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
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
@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.
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.
Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück), z.B.: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!
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
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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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...problembär hat geschrieben: Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück),
Code: Alles auswählen
# Extremer Anti-Pattern:
zahl = str(zahl)
...
zahl = int(zahl)
Zudem sollte man keine `while`-Schleife benutzen, wenn man das Ende einer Sequenz kennt. Da drängt sich `for` doch sofort auf.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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.Hyperion hat geschrieben: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.problembär hat geschrieben: Na ja, dann müßtest Du in Deinem Beispiel mehrmals int nach str umwandeln (und zurück),
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?
Zuletzt geändert von problembär am Donnerstag 5. Januar 2012, 00:48, insgesamt 1-mal geändert.
@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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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: 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.
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.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.
Meine Kritik bezog sich ja vor allem auf den von mir hervorgehobenen Teil bei Dir... die `while`-Schleife ist ja nur "Nebenkritik" gewesen.
Zuletzt geändert von Hyperion am Donnerstag 5. Januar 2012, 00:57, insgesamt 1-mal geändert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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...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?
@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.
Wenn es denn unbedingt "sprechender" sein soll...
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*
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)
Um `floats` zu erkennen, eignet sich natürlich bestens ein `'.' in str(digit)`. *scnr*
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.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?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
@Kebap
Ja, der problembaer ist ... ein problembaer auch haarig & zottelig wie ein Troll. Riecht auch streng..
Ja, der problembaer ist ... ein problembaer auch haarig & zottelig wie ein Troll. Riecht auch streng..