简单了解Python3里的一些新特性


Posted in Python onJuly 13, 2019

概述

到2020年,Python2的官方维护期就要结束了,越来越多的Python项目从Python2切换到了Python3。其实在实际工作中,很多伙伴都还是在用Python2的思维写Python3的代码。给大家总结一下Python3一些新的更方便的特性!希望你们看完后也能高效率的编写代码

f-strings (3.6+)

在Python里面,我们经常使用format函数来格式化字符串,例如:

user = "Jane Doe"action = "buy"log_message = 'User {} has logged in and did an action {}.'.format(
 user,
 action)print(log_message)输出:User Jane Doe has logged in and did an action buy.

Python3里面提供了一个更加灵活方便的方法来格式化字符串,叫做f-strings。上面的代码可以这样实现:

user = "Jane Doe"action = "buy"log_message = f'User {user} has logged in and did an action {action}.'print(log_message)输出: User Jane Doe has logged in and did an action buy.

Pathlib (3.4+)

f-strings这个功能太方便了,但是对于文件路劲这样的字符串,Python还提供了更加方便的处理方法。Pathlib是Python3提供的一个处理文件路劲的库。例如:

from pathlib import Pathroot = Path('post_sub_folder')print(root)输出结果: post_sub_folder
path = root / 'happy_user'# 输出绝对路劲print(path.resolve())输出结果:/root/post_sub_folder/happy_user

Type hinting (3.5+)

静态与动态类型是软件工程中的一个热门话题,每个人都有不同的看法,Python作为一个动态类型语言,在Python3中也提供了Type hinting功能,例如:

def sentence_has_animal(sentence: str) -> bool:
 return "animal" in sentence
sentence_has_animal("Donald had a farm without animals")# True

Enumerations (3.4+)

Python3提供的Enum类让你很容就能实现一个枚举类型:

from enum import Enum, autoclass Monster(Enum):
  ZOMBIE = auto()
  WARRIOR = auto()
  BEAR = auto()print(Monster.ZOMBIE)输出: Monster.ZOMBIE

Python3的Enum还支持比较和迭代。

for monster in Monster:
  print(monster)输出: Monster.ZOMBIE   Monster.WARRIOR   Monster.BEAR

Built-in LRU cache (3.2+)

缓存是现在的软件领域经常使用的技术,Python3提供了一个lru_cache装饰器,来让你更好的使用缓存。下面有个实例:

import timedef fib(number: int) -> int:
  if number == 0: return 0
  if number == 1: return 1
  return fib(number-1) + fib(number-2)start = time.time()fib(40)print(f'Duration: {time.time() - start}s')# Duration: 30.684099674224854s

现在我们可以使用lru_cache来优化我们上面的代码,降低代码执行时间。

from functools import lru_cache@lru_cache(maxsize=512)def fib_memoization(number: int) -> int:
  if number == 0: return 0
  if number == 1: return 1
  return fib_memoization(number-1) + fib_memoization(number-2)start = time.time()fib_memoization(40)print(f'Duration: {time.time() - start}s')# Duration: 6.866455078125e-05s

Extended iterable unpacking (3.0+)

代码如下:

head, *body, tail = range(5)print(head, body, tail)输出: 0 [1, 2, 3] 4py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split()print(py)print(filename)print(cmds)输出:python3.7
   script.py   ['-n', '5', '-l', '15']first, _, third, *_ = range(10)print(first, third)输出: 0 2

Data classes (3.7+)

Python3提供data class装饰器来让我们更好的处理数据对象,而不用去实现 init () 和 repr() 方法。假设如下的代码:

class Armor:
  def __init__(self, armor: float, description: str, level: int = 1):
    self.armor = armor    self.level = level    self.description = description  def power(self) -> float:
    return self.armor * self.level
armor = Armor(5.2, "Common armor.", 2)armor.power()# 10.4print(armor)# <__main__.Armor object at 0x7fc4800e2cf8>

使用data class实现上面功能的代码,这么写:

from dataclasses import dataclass@dataclassclass Armor:
  armor: float
  description: str
  level: int = 1
  def power(self) -> float:
    return self.armor * self.level
armor = Armor(5.2, "Common armor.", 2)armor.power()# 10.4print(armor)# Armor(armor=5.2, description='Common armor.', level=2)

Implicit namespace packages (3.3+)

通常情况下,Python通过把代码打成包(在目录中加入 init .py实现)来复用,官方给的示例如下:

sound/             Top-level package
   __init__.py        Initialize the sound package
   formats/         Subpackage for file format conversions
       __init__.py
       wavread.py
       wavwrite.py
       aiffread.py
       aiffwrite.py
       auread.py
       auwrite.py       ...
   effects/         Subpackage for sound effects
       __init__.py
       echo.py
       surround.py
       reverse.py       ...
   filters/         Subpackage for filters
       __init__.py
       equalizer.py
       vocoder.py
       karaoke.py

在Python2里,如上的目录结构,每个目录都必须有 init .py文件,一遍其他模块调用目录下的python代码,在Python3里,通过 Implicit Namespace Packages可是不使用__init__.py文件

sound/             Top-level package
   __init__.py        Initialize the sound package
   formats/         Subpackage for file format conversions
       wavread.py
       wavwrite.py
       aiffread.py
       aiffwrite.py
       auread.py
       auwrite.py       ...
   effects/         Subpackage for sound effects
       echo.py
       surround.py
       reverse.py       ...
   filters/         Subpackage for filters
       equalizer.py
       vocoder.py
       karaoke.py

结语

这里由于时间关系(确实挺忙)只列出了部分Python3的新功能,希望你在看了这篇文章以后,学以致用,写出更清晰更直观的代码!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
python机器学习之决策树分类详解
Dec 20 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
python web基础之加载静态文件实例
Mar 20 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
Python数据类型之List列表实例详解
May 08 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
python实现的分层随机抽样案例
Feb 25 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 #Python
Django对数据库进行添加与更新的例子
Jul 12 #Python
Python 绘制酷炫的三维图步骤详解
Jul 12 #Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 #Python
python实现简单聊天室功能 可以私聊
Jul 12 #Python
pyinstaller参数介绍以及总结详解
Jul 12 #Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 #Python
You might like
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
php实现上传图片文件代码
2015/07/19 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python函数中不定长参数的写法
2019/02/13 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
告诉你怎样写创业计划书
2014/01/27 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
确保工程质量承诺书
2015/04/29 职场文书
美丽的大脚观后感
2015/06/03 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python