zahl die auf 5 endet überspringe

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.
ickiucki
User
Beiträge: 2
Registriert: Dienstag 3. Januar 2012, 12:16

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
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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 …
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

/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
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

/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

Code: Alles auswählen

[i for i in range(50) if i%5 or not i%10]
bzw. die entsprechende Schleifenvariante besser?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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
…
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
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:

Code: Alles auswählen

perl -e '$a = 5; print $a % 2 . "\n";'
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!
ickiucki
User
Beiträge: 2
Registriert: Dienstag 3. Januar 2012, 12:16

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
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.
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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?
Zuletzt geändert von problembär am Donnerstag 5. Januar 2012, 00:48, insgesamt 1-mal geändert.
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
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
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...
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

@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. ;)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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*
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
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.
deets

@Kebap

Ja, der problembaer ist ... ein problembaer :) auch haarig & zottelig wie ein Troll. Riecht auch streng.. ;)
Antworten