还在撸Python3.7,Python3.9新鲜出炉,菜鸟哥带你尝鲜解读

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了! 其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。 但是呢,新版本出来了一定要体验一下,看看都有哪些改动和优化,说不定哪个新特性就能解决你手里的大问题。

1

新的特性

1).import异常

我们在进行模块的相对引用时,可能会遇到这个错误提示:ValueError: Attempted relative import beyond toplevel package。简单来说这个问题是由于引用的模块超出了顶层目录的层级结构所导致的,这个问题不理解也没关系,因为跟python3.9的特性更改关系不大。

我们只要知道,python3.9中对这类错误的raise类型进行了调整,当遇到这类错误的时候,会提示ImportError而不再是ValueError,PR如图所示:

这个改动的最大好处就是当遇到这类问题时,系统会明确告诉你是由import模块引发的。

2).__file__路径

我们知道,在python中可以使用__file__、sys.argv[0]、sys.path[0]等方法获取当前脚本的所在路径,只不过在命令行模式下使用前两个命令获取到的都是相对路径,只有第三个命令可以获取脚本的绝对路径。 我们用以前版本的的python运行下面这段代码:
import sys
print(__file__)
print(sys.argv[0])
print(sys.path[0])

得到结果如下:

而如果使用python3.9来运行结果就不一样了(下图),他对__file__和sys.argv[0]都做了调整,使其返回值全部为绝对路径。

3).replace修复

replace是字符串处理中的常用函数,他的原型其实是这样的:

str.replace(old, new[, max])
其中max是可选参数,意思是替换不超过max次。 但是在之前的python版本中,如果对空值进行这种形式的替换会有一点问题,例如下面这段代码,它的输出结果仍然为空。
s = ''
s = s.replace('', 'python39', 1)
print(s)
而在python3.9中对这一问题进行了修正,除非max赋值为0,否则会进行正常的替换操作。 这一改动对bytes和bytearray对象同样适用。


2

模块改动

Python3.9并没有为我们带来新的内置模块,但是对一些模块进行了修改,我们挑选几个使用相对较多的进行说明。

1).ast

ast这个概念大家可能比较陌生,一般来说我们很少有机会用到它,我们只需要知道ast对象是类似一种树形的语法结构。 来看下面这段代码,他的作用就是把print(3+5)转换成ast对象并打印。
import ast
func_def = 'print(3+5)'
r_node = ast.parse(func_def)
print(ast.dump(r_node))

先使用之前的版本来运行,看看下图中的输出结果。我们不用看内容,单从输出格式而言,这串代码既没有换行也没有缩进,看起来很费劲。

而python3.9则对这一问题进行了解决,它在dump()方法中新增了一个参数 indent,代表的是首行缩进的字符长度,我们对上述代码进行少许修改:
import ast
func_def = 'print(3+5)'
r_node = ast.parse(func_def)
print(ast.dump(r_node, indent=2))

然后用python3.9来运行,结果如下,这次看起来是不是舒服多了。

2).asyncio

在python3.9中,新增了一个名为shutdown_default_executor()的协程,它的作用就是等待ThreadPoolExecutor中的所有线程执行完毕,为默认线程安排关闭时间。
需要注意的是,调用此方法后,如果在默认线程中调用loop.run_in_executor()方法,将会引发RuntimeError。

此外,如果我们使用了asyncio.run()类的方法,那么shutdown_default_executor()将会自动调度。也就是说,对于asyncio的一般使用者来说,python3.9的改变并不会带来什么实质性影响。

3).threading

我们知道,在python的子解释器中是不支持守护线程的,在之前的版本中,如果一个线程是从子解释器中调用的守护线程,那么将会导致python程序的崩溃。
在python3.9中,遇到这种情况会引发RuntimeError,这相当于对整个程序加了一层保护。

4).pprint

Python3.9对pprint的修改主要体现在增加了对types.SimpleNamespace的支持。types.SimpleNamespace严格来说是一个简单的对象子类,为了便于理解我们可以简单地把他看作一个数据结构。
下面我就来看看在之前的版本和python3.9中,对types.SimpleNamespace的数据进行pprint结果有什么不同,先来看一段代码:
import pprint
from types import SimpleNamespace
K = [str(i) for i in range(10)]
L = [str(i)*20 for i in range(10)]
D = dict(zip(K, L))
sn = SimpleNamespace(**D)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(sn)
其中变量sn返回的是一个命名空间,其结构类似于一个dict字典,来看用之前版本的python运行脚本的输出结果:

再来看python3.9中使用pprint的输出结果(下图),这下知道区别在哪了吧。

此外,python3.9中还对其他几个模块进行了修改,例如venv、os等,不过有些改动只针对特定操作系统(比如linux),这里不再一一罗列了。

3

其他优化

除了上面提到的一些改动,python3.9还对一些比较底层的东西进行了优化,这部分内容我想大多数python使用者都涉及不到,大家了解下就好。

1).Build和C API

  • 提供Py_EnterRecursiveCall()和Py_LeaveRecursiveCall()作为limited API的常规函数。 从stable API中删除_Py_CheckRecursionLimit。
  • 向C API添加一个新的公共函数PyObject_CallNoArgs(),这个函数可以调用不含参数的可调用Python对象。
  • 全局变量PyStructSequence_UnnamedField在python3.9中修改为常量字符串。
  • 从Py_LIMITED_API.pyfpe.h中剔除PyFPE_START_PROTECT()和PyFPE_END_PROTECT()函数。
  • 删除PyMethod_ClearFreeList()和PyCFunction_ClearFreeList()函数。

2).方法调整

  • 在之前的版本中,math.factorial()函数只接受非负整数值,否则将引发ValueError。 在python3.9中该函数将弃用,任何参数都将引发TypeError。
  • 弃用parser模块,并将在以后的Python版本中删除。
  • 修改random模块的seeds类型,今后只支持None,int,float,str,bytes和bytearray类型。
  • 始终允许打开GzipFile文件进行读写,即使不指定mode参数也不会发出警告。
  • 推荐使用_tkinter.TkappType的splitlist()方法代替split()方法。

3).移除模块

  • collection.abc 里面的抽象基类将不在常规的 collection 模块中公开。
  • 删除 sys.getcheckinterval() 和 sys.setcheckinterval() 函数。
  • 删除threading.Thread 的 isAlive() 方法。
  • 删除 ElementTree 中的getchildren() 和 getiterator()方法。
  • 删除 旧 plistlib 模块的实现,同时删除其中的use_builtin_types 参数。

小结:
总的来说,目前python3.9相对于3.8改变并不是很大,而且大多数都是一些偏底层的东西,我们一般用户很少会碰到 。 不过,目前推出的python3.9.0a1只是第一个迭代版本,并不是正式版本。后续也有可能会有其他变动,但是按理说变化也不会太大。 基于以上原因,个人认为大家可以继续使用现有的版本学习和工作,如果你现在的版本不算很老的话。
下面做一个调查,看看大家都在用什么版本:

更多有趣有用文章

懒人专用的奇淫技巧,用Python实现炫酷的语音操作电脑
Python里三个最高逼格的调试神器
九大神招,让Python里数据分析神器Jupyter,完美升华
推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者

老司机吐槽

建议看一下,零基础学Python都想问的6个问题,老司机给你两千字解答
51个Python鲜为人知的秘密特性,老司机看完都惊叹不已
Python实战学习指南:从零基础到独立开发,结合黑马课程与菜鸟教程 Python作为一门简洁高效的编程语言,其核心在于掌握基础语法与编程思维。理解变量、数据类型、控制流函数等概念是构建程序的基石,而面向对象编程则能更好地组织复杂代码。这些技术价值在于提升代码的可读性、可维护性复用性,广泛应用于数据分析、Web开发、自动化脚本等场景。本文基于**黑马程序员课程**的系统性框架,融合**菜鸟教程**的精准文档,提供一份学练结合的实战路径,帮助初学者从环境搭建到项目实战,快速建立扎实的代码手感,避免知识点零散不成体系的问题。 阅读详情

相关推荐

Python 3.9的到来到底是意味着什么

本文主要介绍Python3.9的一些新特性,如:更快速的进程释放,性能的提升,简便的新字符串函数,字典并集运算符以及更兼容稳定的内部API,详细如下: 1、字典并集可迭代更新 Python 3.9 dict类。如果有两个字典ab,则现在可以使用这些运算符进行合并更新。 我们有合并运算符|: 使用Iterables进行字典更新 | =运算符的另一个很棒的性能是能够使用可迭代对象(如列表或生成器)用新的键值对来更新字典: a = {'a': 'one', 'b': 'two'} b = ((i, i**2) for i in range(3)) a |= b print(a) {'a':

Python版本的差异总结

文章目录Python2与Python3Python2系列Python3系列Python3.4Python3.5Python3.6Python3.7Python3.8 Python版本主要分为 2.× 、 3.× 两个系列。 - Python3计划每年发布一个新的子版本,一次只增加一两种新语法。 - 使用时当然选择越新的Python版本越好,版本越老的代码越难维护。 - 维护老版本的代码时,需要了解各版本之间的主要差异。有时看到一些代码的语法特点,可以大致猜出它是什么版本

LeoHsiao的博客 8万+

Python3.9Python3.7有什么区别?

Python3.9相对于3.7来说有了一定的性能提升,其中包括实现了PEP 563,使得对于一些情况下的类型注释可以进行延迟评估,从而减少了类型注释对于程序性能的消耗。由于在Python3.9中引入了一些新的特性语法,因此在将代码从Python3.7迁移到Python3.9时,可能需要进行一些更改。Python是一门使用广泛,且高级的编程语言,而且随着时间的推移,Python也相继更新了许多版本,这些版本来了许多新的功能改进,那么Python3.9Python3.7有什么区别?

oldboyedu1的博客 2132

python用哪个版本比较好,python什么版本比较稳定

目前建议初学者选择Python3.x版本1、目前,使用Python3.x是大势所趋2、Python3.x在Python2.x的基础上做了功能升级3Python3.xPython2.x思想基本是共通的当然选择Python3.x也会有缺点,那就是很多扩展库的发行总是滞后于Python的发行版本,甚至目前还有很多库不支持Python3.x。因此,在选择Python时候,一定要先考虑清楚自己的学习目的,例如,打算做哪方面的开发、需要用到哪些扩展库,以及扩展库支持的最高Python版本等。

2301_79533350的博客 9872

python什么版本比较稳定,哪个版本python最好用

大家好,小编来为大家解答以下问题,python哪个版本最好用又稳定,哪个版本python最好用,今天让我们一起来看看吧!其实很多人想知道python软件哪个版本好用,工欲善其事必先利其器,这是能理解的,下面小编个大家详细对比一下,python 3.73.8哪个版本好。

chatgpt002的博客 3552

python3.43.7区别_还在Python3.7Python3.9新鲜出炉菜鸟尝鲜解读

原标题:还在Python3.7Python3.9新鲜出炉菜鸟尝鲜解读 是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了!其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。但是呢,新版本出来了一定要体验一下,看看都有哪些改动优化,说不定哪个新特性就能解决你手里的大问题...

weixin_39805883的博客 2363

python3 bytes可修改_还在Python3.7Python3.9新鲜出炉菜鸟尝鲜解读

是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了!其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。但是呢,新版本出来了一定要体验一下,看看都有哪些改动优化,说不定哪个新特性就能解决你手里的大问题。1新的特性1).import异常我们在进行模块的相对引用时,可能会遇到...

weixin_39970823的博客 546

python3 获取file大小_还在Python3.7Python3.9新鲜出炉菜鸟尝鲜解读

是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了!其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。但是呢,新版本出来了一定要体验一下,看看都有哪些改动优化,说不定哪个新特性就能解决你手里的大问题。1新的特性1).import异常我们在进行模块的相对引用时,可能会遇到...

weixin_39542936的博客 143

python3 菜鸟_还在Python3.7Python3.9新鲜出炉尝鲜解读

From: 菜鸟 菜鸟Python是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了!其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。但是呢,新版本出来了一定要体验一下,看看都有哪些改动优化,说不定哪个新特性就能解决你手里的大问题。1 新的特性1).import异常我们在进...

weixin_36102010的博客 842

python3 manage.py runserver 后台运行_还在Python3.7Python3.9新鲜出炉尝鲜解读...

From: 菜鸟 菜鸟Python是不是感觉python3.7刚刚使用,3.8还没捂热乎,怎么3.9这么快就来了!其实版本迭代速度快,说明这门编程语言的活力强,对于我们使用者来说是件好事,而且谁也没说必须使用最新版本,我到现在仍然在用python3.6。但是呢,新版本出来了一定要体验一下,看看都有哪些改动优化,说不定哪个新特性就能解决你手里的大问题。1 新的特性1).import异常我们在进...

weixin_39689394的博客 724

菜鸟教程《Python 3 教程》笔记(10):条件控制

笔记有个人侧重点,不追求面面俱到。

猎猫骑巨兽的博客 408

菜鸟python_对比几段代码,看看你是 Python 菜鸟还是老鸟

Python 里有个小彩蛋:在 Python Shell 里输入 import this这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:优美胜于丑陋明确胜于隐晦简单胜于复杂…可读性很重要不要忽略错误面对不确定时,拒绝猜测现在做好过不做,但盲目动手不如不做如果你的实现很难说清楚,那是个坏想法;反之亦然…当你学完基础,可以写点代...

weixin_39911916的博客 102

菜鸟教程python测验答案,菜鸟教程python3100题

大家好,小编为大家解答菜鸟教程python测验答案的问题。很多人还不知道菜鸟教程python3100题,现在让我们一起来看看吧!这篇文章主要介绍了python全系列官方中文文档,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编着大家一起了解一下python基础知识点精心整理。Source code download: 本文相关源码​​​​​。

weixin_70649164的博客 1000

Python笔记(3Python入门

导入模块、缩进、注释、多行语句、Print 输出、等待用户输入

氢键H-H 1万+

Python菜鸟入门)3

在上述示例中,我们使用了一对字符串变量,在str.format()方法的应用实例中都使用了字符串字面值,这是为了方便。实际上任何使用字符串字面值的示例中都可以使用字符串变量,方法完全一样。 替换字段本身可以包含替换字段,嵌套的替换字段不能有任何格式,其主要应用是格式化规约计算。在对格式化规约计算进行更细致的解读时,我们将展示一个实例。现在我们将逐一替换字段的每一个部分,首先从字段名开始。 字段名...

qq_43742687的博客 210

菜鸟教程 python连接 mysql_浅谈Python访问MySQL的正确姿势

更多python教程请到: 菜鸟教程www.piaodoo.com人人影视www.sfkyty.com16影视www.591319.com星辰影院www.591319.comPy2 时代,访问 MySQL 数据库的模块除了 PyMySQL MySQL-python 之外,还有以速度见长的 Umysql,以及非常小众的 Oursql 模块。进入了 Py3 时代之后,PyMySQL 与时俱进,...

weixin_39616693的博客 94

Python菜鸟--数据结构

先进后出,列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。先进先出,也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。

m0_54028211的博客 999

送精选Python好书!

昨天发了一次送书活动,有粉丝提醒我,排版有问题,非常抱歉!写代码也好还是做人做事都要仔细一点,里面有好多书的封面没有加上,非常非常抱歉,所以今天重发一下,图灵的书还是不错的!我这个号有个...

cainiao_python的博客 267

Python的函数理解外传

菜鸟级的Python函数解读,从而以一个电脑初级选手的视角来看待Python编程中的函数。或许作为一个菜鸟,很多地方的理解都是无厘头的,但目的是能够有助于我对它理解有效掌握,我觉得还是有价值的。 为什么要有函数机制 我们其实可以思考,为什么我们文件多了,要建立文件夹?当然是为了更有序的对我们的文件进行管理。 同样,编程中的函数机制(甚至是以后更大的类、模块、包等概念)都是为了让数据更加有序,有利...

weixin_43932460的博客 355
上一篇: 2019脱单指南 | 用Python数据解决单身问题
下一篇: 首次公开:Python转型大数据开发全套视频教程,限时免费下载
菜鸟学Python
博客等级 码龄9年 7562粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值