【问题标题】:using for loops to create variables with different names使用 for 循环创建具有不同名称的变量
【发布时间】:2016-04-10 21:22:25
【问题描述】:

我正在尝试使用 for 循环来创建 5 个(当前)变量。我想将这些变量命名为 士兵+i,其中 i 是 for 循环中迭代的数字。

    first_names=['name1', 'name2', 'name3', 'name4', 'name5']
    last_names=['Lname1', 'Lname2', 'Lname3', 'Lname4', 'Lname5']
    nick_names=['1','2','3','4','5']
    soldier_HPs=[10,9,8,7,6]
    for i in range(5):
        soldier+i=[first_names[i-1],last_names[i-1],nick_names[i-1],soldierHPs[i-1]] 

如您所见,我想通过命名士兵“士兵+(各自的编号)”来存储每个士兵。然后将其健康、名字、姓氏和昵称都存储为列表的一部分。我遇到的问题是它不能连接字符串和整数。问题是这应该是变量的名称。如果我只希望这是一个设置变量的字符串,我可以使用:x="soldier" + str(i)。但同样,由于这是一个变量的名称,这将不起作用。

【问题讨论】:

  • 你了解过数组吗?
  • 它们是 Python 中的列表,而不是数组。不过,您仍然应该使用它们。
  • 是的,我已经了解了数组。我现在实际上正在使用数组来存储士兵的位置以及高低掩体。我没有想过使用数组来存储数据,其中每个 y 代表一个士兵,每个 y 代表一个不同的特征。我可能会问我的工程老师他认为什么是最好的。再次感谢您的帮助,如果您有任何其他想法,请告诉我。

标签: python variables naming


【解决方案1】:

欢迎来到 Stackoverflow!我注意到你作为一名高中生的个人资料,所以我不会假设你有任何先验知识。那么让我们来回答您的问题。

您在 Python 中使用lists 来存储有关士兵的信息。然后你想分别存储每个士兵的信息。现在,这不是很多余吗?

如果我想要第一个士兵的名字,我可以直接选择first_name[0]。所有信息都可以通过有意义的变量名(即 first_names、last_names 等)在当前范围内访问。如果你把它们放在一个列表中,你必须记住第一个索引是first_names,第二个是last_names,等等。随着你的程序/游戏代码变得越来越大,这些又增加了一层混乱。

但是,在某些情况下,将字符信息分组以进行迭代确实更方便。在 Python 中有一个名为 collections 的模块,您可以在其中找到一个名为 namedtuple 的函数。这个函数就是所谓的factory function,它的唯一目的就是为你声明和定义类。

假设我想快速定义一个Soldier 类,方法如下

from collections import namedtuple

Soldier = namedtuple('Soldier', ['first_name', 'last_name', 'nick_name', 'HP'])
soldier_info = [ # this is list comprehension
    Soldier(first_names[idx], last_names[idx], nick_names[idx], soldier_hps[idx])
    for idx in range(len(first_names))
]

那你就可以了

firstname_second_soldier = soldier_info[1].first_name

namedtupletuple 一样是不可变和可散列的,但具有命名字段。

【讨论】:

  • 感谢您的帮助。现在你解释了,我有一个包含每一位数据的列表的方式,加上每个士兵的列表是非常多余的。我目前并不特别希望使用新模块。虽然我会记住这个模块,并且将来会参考您的评论来这样做。目前,我希望在研究这些其他模块之前突破内置函数和 Tkinter 的界限,以帮助我构建我的 python 基础,以便我将来更容易使用和理解新模块。如果我对此模块有任何疑问,我会告诉你。
【解决方案2】:

为什么不用字典?

first_names=['name1', 'name2', 'name3', 'name4', 'name5']
last_names=['Lname1', 'Lname2', 'Lname3', 'Lname4', 'Lname5']
nick_names=['1','2','3','4','5']
soldier_HPs=[10,9,8,7,6]
soldiers = {}
for i in range(5):
    soldiers['soldier' + str(i-1)] = (first_names[i-1],last_names[i-1],nick_names[i-1],soldier_HPs[i-1])

士兵将拥有价值

{'soldier2': ('name3', 'Lname3', '3', 8), 'soldier3': ('name4', 'Lname4', '4', 7), 'soldier0': ('name1', 'Lname1', '1', 10), 'soldier1': ('name2', 'Lname2', '2', 9), 'soldier-1': ('name5', 'Lname5', '5', 6)}

【讨论】:

  • 为什么不只是[ ['name1', 'Lname1', '1', 10], ..., ['name5', Lname5', '5', 6] ],让规范索引成为关键?是否需要使用字符串键?
【解决方案3】:

这对你来说可能有点太高级了,但我认为了解面向对象编程的概念并尽快了解它们是件好事。一个可能的解决方案是创建一个士兵class,如下所示:

class Soldier(object):

    def __init__(self,first_name,last_name,nickname,hp):
        self.first_name = first_name
        self.last_name = last_name
        self.nickname = nickname
        self.hp = hp

    def __repr__(self):
        return str(self.nickname)


soldier_one = Soldier('name1','lname1','1',10)

print soldier_one ## 1
print soldier_one.first_name ## name1
print soldier_one.hp ## 10

soldier_two = Soldier('name2','lname2','2',9)

等等。如果您对这种方法有任何疑问,请告诉我 - 一开始它不太直观,但我真的希望我在开始使用 Python 时能更认真地对待它。

【讨论】:

  • 非常感谢。我以前听说过类,但我认为我从未使用过它们。浏览您的代码,我理解它,我认为我可以在我的代码中很好地使用它。在我收到的回复中,我计划使用您的解决方案,因为我同意越早了解课程越好。我的第一个问题是您在士兵“__repr__(self): 下定义的第二个函数:您能解释一下为什么需要这部分吗?从那以后我一直在编写代码,如果您希望我将完整版本发送给您,以便您查看整个代码让我知道。
  • @SWMC 是的,我应该在这方面提供更多信息。没有必要在类中定义 __repr__(self) 方法 - 但这样做基本上告诉 Python 解释器“每次你被告知要引用这个类时,使用它的这个 表示(这是__repr__ 代表什么。)所以,如果我没有定义 __repr__ 方法,在 print soldier_one 的行上,它会打印 <__main__.Soldier object at 0x0189A510> 而不是 1。但是因为我告诉了 __repr__方法来返回士兵的昵称,如果调用过,它会打印1
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多