我有一个学校作业,因此我们需要使用 PyCharm 并遵循有关 Python3 的 PEP8 和 Google 标准。虽然我的代码运行良好,但 PyCharm 声称行 [0] 的索引具有意外的值。
def create_matrix():
"""
Function made to create a matrix of who wins or who loses based on the number of figures in a game.
Keep in mind the order of the figures tuple. first element wins over second element, last element wins over
first element. an element also wins against the element two steps before it, in the case of five elements.
i haven't researched what relationships exist in higher dimensions, but there will always be an equal amount of
elements who beat you, as elements you beat. the missing element will be a draw.
"""
figures = ("Scissors", "Paper", "Rock", "Lizard", "Spock") # caution with order of elements
number_of_figures = len(figures) # expected to be an odd number
half_set = number_of_figures // 2 # half_set = int((n-1)/2)
win_and_lose = [+1, -1] # negative: row (player_b), positive: column (player_a), zero: draw
rows = [[None]*number_of_figures]*number_of_figures # uses same size in memory as a "full" set
rows[0] = [0] + win_and_lose*half_set # [0, -1, +1, -1, +1...]
for row in range(1, number_of_figures):
rows[row] = rotate(rows[row-1], 1)
# for row in range(0, len(rows)):
# print(rows[row])
return figures, rows
我已测试更改特定行,该行向我发出 lint 警告
rows[0][0], rows[0][1], rows[0][2], rows[0][3], rows[0][4] = [0] + win_and_lose*half_set # [0, -1, +1, -1, +1...]
并且代码可以在没有任何 lint 警告的情况下工作。我的问题是我希望元组的大小可以扩展。我知道我可以用 for 循环来做到这一点
for column in range(0, number_of_figures):
if column == 0:
rows[0][column] = 0
elif column % 2 == 0:
rows[0][column] = +1
elif column % 2 == 1:
rows[0][column] = -1
else:
raise Exception("Unexpected column value")
但是我对此有一些问题:
1)对于想要查看代码的人来说根本不可读。
2)当我现在尝试打印列表时,它已将所有行设置为 [0, -1, +1, +1, -1],而不仅仅是第一个元素,正如我所期望的那样。这不会导致任何运行时错误,但这不是我想要的。
我的问题是如何在不违反任何 Python 标准的情况下以 Pythonic 且易于阅读的方式编写这段代码。
额外问题:我想最小化我的代码的内存使用量,我已经通过 __sizeof__() 看到如果行包含五个值为 None 的元素,它使用 80 字节的内存。如果我有五个值为 [None、None、None、None、None] 的元素,则使用相同的大小。一旦我为矩阵设置了一些值,大小就保持不变。关于这个的任何提示?我已经设置了 rotate() 函数,以便我可以一次旋转列表 n 个位置,因此我可以跳到定义了第一行的任何给定行。
假设上面 DYZ 的注释在第一个解决方案中不存在,您可以使用类型提示来帮助 linter 理解行的类型。在我的代码中,这消除了 linter 警告。
rows = [[None]*number_of_figures]*number_of_figures # type: list #uses same size in memory as a "full" set
此语法也可用于 python 3:
rows:list = [[None]*number_of_figures]*number_of_figures
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句