for 循环前的字符串
String before for loop
所以我只是在看一个关于井字游戏的教程,因为我想知道你是否可以用 for 循环制作网格。在那里我看到了这条线。我了解 for 循环的工作原理,但如何在 for 循环之前放置一个“”,它是如何工作的?我也有点不确定第二个 for 循环。如果有人能给我解释一下就好了。
sefboard = [" " for i in range(9)]
print(sefboard)
for row in [sefboard[i*3: (i+1)*3] for i in range(3)]:
print("| " + " | " + " |")
首先让我们了解一下理解:
列表、字典、集合等可以通过理解来制作。基本上,理解就是采用生成器并使用它来形成一个新变量。生成器只是一个对象,每次迭代 returns 一个不同的值,因此以列表为例:要创建一个具有列表理解的列表,我们采用生成器输出的值并将它们放入它们自己的位置列表。以这个生成器为例:
x for x in range(0, 10)
这只会在第一次迭代时给出 0,然后是 1,然后是 2,以此类推。因此,为了使它成为一个列表,我们将使用 []
(列表括号),如下所示:
[x for x in range(0, 10)]
这将得到:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #note: range does not include the second input
对于字典和集合,我们使用 {}
,但由于字典使用 key-value 对,我们的生成器对于集合和字典是不同的。对于集合,它与列表相同:
{x for x in range(0, 10)} #gives the set --> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
但是对于字典,我们需要一个键和一个值。由于 enumerate
给出了两个项目,这在某些情况下对字典很有用:
{key: value for key, value in enumerate([1,2,3])}
在这种情况下,键是索引,值是列表中的项目。所以这给出:
{0: 1, 1: 2, 2: 3} #dictionary
它不构成集合,因为我们表示 x : y
这是字典中项目的格式,而不是集合。
现在我们可以分解一下:
这个:
" " for i in range(9)
只是一个returns 9个空格的生成器。由于它包含在列表括号 ([]
) 中,因此它构成了一个包含 9 个空格的列表。
这个:
[sefboard[i*3: (i+1)*3] for i in range(3)]
使用 sefboard[i*3: (i+1)*3]
一次获取 9 个空格中的 3 个,并通过 for i in range(3)
使其成为 3 行之一(生成器包含在列表括号 ([]
) 中)所以这给出了一个 3x3 的空间网格。
所以 for
循环:
for row in [sefboard[i*3: (i+1)*3] for i in range(3)]:
只是从 3x3 网格中获取每一行,以便它可以在每一行上打印:
print("| " + " | " + " |")
为什么要用这个?
此代码的输出等同于:
for _ in range(3):
print("| " + " | " + " |")
但是 sefboard
可能对更新电路板和打印空白电路板以外的内容很有用。 for
循环中可能会有更多行将使用 sefboard
而不仅仅是 print("| " + " | " + " |")
。我假设您提到的教程将解释为什么他们这样做而不是使用上面更简单的版本,或者在您观看视频的其余部分后在项目上下文中可能有意义。
所以我只是在看一个关于井字游戏的教程,因为我想知道你是否可以用 for 循环制作网格。在那里我看到了这条线。我了解 for 循环的工作原理,但如何在 for 循环之前放置一个“”,它是如何工作的?我也有点不确定第二个 for 循环。如果有人能给我解释一下就好了。
sefboard = [" " for i in range(9)]
print(sefboard)
for row in [sefboard[i*3: (i+1)*3] for i in range(3)]:
print("| " + " | " + " |")
首先让我们了解一下理解:
列表、字典、集合等可以通过理解来制作。基本上,理解就是采用生成器并使用它来形成一个新变量。生成器只是一个对象,每次迭代 returns 一个不同的值,因此以列表为例:要创建一个具有列表理解的列表,我们采用生成器输出的值并将它们放入它们自己的位置列表。以这个生成器为例:
x for x in range(0, 10)
这只会在第一次迭代时给出 0,然后是 1,然后是 2,以此类推。因此,为了使它成为一个列表,我们将使用 []
(列表括号),如下所示:
[x for x in range(0, 10)]
这将得到:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #note: range does not include the second input
对于字典和集合,我们使用 {}
,但由于字典使用 key-value 对,我们的生成器对于集合和字典是不同的。对于集合,它与列表相同:
{x for x in range(0, 10)} #gives the set --> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
但是对于字典,我们需要一个键和一个值。由于 enumerate
给出了两个项目,这在某些情况下对字典很有用:
{key: value for key, value in enumerate([1,2,3])}
在这种情况下,键是索引,值是列表中的项目。所以这给出:
{0: 1, 1: 2, 2: 3} #dictionary
它不构成集合,因为我们表示 x : y
这是字典中项目的格式,而不是集合。
现在我们可以分解一下:
这个:
" " for i in range(9)
只是一个returns 9个空格的生成器。由于它包含在列表括号 ([]
) 中,因此它构成了一个包含 9 个空格的列表。
这个:
[sefboard[i*3: (i+1)*3] for i in range(3)]
使用 sefboard[i*3: (i+1)*3]
一次获取 9 个空格中的 3 个,并通过 for i in range(3)
使其成为 3 行之一(生成器包含在列表括号 ([]
) 中)所以这给出了一个 3x3 的空间网格。
所以 for
循环:
for row in [sefboard[i*3: (i+1)*3] for i in range(3)]:
只是从 3x3 网格中获取每一行,以便它可以在每一行上打印:
print("| " + " | " + " |")
为什么要用这个?
此代码的输出等同于:
for _ in range(3):
print("| " + " | " + " |")
但是 sefboard
可能对更新电路板和打印空白电路板以外的内容很有用。 for
循环中可能会有更多行将使用 sefboard
而不仅仅是 print("| " + " | " + " |")
。我假设您提到的教程将解释为什么他们这样做而不是使用上面更简单的版本,或者在您观看视频的其余部分后在项目上下文中可能有意义。