2016-10-09 65 views
0

我要瘋了下面的代碼應該是很容易的,但不工作:/的Python - 串聯

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' 

我初始化_iteraciones3_string_a_repetir'*'

而且輸出就是:

*** 

當我想到的問題:

* 
** 
*** 

我調試過它,當它連接時只是連接self._string_a_repetir,而不是_string和換行符。

這麼簡單的事情讓我瘋狂。

+0

你只是在最後加入新行。你希望他們在* *現有字符串和新之間。 –

回答

3

相關位是在這一部分:

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

讓我們通過迭代一個接一個:

# 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' 

正如你所看到的,這完全是預期發生的,因爲你永遠不每行重複該字符多次。而且,您還將前一個字符串與新字符串錯誤地連接起來(將它放在當前行的文本和換行符之間)。

你所尋找的是這樣的:

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

string * number工作重複stringnumber倍。


作爲一般的筆記,你不應該使用這些類成員的方式:

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

這將創建這些成員變量,這些變量在其所有實例共享。如果你從不改變班級成員,這並不是一個直接的問題,但可能會導致以後的混亂。而應該初始化__init__內的所有實例的屬性:

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

哇,我不知道你可以「繁殖」重複一個字符串多次...但有些問題: -1現在我得到我的預期輸出(**)的第二行 爲什麼? -2爲什麼要將變量初始化爲類成員或初始化? – Wrong

+0

噢,我的壞,'我'開始的值爲'0',所以當然你需要乘以'i + 1'的字符串,以便第一行已經得到一顆星。更正了答案。至於班級成員,這些都是在所有實例之間共享的。如果你用原始代碼做了'Triangulo_String._string ='foo'',所有後來調用'concatenar'的實例將使用''foo''作爲'_string'的第一個值。所以你會得到結果是'foo * \ n ** \ n *** \ n''。這不太可能是需要的,所以你應該總是在'__init__'中初始化它。 – poke

+0

好吧,非常感謝你^ - ^ – Wrong