我们在编写代码时,可能会出现一些意外的情况,比如:打开一个指定路径下的文件,却发现该路径下没找个这个文件;做一个简单除法计算,却发现不小心给除数赋值为0,导致根本就没法进行计算等等,这些都会导致程序不能正确运行,产生错误。
1. 错误的类型
一般来说,程序的错误主要包括:语法错误、运行错误和逻辑错误:
语法错误(Syntax errors):是指编写的代码不符合Python语言的要求,解释器无法识别和解析,又称之为解析错误(parsing errors)或者说编译(complaint)错误。这类错误一般借助IDE(Integrated Development Environment,集成开发环境)中的静态语法检查插件功能就能识别,错误信息还输出文件名与错误代码所在行号,能非常准确地定位到错误位置。
运行错误(Runtime errors):是指程序在执行过程中产生的错误,比如除数为0、索引操作越界等,通常也称之为“Bug”。
逻辑错误(Logic errors):是指程序结果在逻辑上不正确,但未报告为错误,导致程序偏离编程的本意,可以认为是程序本身的设计缺陷“trap”。逻辑错误不会导致程序崩溃,表现不明显,因此其开发人员很难识别和解决该错误,一般需要借助于对程序的跟踪调试。
2. 异常的处理
异常(Exception)是指由于程序本身设计问题或者执行环境而引发的错误,程序执行过程中的任何意外都是异常,即使Python程序的语法是正确的。
Python使用try-except结构化异常处理语句来捕获并处理程序异常,完整的语法结构如下:
try:
# 可能会引发异常的代码块
statements
except Except_Typeas except_var:
# 异常处理代码,可以有多个except子句
statements
else:
# 可选子句,没有异常出现时执行
statements
finally:
# 可选子句,定义清理操作
statements
try-except语句的工作原理如下:
首先,执行try子句(try和except关键字之间的代码);
如果没有触发异常,则跳过except子句,try语句执行完毕;
如果执行try子句时发生了异常,则跳过触发异常代码后面剩余部分,进而与except关键字后面的异常类型(Except_Type)进行比对,如果发现异常的类型匹配成功,则执行except子句,最后,再继续执行try-except语句之后的代码。
如果发生的异常不是except子句中列示的异常,则将其传递到的try-except语句外部;如果一直没有找到处理程序,则它是一个未处理异常,语句执行将终止。
3. 调试程序
调试程序(Debugging)是程序员的基本功,在软件开发过程中,调试代码花费时间甚至比编写代码要花的时间还要多。当发生程序运行错误、逻辑错误时,我们往往很难一眼判断问题出在哪里,这时,最好的办法就是为程序设置断点(break point),单步执行,逐一排查问题。
调试程序的步骤大致包括:设置断点、配置/启动调试环境、跟踪程序执行、修复Bug等。

4. 通过API获取数据
API(Application Programming Interface)指应用程序编程接口,服务器端通过API可以提供服务、发布数据,客户端通过调用API可以实现功能调用、查询信息等。API的使用无处不在,比如酒店预订、天气/股票查询等。如今,越来越多的Web应用面向开发者也开放了API,如人脸识别、语音合成等,API已然成为数字平台的支柱。

Python内置的urllib模块提供给了基本的获取网络资源处理功能,其中的urllib.request子模块主要用于从客户端向服务器发起访问请求。
本案例中,我们主要将用到urllib.request.urlopen( )函数向服务器发起一个HTTP请求,得到一个JSON格式的经纬度坐标数据,urlopen( )的原型如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,capath=None, cadefault=False, context=None)
5.API查询城市经纬度
创建湖南省人口分布地图时候,需要指定各地州市在地图上的经纬度,pyecharts允许用户使用自创建的坐标文件,也可以使用pyecharts自带的(坐标文件是一个名为city_coordinates.json的json格式文件),这对一些坐标标注不全或不准确的场景下非常有用。天地图查询行政区域的经纬度API地址形如:
http://api.tianditu.gov.cn/v2/administrative?keyword=长沙市&childLevel=0&&tk=您的密钥
程序流程图,以及通过HTTP Request发送API调用请求及服务器返回的JSON数据格式如下图所示:
6.创建城市人口分布GEO地图
1)获取湖南省14个地州市的人口数
读取数据的过程与读取全国人口数相似,Excel文件转存为csv时,可以删除掉“全省”统计汇总行数据。这里,也只需要前两列数据,对应的字典key名称为:city和population,如下图所示:
获取湖南省14个地州市的人口数的核心代码如下:
2)zip函数组合列表
本任务中要将城市名称和对应的人口数组合成一对“X-Y”坐标的值。前面的学习已经知道:字典的视图对象dict.keys( )、dict.values( )提供了单独从key和单独从value的角度看字典值的视角,如果我们又需要将分列的key和value两个序列组合到一起呢?
使用zip( )函数是不二选择。zip(*iterables)用于创建一个聚合了来自多个可迭代对象中的元素的迭代器,它会将可迭代对象按从左至右的顺序求值,返回一个多元素的元组,其中的第i个元组包含来自每个可迭代对象的第i个元素。
zip( )函数就像是我们衣服的拉链,把左右两边两个相关联的数据序列进行一一匹配组合,但zip( )函数返回的是一个zip对象,并不是一个列表,可以用list( )、tuple( )函数把这个对象转成列表或者元组。
3)创建人口分布GEO地图
所需数据准备好后就可以根据需要创建人口数据GEO地图了,详细代码如下:
pyecharts所有方法均支持链式调用,通过一系列的方法对Geo( )对象进行配置和初始化。
首先,通过init_opts进行GEO地图的初始化,使用本地JS文件③;
其次,通过链式调用add_schema( )方法设置地图为一张湖南省地图⑤,通过add_coordinate_json( )方法将我们自己创建的地理坐标经纬度文件添加到GEO地图⑦,通过add( )方法将准备好的嵌套列表数据data_pair配置为地图数据系列⑧;
然后,通过set_series_opts( )设置系列配置⑯,对标签文字进行格式化设置,在地图上显示城市的名字;
最后,通过set_global_opts( )设置全局配置⑲,包括标题/副标题名称、以及通过opts.VisualMapOpts配置了视觉映射/调节该滑块,可以控制在地图上显示的最大值和最小值区间内的城市人口信息。
所有配置完成后,就可以调用geo对象的render( )㉙方法,生成一个本地HTML文件,打开该文件将会显示创建好的人口分布地图。
URL、URI、URN - 你知道它们的区别吗?

1)URI
URI代表统一资源标识符。它标识网络上的逻辑或物理资源。URL和URN是URI的子类型。URL定位资源,而URN命名资源。
URI由以下部分组成:
方案:[//权威]路径[?查询][#片段]
2)URL
URL代表统一资源定位器,是HTTP的关键概念。它是网络上唯一资源的地址。它可以与其他协议(如FTP和JDBC)一起使用。
3)URN
URN代表统一资源名称。它使用urn方案。不能使用URNs来定位资源。图中给出的一个简单示例由一个名称空间和一个特定于名称空间的字符串组成。
——转自公众号文章【ByteByteGo】www.bytebytego.com
9种HTTP请求方法

1【GET】此方法从服务器检索资源。它是幂等的,多个相同的请求返回相同的结果。
2【PUT】此操作会更新或创建资源。它是幂等的,多个相同的请求将更新相同的资源。
3【POST】这是用来创建新资源的。它不是幂等的,所以两次相同的POST将重复创建资源。
4【DELETE】这是用来删除资源的。它是幂等的,多个相同的请求将删除相同的资源。
5【PATCH】PATCH方法对资源进行部分修改。
6【HEAD】HEAD方法要求与GET请求相同的响应,但没有响应正文。
7【CONNECT】CONNECT方法建立到由目标资源标识的服务器的隧道。
8【OPTIONS】这描述了目标资源的通信选项。
9【TRACE】这将沿着到目标资源的路径执行消息环回测试。
——转自公众号文章【ByteByteGo】www.bytebytego.com