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

  工欲善其事,必先利其器。如果要学习micropython,先要学习一下python的基础知识。网上资料一大堆,可以自己去看,而且下载一个python环境在交互界面学习也很方便。其次需要知道micropython和标准python的差异在哪里,本笔记翻译了官方文档中的一些内容。官方文档的其它内容有人已经翻译过了,可以在网上找”micropython中文教程”。

  1. 常量之后跟关键词必须用空格隔开 print(eval(‘1and 0’)不合法
  2. unicode 如:print(“\N{LATIN SMALL LETTER A}”) 这样的写法不合法
  3. 在提示错误时,将self也当做一个参数
  4. 在多重继承的多态性的表现和标准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)”

  5. 没有实现__del__方法   所以无法实现析构函数
  6. 在多重继承的对象中,super()只调用第一个对象的父类,为了尽量简单而采用的深度优先策略。
  7. 在使用@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返回

  8. 当使用拆分函数参数时,如果不在参数的最后位置,会自动将拆分后的参数放到最后位置。
    print(
    (1,2),3) 准python返回(1,2,3) ,而micropython返回(3,1,2),关于拆分参数参考:http://www.jb51.net/article/92153.htm
  9. 不支持函数的用户自定义变量
    def f():
      Pass
    F.x=0
    print(f.x)
    

    准python输出0 ,而micropython执行报错。

  10. 带有 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
    exit
    

    Micropython返回:

    enter
    1
    2
    3
    
  11. 包的__path__属性类型不同,标准python为列表,micropython为字符串
  12. 当load模块失败时,还是会注册成功(没测试成功!!!)
  13. 不支持名字空间用分隔符表示目录的包。不要将模块放到相同的名字空间下的不同目录,micropython推荐3个模块搜索目录:当前应用目录,用户目录,系统目录。
  14. 不支持嵌套触发异常
    try:
      raise TypeError
    except TypeError:
      raise ValueError
    
  15. 给异常赋变量 e = Exception() e.x =0
  16. while循环发生异常时,异常提示的行号因为代码优化会不准确。
  17. 如果继承Exception并调用Exception.__init__会引起TypeError异常
  18. 不支持bytearray列表的切片操作
  19. 不支持bytes
    print(bytes(‘abc’,encoding=’utf8’))
  20. 不支持步长不等于1的byte数组取数切片操作
    print(b’123’[0:3:2])
  21. float的输出格式有不同。
  22. 有些情况无法转换成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

  23. to_byte的参数为float类型时得到错误的提示。
  24. 数列删除操作的步长只能为1
    L= [1,2,3,4]
    del L[0:4:2]
    
  25. 无法转换迭代到列表
    L=[10,20]
    L[0:1] = range(4)
    

    标准python此时L为[0,1,2,3,20]

  26. 列表赋值的步长也只能是1
    L= [1,2,3,4]
    l[0:4:2] = [5,6]
    
  27. UnicodeDecodeError不会引发异常
  28. str.endswith(s,start)没有实现
  29. 不支持如print(‘{a[0]}’.format(a=[1, 2]))
  30. str()不支持关键字参数
    str(b’abc’,encoding=’utf8’)
  31. str.rsplit(None,n),不支持None作为第一个参数
  32. str的子类的实例不能和str的实例比较
    class S(str):
      pass
    s= S('hello')
    print(s='hello')
    

    标准python为True,micropython为False

  33. 字符串切片的步长也只能为1 print(‘abcdefghi’[0:9:2])
  34. 元组切片步长也只能为1
  35. 无法查询int
    import array 
    print(1 in array.array('B', b'12')) 
    
  36. Array的删除不支持
  37. array的切片步长也必须是1
  38. 不支持collections的deque类
  39. json模块如果对象不可序列化,不会抛出异常。
  40. struct的pack函数不会检查参数是否有缺失(不会抛出异常)。
  41. 不能重载sys.stdin,sys.stdout,sys.stderr,因为这些都存放于只读存储中
    Import sys
    sys.stdin = None
    

    总结下来,尽量不要使用复杂的语法,尽量不要用多重继承,总之Simple is the best。
   本人的更多原创文章请加入个人微信公众号。