关于Python,99%的人不知道
前言:
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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
javaWeb初识 Session持久化
Session方法invalidate() 就是从session对象池中删除sessionisNew() boolean; true刚刚创建的Session;false 不是新建的Session session本地持久化 只要正常途径关闭tomcat服务器 就会把session内容存储到本地 注意,如果你在session存放对象,那这个对象想存储在磁盘上必须实现接口 java.io.Serializable import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletRequest; import javax....
- 下一篇
免费开源cms自助建站系统大全,不会编程也可以自己建网站
想自己建网站又没有网站编程基础的小伙伴有福啦,本期小熊seo整理了国内一些知名的,并且可以开源免费下载的cms自助建站系统程序,我们都知道,cms可以让我们不需要熟悉任何网站开发基础编程,只需要下载下来,配置好运行环境就可以安装使用,然后通过后台轻轻松松就可以修改成自己的网站了,稍微熟悉基础电脑操作就能自己制作网站,下面小熊seo就给大家整理一下,希望对大家有所帮助。 1、PageAdmin PageAdmin是基于asp.net开发,采用mvc框架的网站管理系统,功能强大,扩展灵活,系统是完全独立开发,功能成熟,安全性高,可以免费下载使用,目前是国内使用最多的网站系统,主要应用在企业,学校和政府网站。 2、Discuz 一个以社区为基础的专业论坛建站平台,让论坛(BBS)、社交网络(SNS)、门户(Portal)、群组(Group)、开放平台(Open Platform)应用充分融合于一体。这个是一款很知名的论坛系统,在国内占据绝对垄断地位。 3、织梦CMS 织梦CMS是集简单、健壮、灵活、开源几大特点的开源内容管理系统,是国内开源CMS的最早的系统,可以免费下载使用,很个人站长使用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7