Moin, moin!
Kurz vorweg: Ich bin bloß eine arme kleine Anfängerin, die keine Ahnung von (fast) nix hat. Daher bitte ich die in Ehren ergrauten Spezialisten hier darum, gnädig über meine Trotteligkeit hinwegzusehen.
Nun zu meinem Problem(chen).
Ich möchte gern ein kleines Programm schreiben, das die Teilbarkeit einer bestimmten Zahl b durch alle natürlichen Zahlen 2 bis x testet. Ist b durch alle Zahlen teilbar, so soll eine entsprechende Meldung A ausgegeben werden; wenn es bei der Division durch eine dieser Zahlen einen Rest gibt, wird das Durchprüfen bei dieser Zahl gestoppt und die Meldung B ausgegeben.
Dafür erschien mir eine Schleife ganz praktisch:
Zunächst müssen b und x definiert werden. Da bei der Division zweier Integer der Nachkommarest, den ich aber zur Überprüfung der Teilbarkeit brauche, unter den Tisch fallen gelassen wird, definiere ich b gleich als float.
for i in range(2,x+1):
... if b/i =! int(b/i): #Wenn b/i keine ganze Zahl ist...
... return B
Tja, soweit, so schlecht.
Nur weiß ich nun nicht, wie ich es schaffe, das Programm eine Meldung ausgeben zu lassen, wenn ALLE Quotienten b/i durchgeprüft wurden und ganz sind. Könnte mir da jemand helfen?
Vielen Dank im Voraus!
Das Klebewesen
P.S.: Bitte stört euch nicht an den paar Syntaxfehlern, die kann ich auch selber noch korrigieren.
Schleife: Wenn alle b/i ganz--->Meldung
- Klebewesen
- User
- Beiträge: 2
- Registriert: Donnerstag 28. August 2008, 16:55
- Wohnort: hinterm Mond, in einem verrosteten Backofen.
- roschi
- User
- Beiträge: 225
- Registriert: Samstag 29. März 2008, 18:58
- Wohnort: Thueringen, Deutschland
- Kontaktdaten:
hallo!
ich denke, das muesste gehen:
du kannst natuerlich auch zeile 7-8 ersetzen durch:
mfg
roschi
PS: 'xrange' ist schneller als 'range'
EDIT: kleiner denkfehler im code ausgebessert
ich denke, das muesste gehen:
Code: Alles auswählen
def check(b, x):
for i in xrange(2,x+1):
y = b/i # so braucht man es nur einmal auszurechnen
if not y == int(y): return i-1
return True
b = 10.0
x = 5
result = check(b, x)
if result == True: print "durch alles teilbar bis " + str(x)
else: print "nur teilbar durch zahlen bis " + str(result)
Code: Alles auswählen
while True:
try:
b = float(raw_input("zu pruefende zahl: "))
x = int(raw_input("pruefen bis: "))
except ValueError: continue
break
roschi
PS: 'xrange' ist schneller als 'range'
EDIT: kleiner denkfehler im code ausgebessert
Zuletzt geändert von roschi am Samstag 30. August 2008, 17:25, insgesamt 2-mal geändert.
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Hallo,
du kannst für sowas mit dem "Modulo" Operator arbeiten:
Alternativ solltest du, wenn du schon weist, was List Comprehensions und Generator Ausdrücke sind, mit diesen in Kombination mit Funktionen arbeiten, grade bei solchen eher einfachen, mathematischen Dingen sind diese Dinge sehr nützlich:
du kannst für sowas mit dem "Modulo" Operator arbeiten:
Code: Alles auswählen
def f(b, x):
for i in xrange(2, x+1):
if b % i != 0:
print "Es gibt einen Rest."
Code: Alles auswählen
def f(b, x):
return all(b % i == 0 for i in xrange(2, x+1))
if f(2, 4):
print "Es gibt keinen Rest."
else:
print "Es gibt einen Rest."
... bei mir sieht's so aus:
Gruß
Code: Alles auswählen
#!/usr/bin/env python
b = 12
x = 4
y = 0
for i in range(2, x + 1, 1):
if b % i:
print "B"
break
else:
y += 1
if y == x - 1:
print "A"
@abgdf: Eine kleine Vereinfachung:
@str1442: Alternativ auch:
Ist aber sicherlich Geschmackssache.
Code: Alles auswählen
for i in range(2, x+1):
if b % i:
print "B"
break
else:
print "A"
@str1442: Alternativ auch:
Code: Alles auswählen
def f(b, x):
return not any(b%i for in in range(2, x+1))
@EyDu: Worauf bezieht sich denn Dein "else:" in Zeile 5 ?
Von der Einrückung kommt das mit dem "if" nicht hin, und wenn man es in die for-Schleife ziehen würde, würde es nicht das machen, was die OP wollte (Ausgabe "A" nur, wenn "b durch alle Zahlen teilbar").
Gruß
Von der Einrückung kommt das mit dem "if" nicht hin, und wenn man es in die for-Schleife ziehen würde, würde es nicht das machen, was die OP wollte (Ausgabe "A" nur, wenn "b durch alle Zahlen teilbar").
Gruß
Sicher funktioniert das.EyDu hat geschrieben:Natürlich bezieht sich das else auf das for. In welchem Fall sollte meine Variante deiner Meinung nach denn nicht funktionieren?
Aber dafür funktioniert deine Alternative nicht ....
@EyDu: Der Compiler sieht ein Problem:
Code: Alles auswählen
In [22]: def f(b, x):
....: return not any(b%i for in in range(2, x+1))
------------------------------------------------------------
File "<ipython console>", line 2
return not any(b%i for in in range(2, x+1))
^
<type 'exceptions.SyntaxError'>: invalid syntax
Ja, das ist mir auch schon aufgefallen, aber es ist ja nicht so, dass man nicht sofort erkennen könnte, dass das erste "in" nur "i" bedeuten soll. Allerdings haben abgdf und numerix sich auf meinen ersten Vorschlag bezogen.
Edit: Ach jetzt verstehe ich numerix Post. Der erste Satz bezog sich nicht auf das else sondern auf die ganze erste Variante und der zweite Satz auf den Syntaxfehler.
Edit: Ach jetzt verstehe ich numerix Post. Der erste Satz bezog sich nicht auf das else sondern auf die ganze erste Variante und der zweite Satz auf den Syntaxfehler.
Zuletzt geändert von EyDu am Sonntag 31. August 2008, 12:41, insgesamt 1-mal geändert.
- Klebewesen
- User
- Beiträge: 2
- Registriert: Donnerstag 28. August 2008, 16:55
- Wohnort: hinterm Mond, in einem verrosteten Backofen.
Ui, ich stelle mit Freuden fest, dass hier doch einige geantwortet haben!
Zwar sind mir die Methoden, die ihr angewandt habt, zum Großteil noch unbekannt; da muss ich mich erst einmal reinlesen. Trotzdem vielen Dank für die (aus meiner Sicht übrigens sehr eleganten *schleim* ) Lösungsvorschläge!
Zwar sind mir die Methoden, die ihr angewandt habt, zum Großteil noch unbekannt; da muss ich mich erst einmal reinlesen. Trotzdem vielen Dank für die (aus meiner Sicht übrigens sehr eleganten *schleim* ) Lösungsvorschläge!
Es gibt drei Sorten von Mathematikern auf der Welt: Die einen können bis drei zählen, die anderen nicht.
@EyDu: Oh, Entschuldigung (s.o) . Ich hätte echt nicht gedacht, daß es "for ... else" - Schleifen gibt.
Sicher sehr komfortabel, andererseits möchte ich mich aber so ausdrücken, daß der Code (z.B. gegenüber C) möglichst wenig Sprachbesonderheiten enthält.
Viele Grüße
Sicher sehr komfortabel, andererseits möchte ich mich aber so ausdrücken, daß der Code (z.B. gegenüber C) möglichst wenig Sprachbesonderheiten enthält.
Viele Grüße
Dafür muss man sich doch nicht entschuldigen, es können ja nicht alle so allwissen sein wie ichabgdf hat geschrieben:@EyDu: Oh, Entschuldigung (s.o) . Ich hätte echt nicht gedacht, daß es "for ... else" - Schleifen gibt.
Dann solltest du wohl besser C programmieren Nee, mal im Ernst: Ich benutze eine Sprache ja gerade deshalb, weil ich der Meinung bin, dass sie geeigneter für eine Aufgabe ist als eine andere. Wenn ich die (sinnvollen) neuen Features nicht nutze habe ich keinen Vorteil. Versteht ein "C-Programmierer" keine Python-Programme ist das nicht mein Problem.abgdf hat geschrieben:Sicher sehr komfortabel, andererseits möchte ich mich aber so ausdrücken, daß der Code (z.B. gegenüber C) möglichst wenig Sprachbesonderheiten enthält.
Warum dann eine andere Sprache verwenden, wenn man deren Konstrukte nicht benutzen möchte? Gerade gegenüber solchen "low level"-Sprachen wie C bietet Python da einiges.
Hi,
Mit sprachtypischen Features ist das so eine Sache: Perl, das voll von solchen speziellen Features ist, ist wohl ein gutes Negativbeispiel. Jemand, der Perl nicht wirklich gut kennt, kann Code nicht verstehen, der von Perl-Profis geschrieben ist, obwohl er durchaus schon brauchbare Programme schreiben kann.
(Kamel-Buch)
Wieauchimmer, jedenfalls möchte ich gern altbekannte Strukturen verwenden, wenn das möglich ist.
Ich glaube, das stimmt auch ganz gut mit dem Zen von Python überein.
Ist aber sicher Geschmackssache.
Viele Grüße
Genaugenommen wollte ich das eigentlich auch, hab's auch mehrfach versucht, hab' es dann aber jedesmal wieder seingelassen. C's Datentypen waren mir zu schwer zu handhaben, und Speicherfehler zu finden, war zu schmerzhaft. Es fehlten mir da vor allem so aussagekräftige Fehlermeldungen wie in Python. Um in C ein größeres Programm zu realisieren, muß man eben den Aufwand treiben, der dazu nötig ist und allgemein auch betrieben wird, das heißt, man braucht größere Entwicklerteams. Als einzelner Hobbyprogrammierer kann ich in Python viel mehr realisieren, das heißt, ich kann in Python Sachen machen, die ich in C schon vom Aufwand her gar nicht schaffen könnte.Dann solltest du wohl besser C programmieren
Mit sprachtypischen Features ist das so eine Sache: Perl, das voll von solchen speziellen Features ist, ist wohl ein gutes Negativbeispiel. Jemand, der Perl nicht wirklich gut kennt, kann Code nicht verstehen, der von Perl-Profis geschrieben ist, obwohl er durchaus schon brauchbare Programme schreiben kann.
http://www.unix.com.ua/orelly/perl/prog3/ch00_01.htmMost important, you don't have to know everything there is to know about Perl before you can write useful programs. You can learn Perl "small end first". You can program in Perl Baby-Talk, and we promise not to laugh. Or more precisely, we promise not to laugh any more than we'd giggle at a child's creative way of putting things ... Though simple in many ways, Perl is also a rich language, and there is much to learn about it. That's the price of making hard things possible. Although it will take some time for you to absorb all that Perl can do, you will be glad that you have access to the extensive capabilities of Perl when the time comes that you need them.
(Kamel-Buch)
Wieauchimmer, jedenfalls möchte ich gern altbekannte Strukturen verwenden, wenn das möglich ist.
Ich glaube, das stimmt auch ganz gut mit dem Zen von Python überein.
Ist aber sicher Geschmackssache.
Viele Grüße
Das ``for`` oder ``while`` mit ``else`` verwendet werden kann, ist vielleicht ein wenig "exotisch", aber man kann und sollte altbekannte C-Konstrukte schon deshalb nicht verwenden, weil es keine Entsprechung der ``for``-Schleife von C in Python gibt. Python kennt "nur" das iterieren über "iterierbare" Objekte und dieser Umstand (und auch Guido) favorisiert Iteratoren/Generatorausdrücke, die es so in C nicht gibt.
Die guten alten C-Kosntrukte mit iterieren über ``xrange(len(obj))`` und Indexzugriffen nach zu bauen ist definitiv eine schlechte Idee. Man sollte nicht C in Python programmieren.
Und die Lösungen mit ``not any(…)`` oder ``all(…)`` und einem Generatorausdruck finde ich recht "pythonisch" und elegant und eigentlich auch ganz gut verständlich.
Die guten alten C-Kosntrukte mit iterieren über ``xrange(len(obj))`` und Indexzugriffen nach zu bauen ist definitiv eine schlechte Idee. Man sollte nicht C in Python programmieren.
Und die Lösungen mit ``not any(…)`` oder ``all(…)`` und einem Generatorausdruck finde ich recht "pythonisch" und elegant und eigentlich auch ganz gut verständlich.