简单了解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简单实现基数排序算法
May 16 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python+request+unittest实现接口测试框架集成实例
Mar 16 Python
python多线程之事件Event的使用详解
Apr 27 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python 字符串常用函数详解
Sep 11 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
pymysql模块使用简介与示例
Nov 17 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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采集速度探究总结(原创)
2008/04/18 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
vue--vuex详解
2019/04/15 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python实现直播推流效果
2019/11/26 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
工商局个人工作总结
2015/03/03 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书