关于Python,99%的人不知道

简介: 前言:python在近几年得到飞速发展,诞生了许多代码库。但是小编发现有很多代码都未能使用到 Python 3 提供的新功能。本文作者介绍了相关功能的介绍,包括字符串格式化处理、文件路径处理、类型提示、内置 LRU 缓存等等,帮助大家更好地利用 Python 3 书写代码。

前言:

python在近几年得到飞速发展,诞生了许多代码库。但是小编发现有很多代码都未能使用到 Python 3 提供的新功能。本文作者介绍了相关功能的介绍,包括字符串格式化处理、文件路径处理、类型提示、内置 LRU 缓存等等,帮助大家更好地利用 Python 3 书写代码。

注:文中的代码示例基于 Python 3.7 编写,为方便使用,在每个功能后面都列出了该功能所需的最低 Python 版本。

对任何一种编程语言来说,字符串处理是一项很重要的内容,字符串处理往往是很多程序的基础部分。由于人工处理字符串非常繁琐,我们更希望用一种结构化的方法来处理它们。在 Python 中,我们一般使用 format 来进行结构化字符串处理,如下所示:
user = "Jane Doe" action = "buy"
​​​​​​​log_message = 'User {} has logged in and did an action {}.'.format( user, action )
除了 format 之外, Python 3 还提供了一个更加灵活的方法来处理字符串,那就是 f-string 。如下所示,我们用 f-string 来和实现上面代码相同的功能:
user = "Jane Doe" action = "buy" ​​​​​​​
log_message = f'User {user} has logged in and did an action {action}.'
Pathlib (3.4+)
如果需要处理文件路径,我们可以使用 Python 3 中的 pathlib 库,使对文件路径的操作更加便捷。如果你对 pathlib 存在疑惑,可以参考这篇文章。下面提供了一个代码示例:
from pathlib import Path
​​​​​​​root = Path('post_sub_folder')
print(root)

post_sub_folder

​​​​​​​path = 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

类型提示 (3.5+)
静态类型与动态类型是软件工程中的一个热门话题,Python 3 提供了支持 type hinting(类型提示)的方法,下面提供了一个示例:
def sentence_has_animal(sentence: str) -> bool:
return "animal" in sentence
sentence_has_animal("Donald had a farm without animals")
​枚举 (3.4+)
Python 3 中的 Enum 类支持枚举功能,可以使我们的程序变得更加简洁。 Enum 是一种便捷的变量列表的打包方式,使用该方法能够避免多个变量在代码各处分布,使代码显得杂乱无章。
from enum import Enum, auto
​​​​​​​class Monster(Enum):
ZOMBIE = auto()
WARRIOR = auto()
BEAR = auto()
​​​​​​​print(Monster.ZOMBIE)

Monster.ZOMBIE

枚举是一个符号集合,每个符号都和唯一的变量对应。通过使用枚举,我们可以通过符号标识来比较各个成员,我们还可以对枚举本身进行迭代。
https://docs.python.org/3/library/enum.html
for monster in Monster:
print(monster)
内置的 LRU 缓存 (3.2+)
Python 3 通过 lru_cache 来使用 LRU (Least Recently Used) 缓存。
下面的代码定义了一个斐波拉契函数,由于该函数的运算需要多次递归,每次递归都会执行相同的工作,因此使用缓存能够加速它的计算。
import time
def 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 来优化该运算。这种优化极技术称为 memoization ,它能够把执行时间从几秒缩减到几纳秒。
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
扩展的可迭代解析功能(3.0+)
head, *body, tail = range(5)
print(head, body, tail)

0 [1, 2, 3] 4

​​​​​​​py, 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

数据类(3.7+)
Python 3 引入了数据类 (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.4

​​​​​ print(armor)# <__main__.Armor object at 0x7fc4800e2cf8>
接来下我们使用数据类来实现上面的代码:
from dataclasses import dataclass
​​​​​​​@dataclass
class 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.
​​print(armor)# Armor(armor=5.2, description='Common armor.', level=2
隐式命名空间包(3.3+)
构建Python代码有很多方法,其中一种就是在包(packages)中进行构建(即包含一个 __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
...
在 Python 2 中,上面的每个文件夹都必须有一个 __init__.py 文件,该文件用于将其所在文件夹转化为 Python 包。然而在 Python 3 中,通过使用隐式命名空间包(Implicit Namespace Package:https://www.python.org/dev/peps/pep-0420/),这些文件就不再需要了。
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              
 ..
注:官方文档PEP 420 Specification 指出,对于一些常规的包,__init__.py 仍然是需要的 ,如果将该文件删除,就会把该 Python 包变成一个本地的命名空间包,这将会产生一些额外的限制,具体可以参考这篇文档。
文中的代码链接:
https://github.com/Weenkus/DataWhatNow-Codes/blob/master/things_you_are_probably_not_using_in_python_3_but_should/python%203%20examples.ipynb

相关文章
|
编解码
如何让开源鸿蒙系统适配其它机型?
如何让开源鸿蒙系统适配其它机型?
502 0
|
10月前
|
机器学习/深度学习 存储 并行计算
Ascend上的PageAttention
PageAttention旨在解决大型语言模型(LLM)服务中的内存管理低效问题,如内存碎片化、利用率低及缺乏灵活的内存共享机制。通过借鉴操作系统中的虚拟内存和分页技术,PageAttention实现了块级别的内存管理和灵活的KV cache共享机制,显著提高内存利用率,降低延迟,提升模型处理速度和性能。相比传统注意力机制,PageAttention通过分段处理序列,有效解决了长序列处理时的计算效率低下和内存过度使用问题。
|
12月前
|
自然语言处理
多语言指令微调(MuIT)
多语言指令微调(MuIT)
292 1
|
存储 关系型数据库 MySQL
mysql 查看数据库及表大小以及数据库扩容评估
mysql 查看数据库及表大小以及数据库扩容评估
303 4
|
9月前
|
人工智能 定位技术 云计算
​2024年终总结暨2025年展望:砥砺前行,顺其自然
### 2024年终总结暨2025年展望:砥砺前行,顺其自然 2024年,我在学习、科研和职业发展上取得了显著进展。全年坚持学习351天,创作1201篇技术博客,获得多项学术成果和行业认可。顺利取得博士学位,并在遥感云计算领域深入探索,出版新书《生态地理遥感云计算》。未来,我将继续深耕遥感技术,计划发表高质量论文,拓展国内遥感云平台应用,保持科研敏感性,同时注重身体健康与个人成长,期待与更多优秀人才合作,共同创造更大的学术和社会价值。
248 31
|
JavaScript
vue.config.ts配置环境变量
vue.config.ts配置环境变量
401 0
|
10月前
|
机器学习/深度学习 存储 缓存
ATB概念之:算子tiling
算子 tiling 是一种优化技术,用于提高大规模张量运算的计算效率。它通过将大任务分解为小块,优化内存使用、支持并行计算,并防止内存溢出。在ATB中,tiling data指kernel的分片参数,用于指导计算。ATB提供了三种 tiling data 搬移策略:整体搬移、多stream搬移及随kernel下发搬移,旨在优化内存拷贝任务,提高计算效率。
|
11月前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
405 3
|
11月前
|
JavaScript Java 云计算
后端开发的演变与未来趋势
在数字化时代的浪潮中,后端开发扮演着至关重要的角色。本文将探讨后端技术的历史演变、当前主流技术和框架、以及面临的挑战和未来的发展趋势。通过深入浅出的方式,为读者揭示后端开发的奥秘,并启发对未来技术的思考。
|
12月前
|
存储 人工智能 安全
智能语音助手的隐私保护技术探讨####
【10月更文挑战第19天】 本文聚焦于智能语音助手的隐私保护技术,通过分析当前技术现状、面临的挑战及未来发展趋势,为开发者和用户提供了一份深入浅出的技术指南。文章指出,随着人工智能技术的飞速发展,智能语音助手已成为日常生活的重要组成部分,但其背后的隐私问题不容忽视。通过技术创新和合理的策略部署,我们有望在享受便捷服务的同时,有效保护个人隐私。 ####