2016-10-09 6 views
0

Ich werde verrückt mit dem folgenden Code, der wirklich einfach sein sollte, funktioniert aber nicht:/Python - verketten

class Triangulo_String: 

    _string = '' 
    _iteraciones = 0 
    _string_a_repetir = '' 

    def __init__(self, string_a_repetir, iteraciones): 
     self._string_a_repetir = string_a_repetir 
     self._iteraciones = iteraciones 

    def concatenar(self): 
     for i in range(0, self._iteraciones, 1): 
      self._string = self._string_a_repetir + self._string + '\n' 

Ich _iteraciones-3 und _string_a_repetir zu '*'

initialisieren und der Ausgang ist nur:

*** 

Wenn ich erwarte:

* 
** 
*** 

Ich habe es debuggt und wenn Sie die Verkettung tun verkettet es nur die self._string_a_repetir, nicht die _string noch den Zeilenumbruch.

Solch eine einfache Sache macht mich verrückt ._.

+0

Sie nur Zeilenumbrüche am Ende das Hinzufügen .. Sie wollen * zwischen * der vorhandenen Zeichenfolge und der neuen. –

Antwort

3

Das entsprechende Bit ist in diesem Teil:

for i in range(0, self._iteraciones, 1): 
    self._string = self._string_a_repetir + self._string + '\n' 

die durch die Iterationen einer nach dem anderen gehen lassen:

# Initially 
_string = '' 
_string_a_repetir = '*' 
_iteraciones = 3 

# i = 0 
_string = _string_a_repetir + _string + '\n' 
     = '*'    + ''  + '\n' 
     = '*\n' 

# i = 1 
_string = _string_a_repetir + _string + '\n' 
     = '*'    + '*\n' + '\n' 
     = '**\n\n' 

# i = 2 
_string = _string_a_repetir + _string + '\n' 
     = '*'    + '**\n\n' + '\n' 
     = '***\n\n\n' 

Wie Sie sehen können, ist dies völlig zu erwarten passieren, da man nie Wiederhole dieses Zeichen mehr als einmal pro Zeile. Und Sie verketten auch die vorherige Zeichenfolge falsch mit der neuen Zeichenfolge (platzieren Sie es zwischen dem Text der aktuellen Zeile und dem Zeilenumbruch).

Was Sie suchen, ist so etwas wie dieses:

for i in range(0, self._iteraciones, 1): 
    self._string = self._string + (self._string_a_repetir * (i + 1)) + '\n' 

Die string * number arbeitet die string für number mal zu wiederholen.


Als allgemeine Anmerkung, sollten Sie nicht diejenigen, die Teilnehmer auf diese Weise verwenden:

class Triangulo_String: 
    _string = '' 
    _iteraciones = 0 
    _string_a_repetir = '' 

Dies wird die Mitglieder als Klasse Variablen erstellen, die sich über alle seine Instanzen gemeinsam genutzt werden. Dies ist nicht direkt ein Problem, wenn Sie die Klassenmitglieder nie ändern, aber es könnte später zu Verwirrung führen. Sie sollten stattdessen alle Instanz initialisieren innerhalb der __init__ Attribute:

class Triangulo_String: 
    def __init__(self, string_a_repetir, iteraciones): 
     self._string = '' 
     self._string_a_repetir = string_a_repetir 
     self._iteraciones = iteraciones 
+0

Wow, ich wusste nicht, Sie können "multiplizieren", um eine Zeichenfolge mehrmals zu wiederholen ... aber einige Fragen: -1 Jetzt bekomme ich bis Zeile zwei meiner erwarteten Ausgabe (**) Warum? -2 Warum ist es wichtig, die Variablen als Klassenmitglieder oder in der Initialisierung zu initialisieren? – Wrong

+0

Oh, mein schlechtes, 'i' beginnt mit dem Wert' 0', also musst du natürlich den String mit 'i + 1' multiplizieren, so dass die erste Zeile bereits einen Stern bekommt. In der Antwort korrigiert. Wie bei den Klassenmitgliedern werden diese zwischen allen Instanzen geteilt. Wenn Sie 'Triangulo_String._string = 'foo' mit Ihrem ursprünglichen Code gemacht haben, würden alle Instanzen, die' concatenar' danach aufgerufen haben, diesen Wert '' foo'' als ersten Wert für '_string' verwenden. Also würdest du '' foo * \ n ** \ n *** \ n'' als Ergebnis bekommen.Dies ist wahrscheinlich nicht erwünscht, also sollten Sie es immer stattdessen in "__init__" initialisieren. – poke

+0

Aw okay, vielen Dank^- ^ – Wrong