我正在做一些关于列表理解和*
使用的练习。我想我知道这是怎么回事,但我发现很难用具体的语言来表达。你怎么解释b
?
我不确定如何理解空字符串的作用或(7-i)
在b中的原因。
a = [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]
b = [' ' * 2 * (7 - i) + 'very' * i for i in a]
for line in b:
print(line)
非常感谢!
可以用for循环替换列表推导式:
b=[]
for i in a:
nextline = ' ' * 2 * (7 - i) + 'very' * i
b.append(nextline)
推导式所做的实际上是在开始处添加空白,这取决于i
。
您可以将this:' ' * 2
替换为this:' '
(两个空格),并且仍然得到相同的结果。本质上,(7-i)
显示了一定数量的空白字符,无论i
实际上是什么。
让我们把语句分成几个独立的部分:
b = [' ' * 2 * (7 - i) + 'very' * i for i in a]
循环部分是最后一部分:
for i in a
这只是说我们应该遍历a
的值,并为每个条目执行语句的其余部分。
' ' * 2 * (7 - i) + 'very' * i
这是对a
中的每个值执行的实际语句。在这两种情况下,这都是一个被乘以的字符串——这意味着它被重复了乘以的次数:
' ' * 2 * (7 - i)
重复单个空格2 * (7 - i)
次;这意味着它在字符串前面添加0 (2 * (7 - 7)
)到12 (2 * (7 - 1)
)个空格。它们乘以2
的原因是因为字符串very
是四个字符,所以为了居中,你需要在它前面加length / 2
空格。
'very' * i
这意味着very
被重复i
次,这将是1
,2
,3
等次数。
+
将两个字符串合并,得到[0,12]空格,然后very
重复n次。
当i
= 1时:
' ' * 2 * (7 - 1)
=>12个空间very * 1
=>very
very
如果i是2,空格的数量减少2(7 - 2现在是5),而very
会重复一次(veryvery
):
veryvery
您的列表推导式从列表a
中获取每个元素i
(在本例中,它们都是整数),然后将' ' * 2 * (7 - i) + 'very' * i
的值作为元素存储在新列表b
中。
当字符串与整数i
相乘时,该字符串重复i
次。因此,在您的示例中,' ' * 2 * (7 - i)
意味着空格(不是空字符串!)被重复2 * (7 - i)
次。例如,对于第二个元素i = 2
,这意味着2 * (7 - 2) = 10
空格。
所以第二部分是'very' * i
,工作方式相同。例如,第二个元素i = 2
,字符串'very'
重复两次。
当添加两个字符串时,它们被连接在一起。所以你的第二个元素现在有10个空格和两倍的单词'very'
——>' veryvery'
.
对a
中的其他数字做同样的操作,你得到
b = [
' very',
' veryvery',
' veryveryvery',
' veryveryveryvery',
' veryveryveryveryvery',
' veryveryveryveryveryvery',
'veryveryveryveryveryveryvery',
' veryveryveryveryveryvery',
' veryveryveryveryvery',
' veryveryveryvery',
' veryveryvery',
' veryvery',
' very']
基本上是这样一步一步来的:
b = [' ' * 2 * (7 - i) + 'very' * i for i in a]
i
在经过a时改变了值:所以它的值是1,然后是2,以此类推
以i
的值为1
为例,构造如下字符串:两个空格" " + " "
7-1乘以(所以基本上是12个空格)然后我们连接very
1次(i次)