所以,我正在制作一个基于文本的世界生成器作为一个业余项目,并且我正在尝试找到一种方法来最小化我拥有的变量的数量。以下是示例代码片段。
import time, random
class WorldGen(object):
def generate():
wo1 = random.randint(1, len(WO))-1
#This list of variables continues to wo38
print WO[wo1], #So on and so forth to WO[wo38]
time.sleep(0.5)
generate()
start = WorldGen()
start.generate()
基本上,我在这里要问的问题是:如何以任何方式缩短 38 个变量的列表,例如循环或类似的东西?如果我没有提供足够的信息,请说明您可能需要了解更多信息。以下是输出示例。
# o o o ~ * * ~
* o # ~ ~ ~ ~ ~
这不是整个输出的样子,但这是构成世界的文本的关键。 (这就是我所说的文本符号的意思)
# = Tree
~ = Water
* = Sand
o = Land
这些代表单词部分的文本符号被放在这样的列表中。
WO = ["~", "*", "o", "#"]
希望这是对文本符号的足够好的解释。
最佳答案
每当您对变量名称进行编号时,请考虑使用列表、元组或字典代替:
def generate():
wo = list()
for i in range(38):
wo.append(random.randint(1, len(WO))-1)
print WO[wo[i]],
如果编号变量的顺序很重要(通常如此),请使用元组或列表。如果对象是不可变的,请使用元组。如果需要改变对象,请使用列表。
因此,在上面,您将拥有一个列表 wo
,而不是变量 wo1
、...、wo38
,其中包含项目 wo[0]
, ..., wo[37]
.
小提示:让您的变量名非常独特。避免仅大小写不同的变量名称,例如 wo
和 WO
。越是相似的名字,就越容易有“高级感”,打错。 data
和 date
总是让我感到困惑。此外,编写在发声时易于理解的代码也很好——也许对您来说不重要,但对某些人来说可能非常重要。
要生成随机世界,您可以使用列表列表来保存“文本符号”(地形):
import random
terrain = ["~", "*", "o", "#"]
def generate():
""" Generate a random board represented by a list of lists """
num_rows, num_cols = 3, 38
board = [[random.choice(terrain) for col in range(num_cols)]
for row in range(num_rows)]
return board
def show(board):
print('\n'.join([' '.join(row) for row in board]))
board = generate()
show(board)
打印类似的东西
* * # ~ * o * o o * o * # ~ * ~ * * * * * o * o ~ * ~ o ~ * * * * o o # * #
o ~ ~ # ~ # * ~ # * ~ o # o ~ # ~ * # o ~ # ~ * o * # ~ ~ o # o o ~ ~ * o ~
o # # o * o ~ # * o ~ # ~ o ~ # * ~ ~ ~ # * o * # ~ ~ * o ~ ~ o * # * # # *
上面,电路板是使用嵌套 list comprehensions 生成的.
row = [random.choice(terrain) for col in range(num_cols)]
相当于
row = list()
for col in range(num_cols):
row.append(random.choice(terrain))
它主要只是一个较短的语法。
另一个小提示:我通常发现将打印语句与计算分开会更好。董事会的产生是一个计算。电路板的打印应该在别处完成。我使用show
函数来打印电路板,并使用generate
来生成电路板。这种职责分离将使您在重构代码时更加灵活,并能更好地控制何时执行这些操作。
要生成无限多的行,我会使用 generator function :
import random
import time
terrain = ["~", "*", "o", "#"]
def generate():
""" Generate a random board represented by a list of lists """
num_cols = 38
while True:
yield [random.choice(terrain) for col in range(num_cols)]
def show(board):
for row in generate():
print(' '.join(row))
time.sleep(0.5)
board = generate()
show(board)
更简单的方法是在 while 循环中调用 print
:
while True:
print(' '.join([random.choice(terrain) for col in range(num_cols)]))
但在赞扬了计算与打印分离的优点之后,我觉得有必要向您展示生成函数解决方案。
关于python - 最小化大量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825125/