由于之前学习以及项目中一直用的是python3.6.5,最近几天在学习之余看了一下python3.8的官方文档,了解了一下python3.8.x中新增的特性。以此来记录一下。
1.海象运算符
python3.8.x中新增了海象运算符:=,可以在局部代码块中的表达式给变量赋值,并且该变量可以用于该代码块中。该用法可以用于简化if语句以及列表推导等,下面是官方中给出的例子:(据说是因为通过了这个python特性而使得龟叔决定退出python管理层。。。)
# s = "python 3.8.3 test"
# 在if语句中使用
# if (n := len(s)) > 10:
# print(f"the length of s {n} is too long!") # 避免了使用两次len
#
# if (match := re.search(r"\d+", s)):
# print(match.group()) # 结合正则表达式进行使用,要是以前版本可能需要这样写:
#
# match = re.search(r"\d+", s)
# if match:
# print(match.group())
#
#
# def random_string(s1, s2):
# return s1 + s2
#
#
# 在列表推导中使用
# print([random_str.upper() for item in s if (random_str := random_string("t", item)) in s])
#
使用海象运算符可以在if语句的判断语句中定义变量,同时该变量可以在代码块中使用。或者是在列表推导中可以使用更复杂的函数来进行相关的判断。
2.f字符串的增强
# 自从python引入f-string以后,格式化字符串更方便,在python3.8.x中格式符串中形式为
# f'{expr=}' 的 f-字符串将扩展表示为表达式文本,加一个等于号,再加表达式的求值结果,可以更方便的用于调试和SQL语句等
# now = format(datetime.now(),"%Y-%m-%d %H:%M:%S")
# print(f"{now=}") # >>> now='2020-02-29 13:52:37'
# print(f"now={now}") # >>> now=2020-02-29 13:53:50之前版本的写法和输出结果,所有如果是SQL语句中之前的版本必须写成:
# print(f"now='{now}'") # >>> now='2020-02-29 13:54:46'
3.仅限位置参数
# """仅限位置参数"""
# python 3.8.x中在函数参数的关键字中增加了仅限位置参数/.
#
#
# def func(a, b, /, c, d, *, e, f): # 此时a, b为仅限位置参数,不能以key=word的形式传入,c,d则为关键字参数或者位置参数,e,f则为关键字参数
# print(a, b, c, d, e, f)
#
#
# func(10, 20, 30, d=40, e=50, f=60) # >>> 10 20 30 40 50 60
# func(a=10, b=20, 30, d=40, e=50, f=60) 错误的调用方式
# 引入仅限位置参数的好处在于可以更方便的重构函数,由于此时必须以位置参数的形式传入而不能以func(a=10, b=20, 30, d=40, e=50, f=60)的形式
# 调用,所以此时如果重构func的函数参数a,b等,外面调用的代码不需要改变.
#
#
# def func_kwargs(a, b, /, **kwargs):
# print(a, b, kwargs)
#
#
# func_kwargs(10, 20, a=30, b=40) # >>> 10 20 {'a': 30, 'b': 40},由于/左侧的形参不会被公开为关键字参数
# 所以在函数参数传递的时候仍然可用