简单了解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 相关文章推荐
Cython 三分钟入门教程
Sep 17 Python
Python 闭包的使用方法
Sep 07 Python
Python标准库笔记struct模块的使用
Feb 22 Python
python字符串常用方法
Jun 14 Python
python reverse反转部分数组的实例
Dec 13 Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 Python
解决Python二维数组赋值问题
Nov 28 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
用python批量移动文件
Jan 14 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
PHP 模拟$_PUT实现代码
2010/03/15 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
复习Python中的字符串知识点
2015/04/14 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
大学专科生推荐信范文
2013/11/23 职场文书
给男朋友的道歉信
2014/01/12 职场文书
学校师德师风整改措施
2014/10/27 职场文书
大雁塔英文导游词
2015/02/10 职场文书
钱学森电影观后感
2015/06/04 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
美元符号 $
2022/02/17 杂记
2022漫威和DC电影上映作品
2022/04/05 欧美动漫