MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。
MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。
MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。
使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。
总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
二、MicroPython 控制流语句try…except…finally 异常处理
MicroPython的控制流语句是指可以根据条件或循环来控制程序执行顺序的语句,如if、for、while、break、continue、pass等。控制流语句的主要特点有以下几点:
1、MicroPython的控制流语句与Python的控制流语句基本相同,只是在一些细节上有所区别,如MicroPython不支持match语句,而Python 3.10及以上版本支持。
2、MicroPython的控制流语句使用缩进来表示代码块,而不是使用花括号或其他符号,这使得代码更加简洁和清晰。
3、MicroPython的控制流语句可以嵌套使用,即在一个控制流语句中可以包含另一个控制流语句,以实现更复杂的逻辑。
控制流语句的应用场景有很多,例如:
1、用if语句可以根据条件来执行不同的代码块,如判断用户输入的密码是否正确,或者判断温度是否超过阈值等。
2、用for语句可以遍历一个序列或迭代器中的每个元素,并对每个元素进行相应的操作,如打印列表中的每个元素,或者计算字符串中的每个字符出现的次数等。
3、用while语句可以在条件为真时重复执行一个代码块,直到条件为假时停止,如实现一个猜数字游戏,或者计算一个数的阶乘等。
4、用break语句可以提前终止一个循环,如在查找一个元素时找到后就退出循环,或者在满足某个条件时就退出循环等。
5、用continue语句可以跳过当前循环的剩余部分,直接进入下一次循环,如在遍历一个列表时跳过某些不符合要求的元素,或者在计算一个数的因数时跳过偶数等。
6、用pass语句可以表示一个空的代码块,什么也不做,如在定义一个函数或类时暂时不写具体的实现,或者在一个分支中不需要执行任何操作等。
MicroPython的try…except…finally 异常处理是一种用于处理程序运行过程中可能发生的错误或异常的机制,可以提高程序的健壮性和可靠性。try…except…finally 异常处理的主要特点有以下几点:
1、MicroPython的try…except…finally 异常处理与Python的try…except…finally 异常处理基本相同,只是在一些细节上有所区别,如MicroPython不支持在finally子句中使用return语句或break语句,而Python支持。
2、MicroPython的try…except…finally 异常处理由三个部分组成:try子句、except子句和finally子句。其中,try子句是必须的,except子句和finally子句是可选的。
MicroPython的try…except…finally 异常处理的执行流程如下:
1、首先执行try子句中的代码,如果没有发生任何异常,跳过except子句和finally子句,继续执行后续的代码。
2、如果在try子句中发生了异常,根据异常的类型匹配相应的except子句,执行except子句中的代码,并在最后执行finally子句中的代码。
3、如果没有匹配到任何except子句,或者在except子句中发生了新的异常,该异常会被传递到外层的try语句或者全局作用域,如果没有被捕获,则导致程序终止。
4、如果在try子句或者except子句中有return语句或者break语句,它们会延迟到finally子句执行完毕后再执行。
finally子句无论是否发生异常都会被执行,通常用于释放资源或清理操作。
try…except…finally 异常处理的应用场景有很多,例如:
1、用于实现一些可能引发错误或异常的功能,如打开或写入文件、访问网络资源、转换数据类型等,并在发生异常时进行恰当的处理。
2、用于实现一些需要根据不同类型或情况的异常进行不同处理的功能,如根据不同的错误码显示不同的提示信息、记录不同级别的日志、抛出自定义的异常等。
3、用于实现一些需要无论是否发生异常都要执行某些操作的功能,如关闭文件、断开连接、释放锁等。
try…except…finally 异常处理的注意事项有以下几点:
1、MicroPython的try…except…finally 异常处理需要注意合理地选择捕获和处理哪些异常,避免使用过于宽泛或过于具体的异常类型,以免造成逻辑错误或意外结果。
2、MicroPython的try…except…finally 异常处理需要注意在except子句中尽量避免使用裸露的except语句(即不指定任何异常类型),因为这样会捕获所有类型的异常,包括系统异常和用户中断等,可能会掩盖一些重要的错误信息。
3、MicroPython的try…except…finally 异常处理需要注意在finally子句中尽量避免使用可能引发新异常或改变返回值或跳出循环等影响程序流程控制的语句,因为这样会导致程序逻辑混乱或难以调试。
以下是几个MicroPython的try…except…finally 异常处理实际运用程序案例:
案例一:实现一个简单的文件操作功能,可以打开一个文件,并向其中写入一些内容。
# 定义一个变量filename,用于存储文件名
filename = "test.txt"
# 定义一个变量content,用于存储要写入文件的内容
content = "Hello, world!"
# 定义一个变量f,用于存储文件对象,初始为None
f = None
# 用try...except...finally语句进行异常处理
try:
# 用open函数以写入模式打开文件,并赋值给f
f = open(filename, "w")
# 用write方法向文件中写入内容
f.write(content)
# 打印成功信息
print("写入文件成功。")
# 如果发生IOError异常,表示文件操作失败
except IOError:
# 打印错误信息
print("写入文件失败。")
# 无论是否发生异常,都要执行finally子句
finally:
# 如果f不为None,表示文件已经打开
if f is not None:
# 用close方法关闭文件
f.close()
# 打印关闭信息
print("关闭文件。")
案例二:实现一个简单的网络请求功能,可以向一个URL发送一个GET请求,并获取响应内容。
# 导入urequests模块,用于发送网络请求
import urequests
# 定义一个变量url,用于存储请求的URL
url = "https://httpbin.org/get"
# 定义一个变量response,用于存储响应对象,初始为None
response = None
# 用try...except...finally语句进行异常处理
try:
# 用get方法向URL发送一个GET请求,并赋值给response
response = urequests.get(url)
# 获取响应的状态码,并赋值给status_code
status_code = response.status_code
# 获取响应的内容,并赋值给content
content = response.text
# 打印状态码和内容
print("状态码:{}".format(status_code))
print("内容:{}".format(content))
# 如果发生OSError异常,表示网络请求失败
except OSError:
# 打印错误信息
print("网络请求失败。")
# 无论是否发生异常,都要执行finally子句
finally:
# 如果response不为None,表示响应已经获取
if response is not None:
# 用close方法关闭响应对象
response.close()
# 打印关闭信息
print("关闭响应。")
案例三:实现一个简单的数据转换功能,可以将一个字符串转换为整数,并返回转换后的结果。
# 定义一个数据转换函数,接受一个参数:字符串s
def convert(s):
# 定义一个变量result,用于存储转换后的结果,初始为None
result = None
# 用try...except语句进行异常处理(不需要finally子句)
try:
# 用int函数将字符串s转换为整数,并赋值给result
result = int(s)
# 打印成功信息和结果
print("转换成功。")
print("结果为:{}".format(result))
# 如果发生ValueError异常,表示字符串s不能转换为整数
except ValueError:
# 打印错误信息和原始数据
print("转换失败。")
print("原始数据为:{}".format(s))
# 返回result作为函数的返回值(如果转换失败,则返回None)
return result
# 调用数据转换函数,传入字符串"123",并赋值给r1
r1 = convert("123")
# 调用数据转换函数,传入字符串"abc",并赋值给r2
r2 = convert("abc")
案例四:处理除零错误:
def divide(a, b):
try:
result = a / b
print("结果:", result)
except ZeroDivisionError:
print("除零错误!")
finally:
print("执行finally块")
divide(10, 2) # 输出:结果: 5.0 \n 执行finally块
divide(10, 0) # 输出:除零错误! \n 执行finally块
这个示例定义了一个函数divide,它接受两个参数a和b,并尝试计算a除以b的结果。在try块中,如果没有出现除零错误,结果会被打印出来;如果出现除零错误,程序会跳转到except块中打印出错误信息。无论是否发生异常,finally块中的代码总会被执行。
案例五:处理文件操作异常:
try:
file = open("myfile.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件未找到!")
except IOError:
print("读取文件时发生错误!")
finally:
file.close() if 'file' in locals() else None
这个示例尝试打开一个文件并读取其内容。如果文件未找到,会跳转到FileNotFoundError的except块中打印出错误信息;如果在读取文件时发生其他IO错误,会跳转到IOError的except块中打印出错误信息。不管发生了哪种异常,finally块中的代码会确保文件被关闭。
案例六:处理用户输入异常:
try:
num = int(input("请输入一个整数:"))
result = 10 / num
print("结果:", result)
except ValueError:
print("输入不是有效的整数!")
except ZeroDivisionError:
print("除零错误!")
except Exception as e:
print("发生了未知错误:", str(e))
finally:
print("执行finally块")
这个示例尝试从用户获取一个整数并进行计算。在try块中,如果用户输入的不是有效的整数,会跳转到ValueError的except块中打印出错误信息;如果用户输入的是0,会跳转到ZeroDivisionError的except块中打印出错误信息;如果发生其他未知错误,会跳转到Exception的except块中打印出错误信息。不管发生了哪种异常,finally块中的代码总会被执行。
案例七:处理除零错误
def divide_numbers(a, b):
try:
result = a / b
print("结果:", result)
except ZeroDivisionError:
print("除零错误:被除数不能为零")
finally:
print("执行 finally 块")
divide_numbers(10, 2) # 正常情况,结果: 5.0,执行 finally 块
divide_numbers(10, 0) # 除零错误,打印除零错误消息,执行 finally 块
在这个案例中,函数 divide_numbers 接收两个参数,并尝试执行除法运算。在 try 块中,除法运算进行,如果除数为零,则会触发 ZeroDivisionError 异常。在 except 块中,捕获并处理该异常,打印出相应的错误消息。不管是否发生异常,都会执行 finally 块中的代码。
案例八:文件操作异常处理
try:
file = open("data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件未找到")
finally:
if file:
file.close()
print("执行 finally 块")
在这个案例中,尝试打开文件 “data.txt” 并读取其内容。如果文件未找到,会触发 FileNotFoundError 异常,在 except 块中捕获并打印出相应的错误消息。不管是否发生异常,都会执行 finally 块中的代码,确保文件的关闭操作。
案例九:处理类型错误
def square_number(number):
try:
result = number ** 2
print("平方结果:", result)
except TypeError:
print("类型错误:无法计算平方")
finally:
print("执行 finally 块")
square_number(5) # 正常情况,平方结果: 25,执行 finally 块
square_number("abc") # 类型错误,打印类型错误消息,执行 finally 块
在这个案例中,函数 square_number 接收一个参数,并尝试计算其平方。在 try 块中,平方计算进行,如果参数的类型不支持平方操作,则会触发 TypeError 异常。在 except 块中,捕获并处理该异常,打印出相应的错误消息。不管是否发生异常,都会执行 finally 块中的代码。
这些案例展示了 MicroPython 中使用 try…except…finally 异常处理语句的实际应用。通过使用这些语句,可以捕获并处理特定类型的异常,以及执行清理操作。请注意,在适当的位置使用 try…except…finally,以确保异常能够被正确处理,并在必要时执行清理操作。