Python■你应该知道的Python3.6、3.7、3.8新特性( 五 )


  • asyncio模块的调试模式 。 这为异步操作提供了更详细的日志记录和异常处理 , 而异常操作可能很难调试或推理 。
  • 面向内存分配器的调试钩子 。 这对于编写CPython扩展件的那些人很有用 。 它能够实现更明确的运行时检查 , 了解CPython如何在内部分配内存和释放内存 。
  • 启用faulthandler模块 , 那样发生崩溃后 , traceback始终转储出去 。
6、 高精度时间函数Python 3.7中一类新的时间函数返回纳秒精度的时间值 。 尽管Python是一种解释型语言 , 但是Python的核心开发人员维克多?斯廷纳(Victor Stinner)主张报告纳秒精度的时间 。 最主要的原因是 , 在处理转换其他程序(比如数据库)记录的时间值时 , 可以避免丢失精度 。
新的时间函数使用后缀_ns 。 比如说 , time.process_time()的纳秒版本是time.process_time_ns() 。 请注意 , 并非所有的时间函数都有对应的纳秒版本 。
7、其他新特性
  • 字典现在保持插入顺序 。 这在 3.6 中是非正式的 , 但现在成为了官方语言规范 。 在大多数情况下 , 普通的 dict 能够替换 collections.OrderedDict
  • .pyc 文件具有确定性 , 支持可重复构建 —— 也就是说 , 总是为相同的输入文件生成相同的 byte-for-byte 输出 。
  • 新增contextvars模块 , 针对异步任务提供上下文变量 。
  • __main__中的代码会显示弃用警告(DeprecationWarning) 。
  • 新增UTF-8模式 。 在Linux/Unix系统 , 将忽略系统的locale , 使用UTF-8作为默认编码 。 在非Linux/Unix系统 , 需要使用-X utf8选项启用UTF-8模式 。
  • 允许模块定义__getattr__、__dir__函数 , 为弃用警告、延迟import子模块等提供便利 。
  • 新的线程本地存储C语言API 。
  • 更新Unicode数据到11.0 。
三、Python3.8新特性Python3.8版本于2019年10月14日发布 , 以下是 Python 3.8 相比 3.7 的新增特性 。
1、海象赋值表达式新的语法 := , 将值赋给一个更大的表达式中的变量 。 它被亲切地称为 “海象运算符”(walrus operator) , 因为它长得像海象的眼睛和象牙 。
“海象运算符” 在某些时候可以让你的代码更整洁 , 比如:
在下面的示例中 , 赋值表达式可以避免调用 len () 两次:
if (n := len(a)) > 10:\t
   print(f\"List is too long ({n elements expected <= 10)\")

类似的好处还可体现在正则表达式匹配中需要使用两次匹配对象的情况中 , 一次检测用于匹配是否发生 , 另一次用于提取子分组:
discount = 0.0\tif (mo := re.search(r'(\\d+)% discount' advertisement)):\t
   discount = float(mo.group(1)) / 100.0

此运算符也可用于配合 while 循环计算一个值 , 来检测循环是否终止 , 而同一个值又在循环体中再次被使用的情况:
# Loop over fixed length blocks\twhile (block := f.read(256)) != '':\t
   process(block)

或者出现于列表推导式中 , 在筛选条件中计算一个值 , 而同一个值又在表达式中需要被使用:
[clean_name.title() for name in names\t

if (clean_name := normalize('NFC' name)) in allowed_names


请尽量将海象运算符的使用限制在清晰的场合中 , 以降低复杂性并提升可读性 。
2、仅限位置形参新增一个函数形参语法 /