
Tyree最近迷上了太空。他看了好多纪录片,能把八大行星的名字倒背如流,还知道木星上有大红斑,火星有太阳系最高的火山。
有一天他跟我说:“如果,我想做一个程序,输入行星名字,就能显示它的直径、距离太阳多远、有什么特点。就像一个小型天文百科,多好啊!”
我说:“这个主意好。我们可以用字典来存每个行星的信息,再用文件保存,以后想加新的星球直接改文件就行。”
他兴奋地说:“那我还要加一个功能——随机抽一个‘今日星球’,每天学习一个!”
接下来我们开干!今天我们就来做这个宇宙天体数据查询器。你会学到怎么用字典存储多组数据,怎么从文件读取并转换成字典,以及怎么让用户按名字查询或随机抽取。
01
先设计:一条天体数据存什么
首先我们要建一个文本,记录天体信息!每个天体里我们存四项信息:名称、直径(公里)、距离太阳(万公里)、有趣的特点。
我们把这些数据存到一个文本文件里,每行一个天体,用| 隔开(因为特点里可能有逗号,用竖线比较安全)。
新建一个命名space.txt 的文本,内容如下:
水星|4879|5791|最靠近太阳,白天热晚上冷,没有大气。
金星|12104|10820|有浓密的二氧化碳大气,温室效应严重,最热的行星。
地球|12756|14960|我们的家,唯一有生命的星球。
火星|6792|22794|有太阳系最高的火山——奥林帕斯山。
木星|139820|77857|太阳系最大的行星,有大红斑风暴。
土星|116460|143350|最漂亮的光环,密度比水还小(能浮在水上)。
天王星|50724|287250|侧着身子自转,像滚着走的球。
海王星|49244|449510|风暴速度最快,有太阳系最强烈的风。
Tyree一边敲一边说:“以后我还可以加冥王星,虽然它是矮行星。”我说行,你想加什么都行。
02
写函数:从文件读取数据,存成字典
我们要把文件里的每行数据读出来,转成一个字典。
字典的“键”是行星名字,“值”是它的各项信息(可以用小字典或列表)。这里我们用列表存三个值:直径、距离、特点。

下面来看下一些代码的注释:
data = {} 创建一个空字典。
with open(...)打开文件,'r' 只读模式。如果文件不存在,except 抓住错误并返回空字典。
循环里split("|") 把一行切成四块:名字、直径、距离、特点。
data[name] = {...}:用行星名字作为“钥匙”,后面跟一个字典,里面存直径、距离、特点。这样以后通过 data["地球"]["直径"] 就能拿到数值。
直径和距离用int() 转成整数,方便以后做比较(比如找出最大的行星)。
Tyree问:“为什么要再套一层字典?直接用三个变量不行吗?”我告诉他:如果你只有三五个行星,用三个列表也行。
但用字典的好处是,你想查“木星的特点”可以直接 data["木星"]["特点"],不用去记它在第几个位置。他试了试,觉得方便。
03
写查询函数:根据名字显示信息
用户输入行星名字(支持简繁体、大小写),程序从字典里找出信息并打印。

name in data 检查字典里有没有这个键。
如果有,取出信息字典,然后按字段打印。
如果没有,给个提示。Tyree说:“我想输入英文也能查。”我说可以加别名映射,但我们先做中文版,后面挑战你再自己扩展。
04
写随机抽取函数:今日星球
从所有行星中随机抽一个,打印它的信息,还可以加一句“今日幸运星球”。

代码中 list(data.keys()) 把字典的所有键(行星名字)变成一个列表。
random.choice 随机选一个。
然后打印信息。Tyree每天早上抽一个,说:“今天我属于土星,要戴光环。”
05
写比较函数:找出最大/最小行星
增加一个功能:找出直径最大或距离太阳最近的行星。

data.items() 返回 (键, 值) 的列表。
max(..., key=...) 是高级用法:用 lambda 指定按“直径”字段比较大小。
你可以扩展更多比较(如距离最远)。
Tyree看到木星的直径最大,得意地说:“果然木星老大。”
06
主菜单:把所有功能串起来
下面来作主程序,它的作用就是将几个功能代码块连起来:

前面定义的几个函数都用上了,形成了一个新的函数了。
07
完整代码(可直接运行)
下面把全部功能块连接起来,形成一个完整的程序代码,然后直接运行起来:
就是将上面那五个代码块按顺序放在一起:
def load_space_data():
def query_planet(data):
def random_planet(data):
def compare_planets(data, mode="max"):
def main():

运行后,可以选择查看各类 信息。自己输入要查看的行星 ,就会出现它的相关信息了。当然你还可以丰富一下里面的内容,让兴趣者可以得到更多的相关信息!
08
今天学到了什么
字典{}:用名字当钥匙,快速存取信息,不用记下标。
从文件构造字典:读取每行,解析成键值对,存入字典。
random.choice(list(data.keys())):随机抽取字典中的一个键。
max(data.items(), key=lambda x: x[1]["直径"]):找出字典里某个字段最大值对应的键值对(稍微进阶)。
数据与代码分离:行星数据存在文件里,想加新天体只需要改文件,不动代码。
Tyree把冥王星也加进去了,还加了一句“我可是被降级的”。他说:“以后我的电脑就是小型天文台。”
好了,今天课程就到这,下节课我们来作一个更有趣的项目:三体名言抽卡器!
————热门推荐————
自学编程第8课:turtle画对称图形(彩色螺旋、彩色对称花、等边三角形、五角星)
自学编程第7课:turtle画图入门(画一个正方形,五角形,螺旋形,三角形)
自学编程第2课:用input让电脑问你名字(做一个打招呼程序)
自学编程第一步:安装Python和Thonny(零基础图文教程)
(本系列教程每天更新,欢迎关注收藏)