2016-10-09 33 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