现在的python版本_为什么我要把python版本升级到3.8?是因为它的稳定?
你是否还在使用Python3.7,3.6……甚至是更老的Python版本?
实际上,在选择使用最新版Python时可能存在一定的风险,并可能会遇到一些问题。
生态,各种库的支持,兼容性……
不同版本的解释器存在差异,以前的项目还能不能继续使用是个问题……
新的特性或者功能太香,我实在忍不住更新了却遭遇到bug……

image.png
具体来说,在此之前(即正式版),Python3.7的最早发布日期是2018年6月15日。截至当前(即最新状态),这一版本(即最高版本)是3.7系列中的一个正式推出版本(即为3.7.4号)。这一特定版本于2019年7月8日正式推出(即上线)。距离现在的2020年7月已经过去了超过一年时间!也就是说,在这一段时间内已经不再进行软件更新了!因此我们可以说这个版本其实也并不算是"新"出来的
自2019年10月14日起发布的Python 3.8首个正式版之后已持续维护约一年之久,并已升级至第3.8.5版(于2020年7月20日正式发布)。
参考官方文档指出,当前最新发布的是Python 3.9版本,并且该版本尚未正式发布,在今年10月之前将推出首个正式版本。

image.png
访问Python官方文档时可以看到,在此页面中可以看到的是:Python 3.7版本的维护状态为安全类(Security),而 Python 3.8版本则被归类为修复缺陷(Bug Fix)。为了更好地理解这些术语的意义,请详细解释以下几种常见版本管理的状态:其中每个版本的状态都可能影响软件的功能和稳定性

image.png
就目前而言,在经过修复后已达到稳定状态的Python3.8在过去的一年里进行了持续的更新工作,并且已经相当成熟。它现在可用于投入生产。
当然,在对系统稳定性有极高要求的情况下(即追求系统稳定性要求较高),我们推荐使用Python3.7或其它维护状态为security的版本(即推荐使用维护状态为security的Python 3.7版本)。这是因为除非遇到安全性问题(即只有在遇到安全性问题时),它们几乎不会再进行更新(即这些版本很少有更新)。因此,在使用体验上将更加稳定。
但是!Python3.8太香了!
一起来看看它的新变化,看完你肯定想用
Python3.8:近乎全方位的性能提升
数据来自Python官网
测试指标以纳秒为单位(数值越低表示表现更为优异),可见Python3.8在各方面均实现了性能表现显著提升。

image.png

image.png
新的语法:海象运算符 :=
除了性能方面的提升之外,在Python 3.8版本中引入了新的语法结构,并在文档中特别指出这一改动具有重要意义。值得注意的是,在该版本中还引入了被称为"walrus operator"(海象运算符)的新特性
harpoon operator is an assignment expression. 它有助于降低我们重复执行某些操作的程度。通过这种运算符的应用, 我们能够减少一些冗余的操作, 从而编写出更加流畅且易于理解的代码.
一个简单的例子,首先这是在Python3.8以前的写法:
我有一个盒子,里面装着三样水果,并且装不下更多了
myBox = [ 'apple', 'banana', 'orange' ]
现在往里面装入新的水果
myBox.append('trump')
但是实际上,它之前已经装满了,再往里装就要爆炸了!
那么要进行判断,并且告诉我们,我们的盒子炸了:
if len(myBox) > 3:
print('盒子炸了,最多只能装3样水果,而你却装了{}样!'.format(len(myBox)))
在这一实例中,在这个例子中此例中我们进行了两次调用len(myBox),以获取盒子列表的长度值显得颇为繁琐
好的,我们优化一下,使用一个变量存储盒子列表的长度:
我有一个盒子,里面装着三样水果,并且装不下更多了
myBox = [ 'apple', 'banana', 'orange', 'trump' ]
记录长度
size = len(myBox)
那么要进行判断,并且告诉我们,我们的盒子炸了:
if size > 3:
print('盒子炸了,最多只能装3样水果,而你却装了{}样!'.format(szie))
虽然如此,在优化代码的过程中我发现了一个问题:我们减少了对myBox长度的计算次数(即减少了对myBox进行一次len()调用),同时避免了多次重复计算其长度(即每次只需要计算一次size)。然而,在这种情况下我们实际上多写了三次size
程序员群体在频繁地撰写内容时往往会导致身体和心理健康方面的副作用。可能会引发心理压力,并可能导致如网络抑压综合症等严重的健康问题。
当遇到一个大型项目时,事情可能会变得非常棘手。如果只是几行代码的小型项目还好些;但大型项目一旦出现问题就会导致严重的错误——幸好的是海象运算符的到来阻止了这种情况发生。
现在可以这么写
myBox = [ 'apple', 'banana', 'orange', 'trump' ]
在这一阶段中,在判定myBox列表长度的同时将其记录为变量size
if (size := len(myBox)) > 3:
print('盒子炸了,最多只能装3样水果,而你却装了{}样!'.format(szie))
是的!有了海象运算符,我们可以在判断过程中赋值新变量。
对比效率提升了多少?原先的过程包括以下步骤:首先执行len(myBox),接着创建变量size;然后依次访问大小值并完成相应的判断操作;最后完成数据输出工作。现在的流程则是,在执行len(myBox)的同时创建并立即检查变量大小;随后直接打印大小信息。
原本的四个步骤直接减少了两步。
该实例属于数据筛选过程;我们的目标是指导用户去除不存在的学生学号;从而识别出成绩不合格的学生
一般写法:
学生表
key为id(主键),value为学生对象(这里不写对象了,直接用dict方便表示)
students = {
1: {'name': '小明', 'score': '及格'},
3: {'name': '小红', 'score': '不及格'},
4: {'name': '小绿', 'score': '不及格'}
}
尝试找到学号1-4,并且成绩为不及格的学生
学号2的那位实际上被开除了,但是用户并不知道
results = []
for stuId in range(1, 5):
student = students.get(stuId) # 如果是不存在的key则会取到None
当当前学生且学生的成绩等于"不合格"时:# 需要过滤掉成绩为None的情况,并只保留不及格的学生
results.append(student)
返回结果给用户
print(results)
使用海象运算符和列表推导式可以轻松完成这项工作:
print([student for stuId in range(1,5)
if (student := students.get(stuId)) and student['score'] == '不及格' ])
以及,当你希望连续获得用户输入,直到某个关键字时终止并给出结果时:
inputs = []
让用户输入任意个需要进行求和的数
while True:
userInput = input('请输入数字或"求和":')
当输入为”求和“时结束循环
if userInput == '求和':
break
inputs.append(int(userInput))
打印求和结果
print('求和的结果是:', sum(inputs))
使用海象操作符:
inputs = []
while (userInput := input('请输入数字或"求和":')) != '求和':
inputs.append(int(userInput))
print('求和的结果是:', sum(inputs))
或者,帮助你处理一个函数的返回数据,这里是一个网络请求的例子:
import requests
爬取数据,或者从某个api获得数据时,要对请求状态码进行验证
if (resp := requests.get('某地址')) and resp.status_code == 200:
当请求成功(如状态码200)时进行处理
pass
print(resp)
也可以这么写,会降低一些可读性。但是很爽。
import requests
if (resp := requests.get('某地址')).status_code != 200: pass
print(resp)
你也可以在传统的循环中使用,这里是循环10次打招呼:
count = 0
while (count := count + 1) <= 10:
print('hello')
看看count的变化
print(count)
这里就不再举更多例子了,海象运算符还有更多用法等你发现
函数的新语法:形参限定符(仅限位置形参)
由于官方文档的名字不够清晰易懂, 正因如此,'形参限定符'这一术语实际上是我在起名时所考虑的因素……但其实这个新名字非常容易理解吧?
仅限位置形参 以及 仅限关键字形参:/ 和 *
它是一个新的函数形参语法,下面是仅限位置形参/的例子:
一个函数
def test(a, b, /, c):
print(a, b, c)
进行测试
test('我是a', '我是b', '我是c') # 能够输出
test('我是a', '我是b', c = '我是c') # 能够输出
test('我是a', b = '我是b', c = '我是c') # 报错
通过前面的例子可以看出,在函数test的参数列表中,在限定符/之前的参数仅限于位置型参数,并且必须采用固定位置对应的传入方式(例如a=1,b=2),而无法以键值对的形式(例如b = '我是b'这样的方式)进行参数传递(称为关键字型参数)。
位于限定符/后面的参数既可以用固定位置参数也可以采用关键字参数
对刚才的例子稍作修改,下面是仅限关键字形参限定符*:
对刚才的例子稍作修改
def test(a, b, /, c, *, d, e):
print(a, b, c, d, e)
test('我是a', '我是b', c = '我是c', d = '我是d', e = '我是e') # 能够输出
test('我是a', '我是b', c = '我是c', d = '我是d', '我是e') # 报错
也就是说,位于*后面的参数只能以关键字形参的方式传入。
并且,限定符与kwargs不冲突:
def test(a, b, /, **kwargs):
print(a, b, kwargs)
test('我是a', '我是b', a = '我也是a', b = '我也是b', c = '我是c') # 能够输出
输出结果如下:
我是a 我是b {'a': '我也是a', 'b': '我也是b', 'c': '我是c'}
如果函数需要接受许多不确定的参数,那这确实是一个不错的特性
Python3.8对f-string的补充:说明符 =
什么是说明符呢,下面举这么一个字符串例子:
定义变量
data = ['哈哈', '嘻嘻']
count = len(data)
打印
print(f'{data=}, {count=}')
打印结果是:data=['哈哈', '嘻嘻'], count=2
可以看出,在左边的说明符处会将运算结果或变量输出至右侧,并采用:变量名称或运算结果 = 变量值或运算结果的形式来完成打印操作。
比如一个表达式的例子:
a = 1
b = 2
打印
print(f'{a+b=}')
打印结果是:a+b=3
是不是很有趣。。。
并且,它可以帮你规范打印格式:
a = 1023
b = 1
打印
print(f'{a+b=:,d}')
打印的结果是:a+b=1,024
自动加上了千分位逗号。。。够意思了
关于Python3.8更详细的变化可以在Python官网查看:
详细的可以看官网文档:Python3.8有什么新变化?
或者更详细的更新日志:Python3.8更新日志
关于升级到Python3.8
只能够下载新的安装包进行全新安装,无法平滑升级
Python下载地址:https://www.python.org/downloads/
安装新版本后将旧的环境变量改到新的Python路径即可完成升级!
关于库的迁移
建议更换所有的库文件,不建议直接复制旧库到新版本目录中。即使这样做也不会有问题。
可以用pip freeze命令将当前Python解释器所安装的所有库完整地列出并保存为txt文件。
升级完python后使用 pip install -r req.txt 一键安装
关于Spyder
spyder是一个我爱用的 Python IDE,它由python + pyqt编写。
断点设置、交互式的动态编码模式、变量监视器、代码调试工具以及ipython交互界面和cython扩展环境……无论是在控制台还是图形界面中显示图片时都可以通过查看dataframe对象实现各种操作,并且这些只是基础功能,在此基础之上免费解锁更多的高级功能等待探索
调试代码时会遇到各种问题需要注意细节;执行测试流程并发现问题后会帮助我们更好地理解软件功能;对所设计系统进行性能分析也是不可或缺的工作环节;整个开发体验非常方便使用;选择一段特定区域的代码并按快捷键F9即可启动该区域内的功能模块;这个工具是一个开源项目并已获得大量支持者:https://github.com/spyder-ide/spyder

image.png
现在,它能够很好的支持Python3.8了,而安装也十分容易:
pip install spyder
安装后使用命令行启动
spyder3
说实话,安装了最新的spyder4却仍称启动名称为spyder3。感觉有点奇怪。
需要注意的是,在使用pip安装软件包时,默认情况下spyder不会自动生成相应的桌面快捷方式(App),因此需要手动完成这一操作

image.png
通过pip安装Spyder程序后,请将spyder3.exe置于你的Python路径中的Scripts文件夹内,并创建一个桌面快捷方式并配置其图标。
图标的位置位于以下位置:其中,你可以在Python38目录下找到所需安装环境的配置文件
我最终还是没能抗下诱惑,准备升级到Python3.8……
我已经升级了,确实很好用,产品经理很爱我
热文推荐:
