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')
。(呃,这就是你所说的“文本符号”的意思吗?)