值得一试!Python 3中一些不常用但有效的特性

559 篇文章 5 订阅

全文共5241字,预计学习时长14分钟

 

值得一试!Python 3中一些不常用但有效的特性

图源:Pexels

 

Python 2即将停止维护,很多用户都将版本由2升级为了3。此次版本升级中,最显著的变化是将Python 2的print 函数替换为Python 3的print() 函数。要想让括号符号在Python 2中运行,就需要在print关键字后打一个空格,这样解释器才将会将其识别为一个表达式。

 

下面将介绍一小部分Python 3中独有的超棒特性,希望能帮助你轻松解决在使用Python时遇到的问题。所有示例均由python 3.8编写,对于该算法,每一特性都需要最低要求的python版本。

 

f-strings (3.6+)

 

无论使用何种编程语言,如果没有字符串就很难执行任何操作。如果你希望能够采用一种结构化的方式来处理字符串以提高生产力,大部分Python用户倾向于使用format 方法。

 

user = “Amritansh”
 action = “coding”
 log_message = ‘User {} has logged in anddid an action {}.’.format(
 user,
 action
)
 print(log_message)
 # User Amritansh has logged in and didan action coding.

 

除了format方法,Python 3还通过 f-strings提供了一种多样化的方式进行字符串插值。使用 f-strings的代码与上大致相同,如下所示:

 

user = “Amritansh”
 action = “coding”log_message = f’User{user} has logged in and did an action {action}.’
 print(log_message)
 # User Amritansh has logged in and didan action coding.

 

Pathlib (3.4+)

 

尽管f-strings已经非常好用了,但是像文件路径(file paths)这类的字符串往往有自己的库,因此更容易操作。为了方便使用文件路径,Python 3提供了 pathlib:

 

from pathlib import Pathroot =Path(‘post_sub_folder’)
 print(root)
 # post_sub_folderpath = root /‘happy_user’# Make the path absolute
 print(path.resolve())
 # /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user
py_user

 

类型提示(Type hinting)(3.5+)

 

动态类型还是静态类型是软件工程师们争论的热门话题,每个人对此也有着不同的观点。你可以自由选择是否标明类型,但是首先应该了解Python 3所支持的类型提示:

 

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

 

枚举(Enumerations)(3.4+)

 

值得一试!Python 3中一些不常用但有效的特性

 

图源:unsplash

 

Python 3提供了一种在 Enum 类中编写枚举的简便方法。Enums 是一种封装常量列表的有用方法,因此Enum不会随机分布在没有太多结构的代码中。

 

from enum import Enum, autoclassMonster(Enum):
 ZOMBIE = auto()
 WARRIOR = auto()
 BEAR = auto()print(Monster.ZOMBIE)
 # Monster.ZOMBIE

 

枚举就是一组绑定了唯一常量值的符号名称(成员)。在枚举内,成员可以通过身份相互比较,枚举本身也可以迭代。

 

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

 

内置LRU缓存(Built-in LRU cache)(3.2+)

 

如今,高速缓存已经存在于我们使用的软件和硬件的各个层面了。Python 3通过放置一个LRU(LeastRecently Used) 缓存作为名为lru cache的装饰器,使得缓存变得简单。

 

下面是一个简单的斐波那契函数,该函数通过递归重复多次执行同样的工作,缓存对其很有帮助。

 

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

 

现在,可以使用lru_cache来优化(这种优化技术称为memoization),优化后执行时间从几秒到减少到几纳秒。

 

from functools importlru_cache@lru_cache(maxsize=512)
 def fib_memoization(number: int)-> int:
 if number == 0: return 0
 if number == 1: return 1returnfib_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+)

 

Python 3提供数据分类,它的限制更少,因为装饰器会自动生成像¼__init__( )和__repr__( )这样的特殊方法,它还可以用来最小化样板代码。官方文档将其称为“带有默认值的可变命名元组”。

 

class Armor:def __init__(self, armor: float,description: str, level: int = 1):
self.armor = armor
self.level = level
self.description = descriptiondefpower(self) -> float:
return self.armor *self.levelarmor = Armor(5.2, “Common armor.”, 2)
armor.power()
# 10.4print(armor)
# <__main__.Armor object at0x7fc4800e2cf8>
使用数据分类执行相同的Armor:
from dataclasses import dataclass@dataclass
class Armor:
armor: float
description: str
level: int = 1def power(self)-> float:
return self.armor *self.levelarmor = Armor(5.2, “Common armor.”, 2)
armor.power()
# 10.4print(armor)
# Armor(armor=5.2, description=’Commonarmor.’, level=2)

 

隐式命名空间包(Implicit name space packages)(3.3+)

 

一种构造Python代码的方式是使用 packages (一个包含 __init__.py 文件的文件夹),下面的例子来自Python官方文档:

 

sound/                   Top-levelpackage
 __init__.py             Initialize the sound package
formats/                 Subpackage forfile 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 forfilters__init__.py
 equalizer.py
 vocoder.py
 karaoke.py
 …

 

在Python 2中,上述每一个文件夹都必须包含一个__init__.py文件,因为它能够将文件夹转换为一个Python package。但是在Python 3中,随着隐式命名空间包的引入,这些文件则不再需要。

 

sound/                     Top-level package
 __init__.py                Initialize the sound package
formats/                    Subpackagefor file format conversionswavread.py
 wavwrite.py
 aiffread.py
 aiffwrite.py
 auread.py
 auwrite.py
 …effects/                    Subpackage for soundeffectsecho.py
 surround.py
 reverse.py
 …filters/                    Subpackage forfiltersequalizer.py
 vocoder.py
 karaoke.py
 …

 

注:也许您发现实际应用并不如本节所讲的那么简单,根据官方文档 PEP 420 Specification,常规包仍然需要__init__.py ,将其从文件夹结构中删除后,它将变成一个带有额外限制的本地命名空间包(native namespace package)。

 

数字的下划线写法(Underscores in numeric literals)(3.6+)

 

值得一试!Python 3中一些不常用但有效的特性

 

图源:unsplash

 

Python 3.6提供了一个阅读数值文本的绝妙方式,那就是在数字中启用下划线写法。它可以用来展示例如千位数,十六进制数和二进制数等数值文本。

 

cost = 10_000
print(f’Cost: {cost}’)
# Cost: 10000hex_flag = 0xDAFE_FFF8
print(f’Hex flag: {hex_flag}’)
# Hex flag: 3674144760binary =0b_0011_1001
print(f’Binary: {binary}’)
# Binary: 57

 

赋值表达式——“海象运算符”( Assignment expressions — “walrus operator”)(3.8+)

 

Python的最新版本中引入了 walrus运算符,该运算可对表达式进行变量分配。如果你打算稍后在代码中应用该运算符并保存代码中的一行或两行,该运算符会非常有用。

 

, ‘lion’, ‘bear’, ‘tiger’]for animal inanimals:
 if (len_animal := len(animal))> 4:
 print(f’The animal “{animal}” has“{len_animal}”, letters!’)# The animal “tiger” has “5”, letters!

 

本列表并非面面俱到,但确是笔者所认为的重中之重。希望本文所提到的Python 3的功能可以帮你编写出运行更顺畅、更直观的代码。

值得一试!Python 3中一些不常用但有效的特性

一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值