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 ,此时已经进行了编码
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'xe7x8bx97xe6x98x8e' <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