我如何使用行和列在 python 中打印它?
How can i print this in python using rows and cols?
在 python 中,我现在真的很困惑如何应用行和列(编辑:列表)来创建这篇文章。我正在创建一个 class Piece
,它具有四个值(左、右、上和下)并随机生成(使用 randint(10, 99)
)。我也希望能够转动这件作品例如:
piece after 0 turns :
30
83 00 34
25
piece after 1 turns :
83
25 00 30
34
如果我理解正确的话,我就不会担心行和列了。我的 class 会在其构造方法 (__init__
) 中生成随机值以粘贴在列表 (vals = [top, right, bottom, left]
) 中,并且会有两种左右旋转的方法 (rotate_left
和rotate_right
) 和一种获取当前列表的方法 (get_vals
)。
import random as rn
class Piece():
def __init__(self):
#vals = [top, right, bottom, left]
self.vals = [rn.randint(10,99) for _ in range(4)]
self.n = 4
def rotate_left(self):
self.vals = [self.vals[i-self.n+1] for i in range(self.n)]
def rotate_right(self):
self.vals = [self.vals[i-1] for i in range(self.n)]
def get_vals(self):
return self.vals
使用此列表旋转只是将值向左或向右移动一个索引。
编辑: 这是用 python 3.4 编写的,但它也适用于 2.7。
我有一个类似的实现 - 除了使用生成器和 itertools
。
@wrkyle 所做的是他正在通过构建新列表来替换值。想象一下,如果你想旋转 1000000000 次。您必须构建一个新列表 1000000000 次。它的内存效率不是很高。
为了可伸缩性,我建议我们生成一个无限序列,并根据需要调用值。我设计了 rotate
方法,以便它接受一个参数来表示圈数;这样用户就不必使用任何循环来遍历这些片段 - 只需计算要移动多少个位置,并更新一次值。
from itertools import cycle, islice
from random import randint
class Piece:
def __init__(self):
self._values = cycle([randint(10, 99) for _ in range(4)])
self._turns = 0
def __str__(self):
positions = list(islice(self._values, 0, 4))
disp = (
"piece after %s turns:" % (self._turns) + "\n\n" +
" %s \n" % (positions[0]) +
"%s 00 %s\n" % (positions[3], positions[1]) +
" %s \n" % (positions[2])
)
return disp
def rotate(self, num_turns, direction="right"):
self._turns += num_turns
if direction == "right":
self._values = cycle(islice(self._values,
2 + num_turns % 4,
6 + num_turns % 4)
)
else:
self._values = cycle(islice(self._values,
0 + num_turns % 4,
4 + num_turns % 4)
)
现在如果你运行下面的代码,通过向右旋转 -
p = Piece()
# rotate 4 times
for _ in range(4 + 1):
print(p)
p.rotate(1, direction="right")
你得到:
piece after 0 turns:
57
86 00 89
14
piece after 1 turns:
86
14 00 57
89
piece after 2 turns:
14
89 00 86
57
piece after 3 turns:
89
57 00 14
86
piece after 4 turns: # confirm it returns to original position
57
86 00 89
14
当然可以把rotate
方法的默认参数改成"left",这样就向左旋转了。
在 python 中,我现在真的很困惑如何应用行和列(编辑:列表)来创建这篇文章。我正在创建一个 class Piece
,它具有四个值(左、右、上和下)并随机生成(使用 randint(10, 99)
)。我也希望能够转动这件作品例如:
piece after 0 turns :
30
83 00 34
25
piece after 1 turns :
83
25 00 30
34
如果我理解正确的话,我就不会担心行和列了。我的 class 会在其构造方法 (__init__
) 中生成随机值以粘贴在列表 (vals = [top, right, bottom, left]
) 中,并且会有两种左右旋转的方法 (rotate_left
和rotate_right
) 和一种获取当前列表的方法 (get_vals
)。
import random as rn
class Piece():
def __init__(self):
#vals = [top, right, bottom, left]
self.vals = [rn.randint(10,99) for _ in range(4)]
self.n = 4
def rotate_left(self):
self.vals = [self.vals[i-self.n+1] for i in range(self.n)]
def rotate_right(self):
self.vals = [self.vals[i-1] for i in range(self.n)]
def get_vals(self):
return self.vals
使用此列表旋转只是将值向左或向右移动一个索引。
编辑: 这是用 python 3.4 编写的,但它也适用于 2.7。
我有一个类似的实现 - 除了使用生成器和 itertools
。
@wrkyle 所做的是他正在通过构建新列表来替换值。想象一下,如果你想旋转 1000000000 次。您必须构建一个新列表 1000000000 次。它的内存效率不是很高。
为了可伸缩性,我建议我们生成一个无限序列,并根据需要调用值。我设计了 rotate
方法,以便它接受一个参数来表示圈数;这样用户就不必使用任何循环来遍历这些片段 - 只需计算要移动多少个位置,并更新一次值。
from itertools import cycle, islice
from random import randint
class Piece:
def __init__(self):
self._values = cycle([randint(10, 99) for _ in range(4)])
self._turns = 0
def __str__(self):
positions = list(islice(self._values, 0, 4))
disp = (
"piece after %s turns:" % (self._turns) + "\n\n" +
" %s \n" % (positions[0]) +
"%s 00 %s\n" % (positions[3], positions[1]) +
" %s \n" % (positions[2])
)
return disp
def rotate(self, num_turns, direction="right"):
self._turns += num_turns
if direction == "right":
self._values = cycle(islice(self._values,
2 + num_turns % 4,
6 + num_turns % 4)
)
else:
self._values = cycle(islice(self._values,
0 + num_turns % 4,
4 + num_turns % 4)
)
现在如果你运行下面的代码,通过向右旋转 -
p = Piece()
# rotate 4 times
for _ in range(4 + 1):
print(p)
p.rotate(1, direction="right")
你得到:
piece after 0 turns:
57
86 00 89
14
piece after 1 turns:
86
14 00 57
89
piece after 2 turns:
14
89 00 86
57
piece after 3 turns:
89
57 00 14
86
piece after 4 turns: # confirm it returns to original position
57
86 00 89
14
当然可以把rotate
方法的默认参数改成"left",这样就向左旋转了。