Python Crash Course 《Python编程 从入门到实践》之 “制作世界人口地图-JSON格式“
考研后开启Python学习的第十四天,今天终于打算开始记录自己Python的学习历程啦。
今日心得
学习编程,应当使用最新版本的教材,以免除代码落伍带来的麻烦。
今天我才发现,我使用的电子版教材是2016年7月份的第一版,而我买的纸质版是2020年10月份的第一版。(纸质版就没翻过两眼,要一边输代码一边扭头看解析真心太麻烦)。16版的教材已经四岁了,但是其中蕴含的知识大部分依然历久弥新,经典好用。
直到今天…
在学习“制作世界人口地图–json格式”的时候,顶行输入
from pygal.i18n import COUNTRIES
就会一直报错
No name ‘i18n’ in module ‘pygal’
这给我造成了不小的困惑,在查询后,才发现,Python的相关软件包在2018年前后更新迭代了,绘制地图的代码变成了
pygal_maps_world
所以,正确的导入COUNTRIES的代码是
from pygal_maps_world.i18n import COUNTRIES
我哥开玩笑说,这只是我“面向搜索引擎的编程”的开端。
但它在给我造成一定的麻烦的同时,也让我真正开始使用Gibhub,CSDN这样的网站,同时萌生了将自己的学习体会记录下来的想法。
下面,是做完“世界地图”这个小项目后,对应的代码:
import json
#json用于读取特定以对应格式存储的数据
import pygal
from pygal.style import RotateStyle
#RotateStyle需要十六进制的RGB颜色作为参数
from pygal.style import LightColorizedStyle
#让制作的图表方便印刷,让颜色变亮
#前两个字符代表红色分量
#中间两个字符代表绿色分量
#最后两个字符代表蓝色分量
#pagal用于绘图
#get_country_code是我们创建的,用于国家代码转换的函数
from country_code import get_country_code
#打开特定名称的文件
file_name = 'population_data.json'
with open (file_name) as f:
#json.load()将数据转换为Python能够处理的格式,这里是一个字典列表
pop_data = json.load(f)
#将文件转换到变量之中
cc_populations = {}
#创建一个存储国家缩写及其对应人口数的字典
for pop_dic in pop_data:
#指定年份2010的数据
if pop_dic['Year'] == "2010":
country_name = pop_dic['Country Name']
population = int(float(pop_dic['Value']))
code = get_country_code(country_name)
#if code:
# print(code + ": " + str(population))
#else:
# print("Error - " + country_name)
if code:
cc_populations[code] = population
#为了能够处理人口数据,我们将它转换为整数;
# 但元数据不一定都是整数,所以我们先把它把转换为浮点数,然后再用int()舍掉小数点后的东西
#为了能够print,我们又将它转换为字符串;
#print(country_name + ": " + str(population))
cc_pop_1, cc_pop_2, cc_pop_3 = {}, {}, {}
for code, cc_pop in cc_populations.items():
if cc_pop <= 10000000:
cc_pop_1[code] = cc_pop
elif cc_pop <= 1000000000:
cc_pop_2[code] = cc_pop
else:
cc_pop_3[code] = cc_pop
print(len(cc_pop_1), len(cc_pop_2), len(cc_pop_3))
wm_style = RotateStyle('#336699', base_style= LightColorizedStyle)
wm = pygal_maps_world.maps.World(style = wm_style)
wm.title = "World population in 2010, by Country"
#wm.add("2010", cc_populations)
wm.add('0-10m', cc_pop_1)
wm.add('10m-1bn', cc_pop_2)
wm.add('>1bn', cc_pop_3)
#2010是标签~
wm.render_to_file("World_population in 2010.svg")
我写的注释贼多,因为作为小白,第一次亦步亦趋完成代码后可能觉得自己已经懂了,但是回过头来,又要重走艰难的认知路。注释可以帮我极大地减轻这个问题。
运行这块代码,得到的结果是这样的: