Python连接
我对以下代码非常着迷,这些代码应该非常简单,但不起作用:/Python连接,python,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._iteracione
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'
我正在将\u iteraciones
初始化为3
并将\u string\u repetir
初始化为'*'
输出结果是:
***
当我期待的时候:
*
**
***
我已经调试过了,在进行连接时,它只是连接了self。_string_a_repetir,而不是_string或换行符
这么简单的事情快把我逼疯了。相关的部分在这一部分:
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
用于将string
重复number
次
一般来说,您不应该以这种方式使用这些类成员:
class Triangulo_String:
_string = ''
_iteraciones = 0
_string_a_repetir = ''
这将创建这些成员作为类变量,这些变量在其所有实例中共享。如果从不更改类成员,这不会直接成为问题,但以后可能会导致混淆。您应该初始化\uuuu init\uuuu
中的所有实例属性:
class Triangulo_String:
def __init__(self, string_a_repetir, iteraciones):
self._string = ''
self._string_a_repetir = string_a_repetir
self._iteraciones = iteraciones
相关位在本部分中:
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
用于将string
重复number
次
一般来说,您不应该以这种方式使用这些类成员:
class Triangulo_String:
_string = ''
_iteraciones = 0
_string_a_repetir = ''
这将创建这些成员作为类变量,这些变量在其所有实例中共享。如果从不更改类成员,这不会直接成为问题,但以后可能会导致混淆。您应该初始化\uuuu init\uuuu
中的所有实例属性:
class Triangulo_String:
def __init__(self, string_a_repetir, iteraciones):
self._string = ''
self._string_a_repetir = string_a_repetir
self._iteraciones = iteraciones
您仅在末尾添加换行符。。您希望它们位于现有字符串和新字符串之间。您只在末尾添加换行符。。你想让它们介于现有字符串和新字符串之间。哇,我不知道你可以“乘”多次重复字符串。。。但是有一些问题:-1现在我得到了我的预期输出(**)的第二行,为什么-2为什么将变量初始化为类成员或在init中很重要?哦,糟糕,
i
以值0
开始,因此当然需要将字符串乘以i+1
,以便第一行已经得到一颗星。在回答中更正了它。至于类成员,它们在所有实例之间共享。如果您对原始代码执行了triangulao\u String.\u String='foo'
,则之后调用concatenar
的所有实例都将使用该值'foo'
作为\u String
的第一个值。因此,您将得到'foo*\n**\n***\n'
作为结果。这不太可能是需要的,因此您应该始终在\uuuu init\uuuuu
中初始化它。哇,我不知道您可以“乘法”多次重复字符串。。。但是有一些问题:-1现在我得到了我的预期输出(**)的第二行,为什么-2为什么将变量初始化为类成员或在init中很重要?哦,糟糕,i
以值0
开始,因此当然需要将字符串乘以i+1
,以便第一行已经得到一颗星。在回答中更正了它。至于类成员,它们在所有实例之间共享。如果您对原始代码执行了triangulao\u String.\u String='foo'
,则之后调用concatenar
的所有实例都将使用该值'foo'
作为\u String
的第一个值。因此,您将得到'foo*\n**\n***\n'
作为结果。这不太可能是需要的,因此您应该始终在\uuuu init\uuuu
中对其进行初始化。