Skip to main content
 首页 » 编程设计

python之最小化大量变量

2025年05月04日11artech

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

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

但在赞扬了计算与打印分离的优点之后,我觉得有必要向您展示生成函数解决方案。