python - 最小化大量变量

标签 python

所以,我正在制作一个基于文本的世界生成器作为一个业余项目,并且我正在尝试找到一种方法来最小化我拥有的变量的数量。以下是示例代码片段。

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].

小提示:让您的变量名非常独特。避免仅大小写不同的变量名称,例如 woWO。越是相似的名字,就越容易有“高级感”,打错。 datadate 总是让我感到困惑。此外,编写在发声时易于理解的代码也很好——也许对您来说不重要,但对某些人来说可能非常重要。


要生成随机世界,您可以使用列表列表来保存“文本符号”(地形):

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/

相关文章:

python - 获取 Numpy 数组的索引

python - 如何在 tkinter 的列表框中显示图像?

python - 如何仅绘制seaborn 热图的下三角?

python - 导入错误 Python 2.7。没有名为 : 的模块

python - 如何在C++中展平颜色直方图?

python - 如何转换Tensorflow循环中的循环?

python - SGDRegressor() 不断地不提高验证性能

python-Binance api : APIError(code=-1013): Filter failure: LOT_SIZE

python - 如何计算我需要多少哈希值才能找到冲突?

python - 有太多专门的异常;这是一个问题吗?