Seite 1 von 1
Primfaktorenzerlegung
Verfasst: Sonntag 4. März 2007, 01:04
von pot
Hi @ all
Habe erst gerade angefangen, mich mit python zu beschäftigen. Dies ist jetzt mein zweites, einigermassen nützliches python Skript.
Ich wollte einfach mal ein Feedback über den Programmierstil (ich weiss, ist nicht viel Code ^^) und Hinweise was ev. noch besser sein könnte. Ev. ist der Algorithmus nicht ganz korrekt durchdacht. Egal, immer her mit der Kritik
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Zerlegt eine gewünschte Zahl in Primfaktoren
#
# Copyright (c) 2007 Remo Wenger
def main():
input = raw_input('Geben Sie eine Zahl ein: ');
input = int(input)
for x in range(2, input):
while input % x == 0:
print x
input = input / x
if __name__ == "__main__":
main()
MfG,
Pot
Verfasst: Sonntag 4. März 2007, 10:28
von rayo
Hi
Den Namen input ist schlecht gewählt, weil es auch eine Builtin-Funktion gibt die input heisst, darum wird sie auch blau Dargestellt.
Gruss
Verfasst: Sonntag 4. März 2007, 11:33
von pot
rayo hat geschrieben:Den Namen input ist schlecht gewählt, weil es auch eine Builtin-Funktion gibt die input heisst, darum wird sie auch blau Dargestellt.
Danke für den Hinweis.
So long,
Pot
Verfasst: Sonntag 4. März 2007, 12:11
von BlackJack
Das Semikolon am Zeilenende ist überflüssig und aus den beiden Zeilen für Eingabe und Umwandlung in ein `int()` könnte man eine machen.
Falls man grosse Zahlen erwartet, ist `xrange()` speicherschonender als `range()`. Und beim Teilen könnte man etwas Tipparbeit mit den kombinierten "Operator/Zuweisungs"-Operatoren sparen.
Code: Alles auswählen
def main():
number = int(raw_input('Geben sie eine Zahl ein: '))
for divisor in xrange(2, number):
while number % divisor == 0:
print divisor
number //= divisor
Verfasst: Sonntag 4. März 2007, 12:41
von pot
BlackJack hat geschrieben:Das Semikolon am Zeilenende ist überflüssig und aus
Ups. Naja ist schwer sich umzugewöhnen
Wieso gibt der python Interpreter keine Fehlermeldung aus, wenn er das sieht?
BlackJack hat geschrieben:den beiden Zeilen für Eingabe und Umwandlung in ein `int()` könnte man eine machen.
Stimmt, danke.
BlackJack hat geschrieben:Falls man grosse Zahlen erwartet, ist `xrange()` speicherschonender als `range()`.
Danke für den Tipp^^ Ich weiss nicht genau ob range schuld war, dass meine Kiste abstürzte, als ich die Primfaktoren von "123456789" wissen wollte.
BlackJack hat geschrieben:Und beim Teilen könnte man etwas Tipparbeit mit den kombinierten "Operator/Zuweisungs"-Operatoren sparen.
Schonwieder was gelernt
Danke
Aufgrund des Systemabsturzes habe ich noch eine kleiner "Sicherheitsmechanismus" (^^) eingebaut:
Code: Alles auswählen
import sys
def main():
number = int(raw_input('Geben Sie eine Zahl ein: '))
if len(str(number)) > 6:
print >> sys.stderr, 'Mehr als sechs Ziffern sind nicht erlaubt'
sys.exit()
primfaktoren = []
for divisor in xrange(2, number):
while number % divisor == 0:
primfaktoren.append(divisor)
number //= divisor
for primfaktor in primfaktoren:
print primfaktor
if __name__ == "__main__":
main()
Wie man sieht habe ich die Primfaktoren in den Tupel primfaktoren angehängt und mir gehofft, so irgendwie die Primfaktoren nebeneinander ausgeben zu lassen. Leider macht print da einfach n Zeilenumbruch. Abhilfe dafür habe ich noch nicht gefunden.
Greets,
Pot
Verfasst: Sonntag 4. März 2007, 13:31
von pyStyler
Hallo,
ist ganz einfach. Am ende der Codezeile 18 ein Komma(, ) setzen.
Gruss
pyStyler
Verfasst: Sonntag 4. März 2007, 13:33
von pot
pyStyler hat geschrieben:ist ganz einfach. Am ende der Codezeile 18 ein Komma(, ) setzen.
Danke
Verfasst: Sonntag 4. März 2007, 14:11
von BlackJack
Ein Semikolon ist ja kein Syntaxfehler sondern für sich alleine bloss überflüssig. Damit kann man mehrere Anweisungen auf einer Zeile schreiben. Was man allerdings nicht machen sollte, da dann die Übersichtlichkeit leidet.
`primfaktoren` ist übrigens kein Tupel sondern eine Liste.
Verfasst: Sonntag 4. März 2007, 14:15
von pot
BlackJack hat geschrieben:Ein Semikolon ist ja kein Syntaxfehler sondern für sich alleine bloss überflüssig. Damit kann man mehrere Anweisungen auf einer Zeile schreiben. Was man allerdings nicht machen sollte, da dann die Übersichtlichkeit leidet.
Achso, danke.
BlackJack hat geschrieben:`primfaktoren` ist übrigens kein Tupel sondern eine Liste.
Mh.. wieder einmal verwechselt.
Verfasst: Sonntag 4. März 2007, 15:37
von Leonidas
würde ich eher als
schreiben.
Verfasst: Sonntag 4. März 2007, 21:49
von pot
Leonidas hat geschrieben:
würde ich eher als
schreiben.
Danke ^^ manchmal studiert man einfach zu weit.