Unerwünschte Zeichen bei ptint

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.
Antworten
quinto117
User
Beiträge: 5
Registriert: Donnerstag 26. Juli 2012, 22:24

Donnerstag 26. Juli 2012, 22:46

Ein neuer User ist im Forum geboren! Und genau dieser nervt sich ab einem Problem.

Alsooo, bin Pythoner in spe und stell einfach mal den Code und die Auscabe hier rein.
Code:

Code: Alles auswählen

fehler = 1
a = "asdf"
b = 0
while fehler== 1:
    print("Was für eine Astanzahl wünschen Sie?")
    z = input()

    try:
        n = int(z)
        fehler = 0
    except:
        print("Sie müssen eine natürliche Zahl eingeben:")

print(type(n))




for j in range(1, n+1, 1):
    b = 0
    for i in range(1, j+1, 1):
        while (2*j+1)*'* ' not in a:
            a = (n-b)*'  ', (i+2*b)*'* '
            print(a)
            b = b + 1

print((2*n-j)*"  ", (j)*"* ", sep="")
Ausgabe:

Code: Alles auswählen

Was für eine Astanzahl wünschen Sie?
5
<class 'int'>
('          ', '* ')
('        ', '* * * ')
('          ', '* ')
('        ', '* * * ')
('      ', '* * * * * ')
('          ', '* ')
('        ', '* * * ')
('      ', '* * * * * ')
('    ', '* * * * * * * ')
('          ', '* ')
('        ', '* * * ')
('      ', '* * * * * ')
('    ', '* * * * * * * ')
('  ', '* * * * * * * * * ')
('          ', '* ')
('        ', '* * * ')
('      ', '* * * * * ')
('    ', '* * * * * * * ')
('  ', '* * * * * * * * * ')
('', '* * * * * * * * * * * ')
          * * * * * 
Und die Frage dazu - Wieso zeigt's in allen, ausser der letzten, Zeilen diese blöden Zeichen ((',)) an??? Die hab ich schliesslich gar nie als Bestandteil definiert. Mit sep="" hab' ich's auch schon versucht, kam aber das Gleiche raus.

Danke natürlich denen, die mir versuchen werden zu helfen - falls es soweit kommt
:) :) :)
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 26. Juli 2012, 22:54

Willkommen zu Python und im Forum!

Schau mal, welche Anweisung die unerwuenschte Ausgabe erzeugt und was du ausgibst.
BlackJack

Freitag 27. Juli 2012, 10:18

@quinto117: ``print`` ist in Python 2.x keine Funktion, also mach mal ein Leerzeichen nach ``print`` und vor der Klammer und denk dann noch einmal darüber nach was da *eigentlich* steht.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Freitag 27. Juli 2012, 10:41

Noch einfacher wäre, Python 3 zu benutzen, denn dafür ist das Programm ja gedacht :)

Stefan
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 27. Juli 2012, 10:42

Ohne `print` als Funktion ist nicht das die Ausgabe, sondern eine Fehlermeldung ;)
quinto117
User
Beiträge: 5
Registriert: Donnerstag 26. Juli 2012, 22:24

Freitag 27. Juli 2012, 17:14

Tut mir leid, hab nämlich völlig vergessen zu erwähnen, dass ich Python 3.2 benutze.

Schau mal, welche Anweisung die unerwuenschte Ausgabe erzeugt und was du ausgibst.
Versuche Python mittels einer Lektüre zu lernen und da stand leider nichts davon, wie man den Ursprung der Ausgabe in der IDLE ausfindig macht. Soll das heissen es gibt sowas?


Naja, da ich noch ziemlicher Anfänger bin, konnte ich die Zeichen (',) in meiner Ausgabe nicht mit meinem Code erklären.

Und dann möchte ich natürlich Dank, für die Antworten, aiusschreiben. :D
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 27. Juli 2012, 17:44

Das schöne ist ja, dass du nicht alles nachlesen können musst, du kannst es einfach alles selber ausprobieren. Mit "nach der Anweisung schauen", war gemeint, dass du in deinen Code schauen sollst und nachvollziehst, welche Zeile Code für welche Zeile deiner Ausgabe verantwortlich ist. Am besten lässt du dir über jedem print einfach mal ausgeben, welchen Typ die Parameter haben:

Code: Alles auswählen

#statt
print(ausdruck)

#also
x = ausdruck
print type(x)
print x
Dann siehst du den Unterschied wahrscheinlich schon. Woraus es bei dir hinauslaufen wird ist der Unterschied zwischen

Code: Alles auswählen

print(1,2,3)
print((1,2,3))
Das Leben ist wie ein Tennisball.
quinto117
User
Beiträge: 5
Registriert: Donnerstag 26. Juli 2012, 22:24

Samstag 28. Juli 2012, 19:17

Die Teufelszeile war diejenige, welche die Variable für die Ausgabe definierte. Die lautete nämlich:

Code: Alles auswählen

a = (n-b)*'  ', (i+2*b)*'* '
Weil nun eigentlich mehrere Strings in dieser Variable vorkommen, kann man nicht, wie ich es zuerst dachte, mit Kommas verknüpfen. Sondern man muss die Strings schön mathematisch miteinander verketten:

Code: Alles auswählen

a = ((n-b)*'  ')+((i+2*b)*'* ')
Der gesamte Code sieht nun so aus:

Code: Alles auswählen

fehler = 1
a = "asdf"
b = 0
n = 0
while n <= 0:
    print("Was für eine Astanzahl wünschen Sie?")
    z = input()

    try:
        n = int(z)
    except:
        print("Sie müssen eine natürliche Zahl (ausser null) eingeben:")

print(type(n))




for j in range(1, n+1, 1):
    b = 0
    for i in range(1, j+1, 1):
        while (2*j+1)*'* ' not in a:
            a = ((n-b)*'  ')+((i+2*b)*'* ')
            print(a)
            b = b + 1

print((n+1)*" ", (j)*"* ", sep="")
print((n+1)*" ", (j)*"* ", sep="")
print((n+1)*" ", (j)*"* ", sep="")
print((n+1)*" ", (j)*"* ", sep="")
print((n+1)*" ", (j)*"* ", sep="")
Ausgabe:

Code: Alles auswählen

Was für eine Astanzahl wünschen Sie?
5
<class 'int'>
          * 
        * * * 
          * 
        * * * 
      * * * * * 
          * 
        * * * 
      * * * * * 
    * * * * * * * 
          * 
        * * * 
      * * * * * 
    * * * * * * * 
  * * * * * * * * * 
          * 
        * * * 
      * * * * * 
    * * * * * * * 
  * * * * * * * * * 
* * * * * * * * * * * 
      * * * * * 
      * * * * * 
      * * * * * 
      * * * * * 
      * * * * * 
Letzten Dank nochmals :mrgreen:
BlackJack

Samstag 28. Juli 2012, 19:33

@quinto117: Es mag zwar funktionieren, aber der Algorithmus ist nicht besonders gut. Die ``while``-Schleife und insbesondere die Bedingung davon ist sehr umständlich und ineffizient. Das sollte sich mit zwei ``for``-Schleifen ausdrücken lassen.

Die ”Variablendeklarationen” am Anfang sind unnötig. Man sollte Namen erst definieren wenn man sie benötigt, und nicht alle einmal am Anfang. Und man sollte auch keine willkürlichen Werte an Namen binden, die man überhaupt gar nicht verwendet. Wenn man den Quelltext liest muss man sich in Moment viel zu früh über den Namen `a` Gedanken machen und was der Wert 'asdf' wohl bedeuten mag um dann weiter unten im Quelltext zu sehen, dass der überhaupt nichts bedeutet sondern einfach nur unnötig war.

Der Schluss des Programms ist eindeutig ein Fall für eine Schleife. Quelltext der durch kopieren und einfügen entsteht ist immer ein Warnzeichen dass man über eine Schleife oder eine Funktion nachdenken sollte um gemeinsame Daten oder gemeinsamen Code heraus zu ziehen.
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 29. Juli 2012, 00:01

quinto117 hat geschrieben:Weil nun eigentlich mehrere Strings in dieser Variable vorkommen, kann man nicht, wie ich es zuerst dachte, mit Kommas verknüpfen. Sondern man muss die Strings schön mathematisch miteinander verketten:
Naja, mit Mathematik hat Verkettung jetzt nicht unbedingt viel zu tun. Es wird eben nur das +-Zeichen dafür verwendet. Viel wichtiget ist: hast du den Unterschied zwischen dem "+" und dem "," verstanden, bzw. was der Unterschied dieser beiden Operatoren ist?
Das Leben ist wie ein Tennisball.
Antworten