加载中…
个人资料
silex
silex
  • 博客等级:
  • 博客积分:0
  • 博客访问:5,711
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ESP8266学习笔记(二)Micropython和标准python的差异

(2017-06-02 14:57:07)
标签:

it

分类: MicroPython
官方文档:http://docs.micropython.org/en/latest/esp8266/genrst/index.html
      工欲善其事,必先利其器。如果要学习micropython,先要学习一下python的基础知识。网上资料一大堆,可以自己去看,而且下载一个python环境在交互界面学习也很方便。其次需要知道micropython和标准python的差异在哪里,本笔记翻译了官方文档中的一些内容。官方文档的其它内容有人已经翻译过了,可以在网上找“micropython中文教程”。
1,常量之后跟关键词必须用空格隔开
print(eval_r(‘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。

本人的更多原创文章请加入个人微信公众号。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有