简单了解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之不要红头文件(2)
Sep 28 Python
在Python的循环体中使用else语句的方法
Mar 30 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Django rest framework工具包简单用法示例
Jul 20 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
在主流系统之上安装Pygame的方法
May 20 Python
Python流程控制语句的深入讲解
Jun 15 Python
Python csv文件记录流程代码解析
Jul 16 Python
Python中使用Lambda函数的5种用法
Apr 01 Python
浅谈Python 中的复数问题
May 19 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
CI配置多数据库访问的方法
2016/03/28 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
python使用post提交数据到远程url的方法
2015/04/29 Python
用Python写冒泡排序代码
2016/04/12 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
岗位职责的含义
2013/11/17 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
留学推荐信范文
2014/05/10 职场文书
环卫工人慰问信
2015/02/15 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers