python2与python3的区别
1、字符编码(主要) py2: unicode(内部是unicode编码) ->压缩(utf8) str=bytes(根据压缩方式,可以是utf8,gbk等) name = u'小明' name = '小明' py3: str(内部是unicode编码) ->压缩(utf8) bytes(根据压缩方式,可以是utf8,gbk等) name = "小明" name = b'小明' 2、解释器编码(默认) py2: ascii py3: utf-8
示例
# _*_ coding:utf8 _*_ 声明让解释器使用utf8的格式去解析字符 ####### py2解释器默认ascii编码 ###### # 因为上面声明了# _*_ coding:utf8 _*_,因此这里的中文解释器会使用utf-8的格式去解析 # 若没有声明# _*_ coding:utf8 _*_,则解释器默认使用ascii去解析,ascii不能解析中文 name = '小明' # 这里没有添加 u ,python解释器执行的时候就会按照第一行的声明,使用utf8进行编码 name2 = u'小明' # 字符前加u,表明用现在是字符内部编码unicode name3 = u'小明'.encode('utf-8') # 自己声明使用什么格式去解析字符 print name, type(name) # 小明 <type 'str'>:解释器使用指定的utf8编码解析后的字符 print name2, type(name2) # 小明 <type 'unicode'>:字符内部编码unicode print name3, type(name3) # 小明 <type 'str'>:主动使用utf8编码解析后的字符
# py3解释器默认是 utf8编码 因此第一行可以不作声明 name = '狗明' # 未声明使用什么编码,则解释器使用默认的utf-8去编码 name2 = b'ming' # 这里不能写中文,使用 b 声明的字符默认是用ascii去解析,ascii不能解析中文 name3 = '狗明'.encode('utf-8') # 主动使用utf-8编码 print(name, type(name)) # 狗明 <class 'str'>:python3使用默认的utf-8编码解析后的字符 print(name2, type(name2)) # b'ming' <class 'bytes'>:使用ascii解析后的字符 print(name3, type(name3)) # b'\xe7\x8b\x97\xe6\x98\x8e' <class 'bytes'>:使用utf8解析后的字符
3、range和xrange python2: range(3) ---> [0,1,2] 列表 xrange(3) ---> 迭代器 pytohn3: range(3) ---> range(0,3) range类型,是可迭代对象,跟迭代器类似 4、经典类和新式类 继承了object的类就是新式类 在py3中所有的类都是新式类 在py2中既有新式类又有经典类 5、yield from(py2中无) def test(): yield 666 yield 999 def func(): yield 1 yield from test() yield 2 yield 3 gen = func() for line in gen: print(line) # 1 666 999 2 3 6、input python2中input输入的是什么类型,它就是什么类型 python3中input输入的无论是什么类型,它都是字符串类型 python2中与python3的input一样功能的是raw_input() 7、print py2: print '小明' py3: print('小明') 8、包 python2中,不是包不能相互导入模块 python3中不是包也可以导入 9、python3的新特性之类型注解 Python是一门动态语言,变量以及函数的参数是不区分类型。比如我们要实现一个数字相加的函数: def my_add(x, y): return x + y 但是这样的坏处是,别人不知道你要做的是数字相加的函数,别人输入字符串,一样是可以得到字符串的拼接的 于是 Python 3 提供了一个新的特性: 类型注解: def my_add(x:int, y:int) -> int: return x + y 语法: 参数:类型 指定函数的参数类型 -> 类型 指定函数的返回值类型。 注意:Python 解释器并不会因为这些注解而提供额外的校验, 也就是说,这些类型注解加不加,对你的代码来说没有任何影响,我一样可以输入字符串的。 只是这么做的好处是: 1.让别人看得更明白 2.当你输入str和float 类型的参数时,虽然一样不会报错可以得出结果,但是IDE工具会有高亮提示 10、f-string 1、介绍 f-string(formatted string literals):格式化字符串常量,是Python3.6新引入的一种字符串格式化方法,使格式化字符串的操作更加简便。 2、语法 f'xxx' 或 F'xxx' 且以大括号 {} 标明被替换的字段,{}里面可以是字符串或者表达式 3、简单替换字符串:{'字符串'} name = '小白' msg = f'我叫{name},今年{18}岁,性别{"男"}' print(msg) # 我叫小白,今年18岁,性别男 注意:若f使用的是单引号,那么里面的{}若是字符串则应该用双引号,反之一样 4、计算表达式:{表达式} ret = f"1 add 2 is {1+2}" print(ret) # 1 add 2 is 3 5、lambda表达式:{(lambda表达式) (参数)} 注意: lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符, 为避免歧义,需要将lambda表达式置于括号 () 内: func = f"my_add result:{(lambda x,y:x+y) (1,2)}" print(func) # my_add result:3 若不加括号则报错: func = f"my_add result:{lambda x,y:x+y (1,2)}" print(func) File "<fstring>", line 1 (lambda x,y) ^ SyntaxError: unexpected EOF while parsing