官方文档:
http://docs.micropython.org/en/latest/esp8266/genrst/index.html
官方logo

工欲善其事,必先利其器。如果要学习micropython,先要学习一下python的基础知识。网上资料一大堆,可以自己去看,而且下载一个python环境在交互界面学习也很方便。其次需要知道micropython和标准python的差异在哪里,本笔记翻译了官方文档中的一些内容。官方文档的其它内容有人已经翻译过了,可以在网上找”micropython中文教程”。
- 常量之后跟关键词必须用空格隔开 print(eval(‘1and 0’)不合法
- unicode 如:print(“\N{LATIN SMALL LETTER A}”) 这样的写法不合法
- 在提示错误时,将self也当做一个参数
- 在多重继承的多态性的表现和标准python有差异,举例:
class Foo: def __str__(self): return "Foo" class C(tuple,Foo): pass T=C((1,2,3)) print(T)标准python返回”Foo”,而micropython返回”(1,2,3)”
- 没有实现__del__方法 所以无法实现析构函数
- 在多重继承的对象中,super()只调用第一个对象的父类,为了尽量简单而采用的深度优先策略。
- 在使用@property修饰符的方法里调用super(),只能返回
,而不会返回正确的值。 class A: @property def p(self): return {"a":10} class AA(A): @property def p(self): return super().p a = AA() print(a.p)标准python返回{“a”:10} ,而micropython返回
- 当使用拆分函数参数时,如果不在参数的最后位置,会自动将拆分后的参数放到最后位置。
print((1,2),3) 准python返回(1,2,3) ,而micropython返回(3,1,2),关于拆分参数参考:http://www.jb51.net/article/92153.htm - 不支持函数的用户自定义变量
def f(): Pass F.x=0 print(f.x)准python输出0 ,而micropython执行报错。
- 带有 yield 的generator(生成器)中的上下文管理(with),不会执行__exit__()调用
class foo(object): def __enter__(self): print('enter') def __exit__(self,*args): print('exit') def bar(x): with foo(): while True: x += 1 yield x def func(): g = bar(0) for _ in range(3): print(next(g)) >>>func()标准python返回:
enter 1 2 3 exitMicropython返回:
enter 1 2 3 - 包的__path__属性类型不同,标准python为列表,micropython为字符串
- 当load模块失败时,还是会注册成功(没测试成功!!!)
- 不支持名字空间用分隔符表示目录的包。不要将模块放到相同的名字空间下的不同目录,micropython推荐3个模块搜索目录:当前应用目录,用户目录,系统目录。
- 不支持嵌套触发异常
try: raise TypeError except TypeError: raise ValueError - 给异常赋变量 e = Exception() e.x =0
- while循环发生异常时,异常提示的行号因为代码优化会不准确。
- 如果继承Exception并调用Exception.__init__会引起TypeError异常
- 不支持bytearray列表的切片操作
- 不支持bytes
print(bytes(‘abc’,encoding=’utf8’)) - 不支持步长不等于1的byte数组取数切片操作
print(b’123’[0:3:2]) - float的输出格式有不同。
- 有些情况无法转换成int类型
class A(int): __add__ = lambda self, other: A(int(self) + other) a = A(42) print(a+a)标准python输出:84 ,micropython报错:TypeError: can’t convert A to int
- to_byte的参数为float类型时得到错误的提示。
- 数列删除操作的步长只能为1
L= [1,2,3,4] del L[0:4:2] - 无法转换迭代到列表
L=[10,20] L[0:1] = range(4)标准python此时L为[0,1,2,3,20]
- 列表赋值的步长也只能是1
L= [1,2,3,4] l[0:4:2] = [5,6] - UnicodeDecodeError不会引发异常
- str.endswith(s,start)没有实现
- 不支持如print(‘{a[0]}’.format(a=[1, 2]))
- str()不支持关键字参数
str(b’abc’,encoding=’utf8’) - str.rsplit(None,n),不支持None作为第一个参数
- str的子类的实例不能和str的实例比较
class S(str): pass s= S('hello') print(s='hello')标准python为True,micropython为False
- 字符串切片的步长也只能为1 print(‘abcdefghi’[0:9:2])
- 元组切片步长也只能为1
- 无法查询int
import array print(1 in array.array('B', b'12')) - Array的删除不支持
- array的切片步长也必须是1
- 不支持collections的deque类
- json模块如果对象不可序列化,不会抛出异常。
- struct的pack函数不会检查参数是否有缺失(不会抛出异常)。
- 不能重载sys.stdin,sys.stdout,sys.stderr,因为这些都存放于只读存储中
Import sys sys.stdin = None
总结下来,尽量不要使用复杂的语法,尽量不要用多重继承,总之Simple is the best。
本人的更多原创文章请加入个人微信公众号。
