python3.6与3.7有什么区别_你应该知道的Python3.6、3.7、3.8新特性

很多人在学习了基本的Python语言知识后,就转入应用阶段了,后期很少对语言本身的新变化、新内容进行跟踪学习和知识更新,甚至连已经发布了好几年的Python3.6的新特性都缺乏了解。

本文列举了Python3.6、3.7、3.8三个版本的新特性,学习它们有助于提高对Python的了解,跟上最新的潮流。

一、Python3.6新特性

1、新的格式化字符串方式

新的格式化字符串方式,即在普通字符串前添加 f 或 F 前缀,其效果类似于str.format()。比如

name = "red"

print(f"He said his name is {name}.")

# 'He said his name is red.'

相当于:

print("He said his name is {name}.".format(**locals()))

此外,此特性还支持嵌套字段,比如:

import decimal

width = 10

precision = 4

value = decimal.Decimal("12.34567")

print(f"result: {value:{width}.{precision}}")

#'result: 12.35'

2、变量声明语法

可以像下面一样声明一个变量并指定类型:

from typing import List, Dict

primes: List[int] = []

captain: str # 此时没有初始值

class Starship:

stats: Dict[str, int] = {}

3、数字的下划线写法

允许在数字中使用下划线,以提高多位数字的可读性。

a = 1_000_000_000_000_000 # 1000000000000000

b = 0x_FF_FF_FF_FF # 4294967295

除此之外,字符串格式化也支持_选项,以打印出更易读的数字字符串:

'{:_}'.format(1000000) # '1_000_000'

'{:_x}'.format(0xFFFFFFFF) # 'ffff_ffff'

4、异步生成器

在Python3.5中,引入了新的语法 async 和 await 来实现协同程序。但是有个限制,不能在同一个函数体内同时使用 yield 和 await。Python3.6中,这个限制被放开了,允许定义异步生成器:

async def ticker(delay, to):

"""Yield numbers from 0 to *to* every *delay* seconds."""

for i in range(to):

yield i

await asyncio.sleep(delay)

5、异步解析器

允许在列表list、集合set 和字典dict 解析器中使用 async 或 await 语法。

result = [i async for i in aiter() if i % 2]

result = [await fun() for fun in funcs if await condition()]

6、新增加模块

标准库(The Standard Library)中增加了一个新的模块:secrets。该模块用来生成一些安全性更高的随机数,用于管理passwords, account authentication, security tokens, 以及related secrets等数据。

7、其他新特性

新的 PYTHONMALLOC 环境变量允许开发者设置内存分配器,以及注册debug钩子等。

asyncio模块更加稳定、高效,并且不再是临时模块,其中的API也都是稳定版的了。

typing模块也有了一定改进,并且不再是临时模块。

datetime.strftime 和 date.strftime 开始支持ISO 8601的时间标识符%G, %u, %V。

hashlib 和 ssl 模块开始支持OpenSSL1.1.0。

hashlib模块开始支持新的hash算法,比如BLAKE2, SHA-3 和 SHAKE。

Windows上的 filesystem 和 console 默认编码改为UTF-8。

json模块中的 json.load() 和 json.loads() 函数开始支持 binary 类型输入。

更多内容参考官方文档:What's New In Python 3.6

二、Python3.7新特性

Python 3.7于2018年6月27日发布, 包含许多新特性和优化,增添了众多新的类,可用于数据处理、针对脚本编译和垃圾收集的优化以及更快的异步I/O,主要如下:

用类处理数据时减少样板代码的数据类。

一处可能无法向后兼容的变更涉及处理生成器中的异常。

面向解释器的“开发模式”。

具有纳秒分辨率的时间对象。

环境中默认使用UTF-8编码的UTF-8模式。

触发调试器的一个新的内置函数。

1、新增内置函数breakpoint()

使用该内置函数,相当于通过代码的方式设置了断点,会自动进入Pbd调试模式。

如果在环境变量中设置PYTHONBREAKPOINT=0会忽略此函数。并且,pdb 只是众多可用调试器之一,你可以通过设置新的 PYTHONBREAKPOINT 环境变量来配置想要使用的调试器。

下面有一个简单例子,用户需要输入一个数字,判断它是否和目标数字一样:

"""猜数字游戏"""

def guess(target):

user_guess = input("请输入你猜的数 >>> ")

if user_guess == target:

return "你猜对了!"

else:

return "猜错了"

if __name__ == '__main__':

a = 100

print(guess(a))

不幸的是,即使猜的数和目标数一样,打印的结果也是‘猜错了’,并且没有任何异常或错误信息。

为了弄清楚发生了什么,我们可以插入一个断点,来调试一下。以往一般通过print大法或者IDE的调试工具,但现在我们可以使用 breakpoint()。

"""猜数字游戏"""

def guess(target):

user_guess = input("请输入你猜的数 >>> ")

breakpoint() //加入这一行

if user_guess == target:

return "你猜对了!"

else:

return "猜错了"

if __name__ == '__main__':

a = 100

print(guess(a))

在 pdb 提示符下,我们可以调用 locals() 来查看当前的本地作用域的所有变量。(pdb 有大量的命令,你也可以在其中运行正常的Python 语句)

请输入你猜的数 >>> 100

> d:\work\for_test\py3_test\test.py(7)guess()

-> if user_guess == target:

(Pdb) locals()

{'target': 100, 'user_guess': '100'}

(Pdb) type(user_guess)

zyiz_ma.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[你应该知道的Python3.6、3.7、3.8新特性]http://www.zyiz.net/tech/detail-134588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值