简单了解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编码时应该注意的几个情况
Mar 04 Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python使用chardet判断字符编码
May 09 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
python gdal安装与简单使用
Aug 01 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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数据库操作类代码(增,删,改,查)
2013/04/08 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python回调函数的使用方法
2014/01/23 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
python对html代码进行escape编码的方法
2015/05/04 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
高职助产应届生自荐信
2013/09/24 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
淘宝好评语句大全
2014/12/31 职场文书
python实现的人脸识别打卡系统
2021/05/08 Python