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编码解析后的字符
py2示例
# 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解析后的字符
py3示例

 

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

 

posted @ 2021-07-28 21:32  我用python写Bug  阅读(130)  评论(0编辑  收藏  举报