资深Python开发专家,7年多Python开发经验
上周四(8月22号)张老师给大家分享了公开课《Python3最佳学习指南》,通过分享我们已全面了解Python2和Python3的异同。本文张老师总结补充了Python3的六个新特性,并给大家一些学习Python3的好建议。
#coding:utf-8
def do_sum(a, b, switch=False, *args):
if switch:
print("已删库,跑路吧")
return a+b
print(do_sum(1, 2))
只有在开关switch参数打开时才能删库(假定一个危险操作)。但是当我们调用函数时,写成了do_sum(1, 2, 3),执行结果:幸好,在python3中引入了新的特性强制关键词参数,上述可以这样写:def do_sum(a, b, *args, switch=False):
if switch:
print("已删库,跑路吧")
return a+b
只有在特定指定 do_sum(1, 2, switch=True)时才会触发删库操作,执行3 do_sum(1, 2, 3)不会触发危险逻辑。
另外,如果你不想收集其他参数,你可以用 * 代替 *args,比如这样:def do_sum(a, b, *, switch=True):
pass
总结:利用这个特性可以将危险逻辑规避起来,避免了调用失误造成事故发生。
假如我想得到列表的第一项,第二项,和剩下的全部。假定列表是:range(8)
with open('file_name') as f:
first, *_, last = f.readlines()
另外:不仅列表是这样,元组和字典等序列都有这样的特性哦。
总结:通过高级解包新特性,可以灵活地从序列中得到我们想要的项。
这个特性将python2中可能内存泄露或者内存溢出的问题都给解决掉了。举个例子:def do_sum(n):
a = 0
for i in range(n + 1):
a += i
return a
do_sum(100000000) # 内存爆炸
因为range()会先将生成的列表放入内存中,显然这么大的列表,内存君表示受不了。
当然,在python2 中可以用xrange来解决这个问题。但是现在python3中,这些内建函数range,map,filter,zip,dict.values 等返回的都是迭代器,遍历是每次通过next去取下一个值,妈妈再也不用担心内存占用高的问题了。
总结:在python3中,通过迭代器将可能造成内存问题解决,大家可以放心使用了这些内建函数了。
貌似还不够简洁,python3.6中提供了新特性:f-strings
举例:创建一个类,注意初始化方法,主要是实现以该对象属性存储数字为了初始化一个对象, 传一个参数,val都会重复出现三次。
下面使用@dataclass装饰器实现以上同样的功能:(备注:dataclass要安装一下,pip install dataclasses)这里新增的装饰器很像java中注解的功能。另外,dataclasses还有更好的特性,留给大家去钻研。总结:dataclasses 装饰器能够简化类初始化代码。
它完全采用面向对象的编程方式,尤其是在处理配置路径方面简直太方便了。
总结:pathlib 对应路径的处理更加灵活简洁,也更面向对象方式。
写在最后,Python3从08年12月发布至今,每个版本都有新的特性供大家去学习。官网上发布python3.7新特性如下:https://docs.python.org/zh-cn/3/whatsnew/3.7.html
想了解更多的内容可以看下8月22号的公开课《Python3最佳学习指南》。Python能做到的事情还有很多,很多。若想更系统的学习Python,大家可以了解下知数堂《Python运维班》第8期课程,本周六即将开课。有兴趣的同学扫描下方二维码添加助教获取最新课程大纲。
公开课视频链接:
https://ke.qq.com/course/438477
或
点击文末“阅读原文”直达腾讯课堂
扫码加助教可获取课程资料(演示脚本及课件)
(群号:801428435)