Python 最小化大量变量

Python 最小化大量变量,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

所以,我做了一个基于文本的世界生成器作为一个爱好项目,我试图找到一种方法来最小化我拥有的变量量。下面是一段代码作为示例

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 # ~ ~ ~ ~ ~
这不是整个输出的外观,但这是构成世界的文本的关键。(这就是我所说的文字符号)

这些代表单词部分的文本符号被放入如下列表中

WO = ["~", "*", "o", "#"]

希望这是对文本符号的足够好的解释。

每当您有编号的变量名时,请考虑改用列表、元组或dict:

def generate():
    wo = list()
    for i in range(38):
        wo.append(random.randint(1, len(WO))-1)            
        print WO[wo[i]], 
如果编号变量的顺序很重要(通常如此),请使用元组或列表。如果对象是不可变的,则使用元组。如果对象需要变异,请使用列表

因此,在上面,没有变量
wo1
,…,
wo38
,而是有一个列表
wo
,其中包含项目
wo[0]
,…,
wo[37]

小提示:使变量名非常独特。避免变量名称仅因大小写不同而不同,如
wo
wo
。名字越相似,就越容易出现“高级时刻”并键入错误的名称<代码>数据和
日期
总是让我绊倒。此外,编写在发声时易于理解的代码也很好——可能对您来说并不重要,但对某些人来说可能非常重要


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

打印像这样的东西

* * # ~ * 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 * # * # # *

上图中,电路板是使用嵌套方式生成的

相当于

row = list()
for col in range(num_cols):
    row.append(random.choice(terrain))
这主要是一个简短的语法


另一个小提示:我通常发现最好将打印语句与计算分开。电路板的生成是一个计算过程。印制电路板的工作应该在别处进行。我使用
show
功能打印电路板,并使用
generate
生成电路板。这种职责分离将使您在重构代码时具有更大的灵活性,并且可以更好地控制何时执行这些操作


要生成无限多的行,我将使用:

一种更简单的方法是在while循环中调用
print

while True:
    print(' '.join([random.choice(terrain) for col in range(num_cols)]))

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

每当您对变量名进行编号时,请考虑使用列表、元组或dict:

def generate():
    wo = list()
    for i in range(38):
        wo.append(random.randint(1, len(WO))-1)            
        print WO[wo[i]], 
如果编号变量的顺序很重要(通常如此),请使用元组或列表。如果对象是不可变的,则使用元组。如果对象需要变异,请使用列表

因此,在上面,没有变量
wo1
,…,
wo38
,而是有一个列表
wo
,其中包含项目
wo[0]
,…,
wo[37]

小提示:使变量名非常独特。避免变量名称仅因大小写不同而不同,如
wo
wo
。名字越相似,就越容易出现“高级时刻”并键入错误的名称<代码>数据和
日期
总是让我绊倒。此外,编写在发声时易于理解的代码也很好——可能对您来说并不重要,但对某些人来说可能非常重要


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

打印像这样的东西

* * # ~ * 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 * # * # # *

上图中,电路板是使用嵌套方式生成的

相当于

row = list()
for col in range(num_cols):
    row.append(random.choice(terrain))
这主要是一个简短的语法


另一个小提示:我通常发现最好将打印语句与计算分开。电路板的生成是一个计算过程。印制电路板的工作应该在别处进行。我使用
show
功能打印电路板,并使用
generate
生成电路板。这种职责分离将使您在重构代码时具有更大的灵活性,并且可以更好地控制何时执行这些操作


要生成无限多的行,我将使用:

一种更简单的方法是在while循环中调用
print

while True:
    print(' '.join([random.choice(terrain) for col in range(num_cols)]))

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

源代码适用于需要它的人:

# -*- coding: utf-8
#Infinite world generator
#Thanks to unutbu for the concepts shown here.
import random, time, console

terrain = ["*", "#", "~", "~", "~", "o", "o", "o",
           "*", "~", "~", "~", "~", "o", "o", "o",
           "*", "~", "~", "~", "~", "o", "o", "o"]

def generate():
    num_cols = 30
    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.6)

def key():
    print "Key:"
    print "o = Landmass"
    print "# = Tree"
    print "* = Sand"
    print "~ = Water"

def menu():
    print "InfWorldGen v1.0.1"
    print "Type gen."
    start = raw_input("> ")
    if start == "gen":
        console.clear()
        key()
        print "[" + "=" * 61 + "]"
        board = generate()
        show(board)
menu()

感谢unutbu提供了这里的大部分概念。

源代码,适用于需要它的人:

# -*- coding: utf-8
#Infinite world generator
#Thanks to unutbu for the concepts shown here.
import random, time, console

terrain = ["*", "#", "~", "~", "~", "o", "o", "o",
           "*", "~", "~", "~", "~", "o", "o", "o",
           "*", "~", "~", "~", "~", "o", "o", "o"]

def generate():
    num_cols = 30
    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.6)

def key():
    print "Key:"
    print "o = Landmass"
    print "# = Tree"
    print "* = Sand"
    print "~ = Water"

def menu():
    print "InfWorldGen v1.0.1"
    print "Type gen."
    start = raw_input("> ")
    if start == "gen":
        console.clear()
        key()
        print "[" + "=" * 61 + "]"
        board = generate()
        show(board)
menu()

感谢unutbu提供了这里的大部分概念。

@unutbu这里是一个更短的方法,但它仍然做同样的事情:

import random, time

terrain = [
    "#", "o", "~", "*"
]

while True:
    world_tile = random.randint(1, len(terrain))-1
    print terrain[world_tile],
    time.sleep(0.1)

@unutbu这里是一个更短的方法,但它仍然做同样的事情:

import random, time

terrain = [
    "#", "o", "~", "*"
]

while True:
    world_tile = random.randint(1, len(terrain))-1
    print terrain[world_tile],
    time.sleep(0.1)

这里还有一个更短的方法

import random
while True:
    print(' '.join([random.choice(['#','o','~','*'])),

它可以无缝工作,只需三行代码。

这里还有一个甚至更短的方法

import random
while True:
    print(' '.join([random.choice(['#','o','~','*'])),

它无缝工作,只需三行代码。

是什么阻止了您使用循环?为什么要使用单独的变量?好吧,根据我对python的基本知识,除了将一行世界中的所有符号定义为变量之外,我不知道还有其他方法。是什么阻止了你使用循环?为什么要使用单独的变量?好吧,根据我对python的基本知识,除了将一行世界中的所有符号定义为变量之外,我不知道其他方法。这似乎是个好主意,我是一个编程高手,但我知道它是如何工作的。好主意尽管我如何向列表中添加文本符号之类的内容?您可以向列表中添加任何对象:
wo.append('Hello there')
。(呃,这就是你所说的“文本符号”的意思吗?)