目前,我正在开发历史模拟游戏,我已经开始使用txt
个文件了。
不幸的是,我当前的程序没有定义字典,也没有运行__init__
函数。
nation = {
### Key : [Strength,Speed,Intelligence,Magic,Cosmic] ###
'Castile':[21,21.26,"De Tratsamana","Madrid",""],
'Aragon':[17,24.18,"De Tratsamana","Valencia",""],
'Portugal':[14,12.84,"De Avis","Lisbon",""],
'France':[27,20.75,"Valois","Paris",""],
'England':[27,31.42,"Lancaster","London",""],
'Austria':[15,16.48,"Hapsburg","Wien",""],
'Ottomans':[26,28.65,"Osmanoglu","Constantine",""],
'Venice':[15,16.79,"Elected position","Venezia",""],
'Poland':[18,14.87,"Jagellion","Krakow",""]
}
#Placing the vaiables into a text file
myfile = open('nation.txt','w')
myfile.write('Castile' + '\n')
nationinfo1 = str(nation['Castile'])
myfile.write(nationinfo1 + '\n')
myfile.write('Aragon' + '\n')
nationinfo2 = str(nation['Aragon'])
myfile.write(nationinfo2 + '\n')
myfile.write('Portugal' + '\n')
nationinfo3 = str(nation['Portugal'])
myfile.write(nationinfo3 + '\n')
myfile.write('France' + '\n')
nationinfo1 = str(nation['France'])
myfile.write(nationinfo1 + '\n')
myfile.write('England' + '\n')
nationinfo2 = str(nation['England'])
myfile.write(nationinfo2 + '\n')
myfile.write('Austria' + '\n')
nationinfo3 = str(nation['Austria'])
myfile.write(nationinfo3 + '\n')
myfile.write('Ottomans' + '\n')
nationinfo1 = str(nation['Ottomans'])
myfile.write(nationinfo1 + '\n')
myfile.write('Venice' + '\n')
nationinfo2 = str(nation['Venice'])
myfile.write(nationinfo2 + '\n')
myfile.write('Poland' + '\n')
nationinfo3 = str(nation['Poland'])
myfile.write(nationinfo3 + '\n')
myfile.close()
class nation():
def __init__(r1,nation):
#Hero's nation is the key ie. Iron Man or Thor
r1.nation = input("Please enter nation the name of the Nation")
#attributes are the items in the dictionary
r1.army = nation[r1.nation][0]
r1.money = nation[r1.nation][1]
r1.dynasty = nation[r1.nation][2]
r1.capital = nation[r1.nation][3]
r1.marries = nation
#prints all nation information
print('nation :',r1.nation,'\nArmy Size:',r1.army,'\nDucat Treasury:',r1.money,'\nDynasty :',r1.dynasty ,'\nCapital :',r1.capital,)
答案 0 :(得分:0)
对于初学者来说,这不是一个不常见的问题:尝试使用您所知道的内容创建新功能,并且可以从难以用初学者编写的文档中猜测。不幸的是,这是有经验的程序员往往会留下的问题,所以有些评论可能看起来没有用。如评论中所示,您的命名存在一些问题,我将在接下来尝试帮助解决这些问题。
我从您的代码中想要创建Nation
个对象(我将这个名称大写,因为它在Python中很常见,以此表示类名),每个都有引用的属性。评论为力量,速度,智力,魔法和宇宙,但代码为army
,money
,dynasty
和capital
。我无法推断出Cosmic和married
应该做什么,所以我只能希望接下来的内容足以让你自己解决这个问题。
我希望你已经看到,对于同一件事有不同的名字令人困惑。让不同的东西拥有相同的名称更令人困惑,但作为一个初学者,我理解你很难掌握足够的东西来准确理解哪个名称指的是什么对象。如果有任何安慰,我的兄弟,他是一个超出我能力的数学家,目前在学习Python时遇到类似的问题。但是,考虑到这一点,名称nation
肯定在您的代码中看起来有点过度。
一个类通常不会使用交互式输入来初始化自己,并且您可能会接受编写类似操作的程序并不是一个好主意。由于您正在尝试写出每个国家/地区的详细信息,因此我假设您要为每个国家/地区创建一个对象,并将其详细信息打印到该文件中。如果这是错的,那么我很抱歉 - 下次,请说明您在问题中希望的内容; - )
让我们从数据开始,您将看到我的名字已更改,以反映它包含所有国家数据的事实:
nation_data = {
### Key : [Strength,Speed,Intelligence,Magic,Cosmic] ###
'Castile':[21,21.26,"De Tratsamana","Madrid",""],
'Aragon':[17,24.18,"De Tratsamana","Valencia",""],
'Portugal':[14,12.84,"De Avis","Lisbon",""],
'France':[27,20.75,"Valois","Paris",""],
'England':[27,31.42,"Lancaster","London",""],
'Austria':[15,16.48,"Hapsburg","Wien",""],
'Ottomans':[26,28.65,"Osmanoglu","Constantine",""],
'Venice':[15,16.79,"Elected position","Venezia",""],
'Poland':[18,14.87,"Jagellion","Krakow",""]
}
循环遍历字典中的所有键非常简单(尽管您不能假设它们按任何特定顺序发生),如下所示。在这个循环中,我只打印出力量和资本:
for nation_name in nation_data:
nation = nation_data[nation_name]
print(nation_name, nation[0], nation[3])
在我的系统上打印
Castile 21 Madrid
Aragon 17 Valencia
Portugal 14 Lisbon
France 27 Paris
England 27 London
Austria 15 Wien
Ottomans 26 Constantine
Venice 15 Venezia
Poland 18 Krakow
但我不能保证订单对您来说是一样的。我确定可以同意,nation[0]
这样的术语并不能帮助读者理解正在使用的数据。关于类的真正好的事情之一是它们允许您按名称引用对象的数据(通常称为属性)。
接下来的问题是如何将列表中的每个项目转换为对象。在这里,我将假设,因为我已经演示了如何生成所有nation_names,所以在类__init__
方法中不需要执行任何输入,因为国家名称可以是方法的参数。实际上,这是一个非常常见的Python习惯用法:在调用类时传递一堆参数,以便__init__
方法可以将它们存储为实例属性。在您的特定情况下,这将使类看起来像下面的内容。
您将观察到该类只有两种方法。当您要求其字符串值时,将调用对象的__str__
方法。我将married
参数设为__init__
默认值,因此如果您不想要,则不必在创建新国家时提供值。
class Nation:
"Represent what's important about a nation."
def __init__(self, name, army, money, dynasty, capital, married=""):
"Initialise the instance attributes."
self.name = name
self.army = army
self.money = money
self.dynasty = dynasty
self.capital = capital
self.married = married
def __str__(self):
return "Nation: {}: Army: {}; Money: {}; Dynasty: {}; Capital: {}; Married: {}".format(
self.name, self.army, self.money, self.dynasty, self.capital, self.married)
我现在可以创建一个国家并打印它。你应该找到这个代码
n1 = Nation("Bitgravia", 20, 200, "Tang", "Information City")
print(n1)
打印
Nation: Bitgravia: Army: 20; Money: 200; Dynasty: Tang; Capital: Information City; Married:
了解所有这些,创建Nation
实例是一项非常简单的任务。要将它们存储在名为nations
的dict中(因为它存储了Nation对象,这似乎是一个合理的名称),你可以写:
nations = {}
for name, data in nation_data.items():
nations[name] = Nation(name, data[0], data[1], data[2], data[3], data[4])
事实上,Python的开发人员预计需要将列表中的每个成员作为一堆参数传递,因此相同的代码可以更紧凑地编写为
nations = {}
for name, data in nation_data.items():
nations[name] = Nation(name, *data)
无论是哪种实施,
for nation in nations.values():
print(nation)
呈现
Nation: Castile: Army: 21; Money: 21.26; Dynasty: De Tratsamana; Capital: Madrid; Married:
Nation: Aragon: Army: 17; Money: 24.18; Dynasty: De Tratsamana; Capital: Valencia; Married:
Nation: Portugal: Army: 14; Money: 12.84; Dynasty: De Avis; Capital: Lisbon; Married:
Nation: France: Army: 27; Money: 20.75; Dynasty: Valois; Capital: Paris; Married:
Nation: England: Army: 27; Money: 31.42; Dynasty: Lancaster; Capital: London; Married:
Nation: Austria: Army: 15; Money: 16.48; Dynasty: Hapsburg; Capital: Wien; Married:
Nation: Ottomans: Army: 26; Money: 28.65; Dynasty: Osmanoglu; Capital: Constantine; Married:
Nation: Venice: Army: 15; Money: 16.79; Dynasty: Elected position; Capital: Venezia; Married:
Nation: Poland: Army: 18; Money: 14.87; Dynasty: Jagellion; Capital: Krakow; Married:
所有剩下的,如果重要的话,是确保城市以所需的顺序出现(按照您想要的顺序构建它们的列表,迭代该列表并使用名称在{{中查找相关项目) 1}})并将数据写入您的文件(一种方法是添加一个nations
方法,该方法将文件作为参数并将Nation.write
写入文件后跟换行符。
我希望这有助于您了解问题的结构化答案。像往常一样,我做出了其他人可能做出不同选择的选择,但总的来说,这是一个相当的" Pythonic"解决问题的方法。
我后来意识到我应该指出,因为各国都有他们的名字,除非你真的需要通过名字来查找他们的国家名单。所以你也可以写
str(self)
这将简化打印代码
nations = []
for name, data in nation_data.items():
nations.append(Nation(name, *data))