Seite 1 von 3

Zeilenumbruch

Verfasst: Samstag 3. September 2005, 08:58
von Mr
Tag
wie definiere ich eine etwas, dass nach einem Zeilenumbruch aussieht, denn Zeilenumbruch ist kein Python-Befehl.
Meine Aufgabe besteht eigentlich darin, dass ich ein Programm schreiben soll, dass eine Art von Tannenbaum ausgibt. Aber das löse ich schon selbst, ich brazche allerdings Hilfe bei dem Zeilenumbruch.


Mfg

Verfasst: Samstag 3. September 2005, 09:01
von rayo
öhm meinst du einfach

Code: Alles auswählen

print
??

sonst ist der Zeilenumbruch ein \n im String -> 'test\ntest2'

Gruss

Verfasst: Samstag 3. September 2005, 10:30
von jens
Noch ein wenig mehr info:
bei print wird immer ein Zeilenumbruch eingefügt:

Code: Alles auswählen

for i in xrange(2):
    print i
Ausgabe:
0
1
Wenn man das nicht haben will, kann man bei print ein Komma dranhängen:

Code: Alles auswählen

for i in xrange(2):
    print i,
Ausgabe:
0 1
Dabei wird allerdings immer ein Leerzeichen zwischen gehängen :( Wenn das auch nicht sein soll, muß man sys.stdout direkt "beschreiben":

Code: Alles auswählen

import sys
for i in xrange(2):
    sys.stdout.write( str(i) )
Ausgabe:
01
Wie man hier schon sehen kann, möchte stdout einen String haben und akzeptiert keine Zahlen oder was anderes...

Verfasst: Sonntag 4. September 2005, 09:52
von Mr
also hier mal mein ach so toller, eigendlich nicht vorzeigbarer, Code, der nicht funktioniert und ich nicht wweiß, warum"

Code: Alles auswählen

s="*"

while s<=15:
    s=s+1
    print s
    print 
    if s==15:
        print "Fertig"

Verfasst: Sonntag 4. September 2005, 11:19
von Leonidas
Ich werds jetzt nicht fertig machen (ist ja schließlich deine Aufgabe), aber das geht in deine Richtung:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

char = '*'

while len(char) <= 15:
    print char
    char += '*'

print "Fertig"

Verfasst: Sonntag 4. September 2005, 14:35
von Mr
hey danke, einen fertigen code hatte ich nicht erwartet. Naja das nächste Problem ist für mich also Leerzeichen zu erstellen, also praktisch einen Baum zu erstellen, der, zur Verdeutlichung, ganz so aussieht, wie ein Tannenbaum.
Ich hatte mir gedacht, dass man Leerzeichen so erstellen kann:

Code: Alles auswählen

l = " "
aber bei mir gibt der dann nur Zahlen aus.

mfg

Verfasst: Sonntag 4. September 2005, 15:15
von Leonidas
Poste mal einen ganzen Code, denn aus l = " " kann zumindest ich, nicht schlau werden, am besten auch gleich mit Fehlermeldung.

Verfasst: Sonntag 4. September 2005, 15:19
von Mr
hier ist also mein code, wie zu erwarten geht er aber nicht:

Code: Alles auswählen

s = '*'
l = " "

while len(s) <= 29:
    print s
    s += '**'
    while len(l) <= 14:
        print l
        l - " "
        
    

print "Fertig"
Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Sonntag 4. September 2005, 15:36
von Mr
Edit (Leonidas): Code in Python-Tags gesetzt.
]

versteh ich nicht. Der code ist doch unverändert oder liege ich jetzt ganz falsch?

Verfasst: Sonntag 4. September 2005, 16:02
von Leonidas
Mr hat geschrieben:
Edit (Leonidas): Code in Python-Tags gesetzt.
versteh ich nicht. Der code ist doch unverändert oder liege ich jetzt ganz falsch?
Der Code ist unverändert, jedoch ist er nicht mehr in |code| Tags, sondern in |python|-Tags, dadurch hast du Syntaxhighlighting.

Okay, ich habe es in 9 Zeilen gelöst (mit Kommentaren sinds viel mehr), am Schluss kann ich die Lösung posten, aber ich denke es ist besser wenn du selbst drauf kommst, deswegen gebe ich dir erstmal paar Tipps.

1. Du musst dir klar werden was zu zuerst brauchst. Zuerstz brauchst du die anzahl von Sternen in einer Zeile. In der ersten Zeile ist ist es einer, in der zweiten Zeile sind es drei, in der dritten fünf usw. Also siehst du, dass es immer um Zwei mehr wird. Dazu gibt es eine Schleife in Python: for anzahl_sterne in xrange(1, 16, 2), wobei 1 die erste Zahl ist, 16 die höchste (wird nicht erreicht) und 2 der Schritt (ich gehe davon aus dass dein Baum maximal 15 Sterne lang sein darf).

2. Danach kannst du bestimmen, wieviel von der 15 Felder langen Zeile frei bleibt. Bei der ersten Zeile ist es 15 - 1 = 14, dann 15 - 3 = 12 usw.

So.. ich hoffe ich habe dich auch den Weg gebracht, fallst was kann ich noch Punkt drei folgen lassen, aber damit ist das eigentlich dann auch schon komplett gelöst.

Iopodx hat übrigens auch gerade seinen Christbaum-Generator fertiggeschrieben und ist einen anderen Weg gegangen :)

Verfasst: Sonntag 4. September 2005, 17:18
von jens
@Mr: Interessant auch sowas wie print " " * 5 welches fünf Leerzeichen ausgibt ;)

Verfasst: Montag 5. September 2005, 16:52
von Mr
1. hab ich doch damit schon gelöst gehabt?!?

Code: Alles auswählen

while len(s) <= 29:
    print s
    s += '**' 
das, denke ich zumindest, gibt einen Baum aus, ohne jegliches Leerzeichen.
und 2. hab ich noch nicht so ganz aber ich schau mal.

mfg

Verfasst: Montag 5. September 2005, 17:19
von Leonidas
Es ist halt nur so, dass es mit einer for-Schleife meines Erachtens wesentlich effizienter ist, da man immer die genaue Anzahl von belegten (Sternen) und somit auch die unbelegten Stellen (Freizeichen) hat. Du kannst es natürlich mit einer while-Schleife machen, jedoch ist dies eigentlich unnötig, da die for-Schleife für diese Aufgabe viel passender ist.

Außerdem muss man sich manchmal vom geschriebenen Code losreißen, etwas refaktorisieren, dann kann man das Problem oft auf eine bessere Weise lösen.

Das Programm lässt sich sogar in einer Zeile schreiben *g*.. das wäre praktsch wieder ein Kandidat für unseren Einzeiler-Thread.. oder für Obfuscated Python :twisted:

Verfasst: Montag 5. September 2005, 17:41
von Mr
ja wenn man das alles mit Kommata trennt geht das.

Verfasst: Montag 5. September 2005, 18:15
von Mr
also ich habe das aber, naja, wi gehwohnt geht das nicht und ich keine Ahnung, wieso

Code: Alles auswählen

for s in range (1,30,2):
    print s
Edit (Leonidas): Code in Python Tags gesetzt.

Verfasst: Montag 5. September 2005, 18:59
von Leonidas
Mr hat geschrieben:ja wenn man das alles mit Kommata trennt geht das.
Nein, ich habe in der einen Zeile nur eine for-Schleife und eine einzige Print-Anweisung :D
Mr hat geschrieben:also ich habe das aber, naja, wi gehwohnt geht das nicht und ich keine Ahnung, wieso

Code: Alles auswählen

for s in range (1,30,2):
    print s
Also bei mir geht das ohne Probleme, was ist denn bei dir die Fehlermeldung?

Code: Alles auswählen

In [1]: for s in xrange(1, 30, 2):
   ...:     print s
   ...:
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29

Verfasst: Dienstag 6. September 2005, 12:43
von Mr
wieso eigentlich xrange. Warum nicht einfach nur range, wo liegt n da der Unterschied?
Zu dem Programm: Die Zahlen krieg ich auch manchmal hin allerdings nicht immer, aber wie sterne erzeugen? Ich hab mir zwar gedacht, dass ich s = "*" schreiben könnte aber dann geht nichts mehr.

Verfasst: Dienstag 6. September 2005, 13:18
von jens
Mr hat geschrieben:wieso eigentlich xrange. Warum nicht einfach nur range, wo liegt n da der Unterschied?
s. http://www.python-forum.de/viewtopic.php?p=12053#12053

Verfasst: Dienstag 6. September 2005, 13:26
von Gast
Wenn ich mal einen Tipp geben darf.
Alles was Du brauchst ist xrange und die string Function/Methode center()

MfG
Andreas

Edit:
Okay, ich habe es in 9 Zeilen
Ich in drei :mrgreen:
Aber ich muss zugeben dass mein Baum keinen Stamm hat ;)

Verfasst: Dienstag 6. September 2005, 15:26
von Gast
Anonymous hat geschrieben:Wenn ich mal einen Tipp geben darf.
Alles was Du brauchst ist xrange und die string Function/Methode center()

MfG
Andreas

Edit:
Okay, ich habe es in 9 Zeilen
Ich in drei :mrgreen:
Aber ich muss zugeben dass mein Baum keinen Stamm hat ;)
also das macht mich echt fertig. Ich lerne das gerfade, wiher soll ich denn das kennen, wenn ich noch nicht mal den einfachen Baum machen kann?

Aber wir wollen mal nicht von der eigendlichen Aufgabe abweichen. Ja, ok, das gibt zahlen aus, aber ich brauch doch sternchen: mit s = "*" geht dasnicht