你可能不会在python3中用到但需要知道的知识点

你可能不会在python3中用到但需要知道的知识点

原作者:Vinko Kodžoman
原时间:May 6, 2019
原网址:https://datawhatnow.com/things-you-are-probably-not-using-in-python-3-but-should

由于Python EOL,许多人开始将他们的Python版本从Python2切换到3。不幸的是,我发现大多数python3的代码看起来仍然很像python2的,只不过是把print用括号括起来(即使在我之前的文章的代码示例中——如何用Python编写爬虫)。下面,我将展示一些令人兴奋的特性,您只能在python3中使用这些特性,我希望它们能使您更容易地使用Python解决问题。

所有示例都是用Python 3.7编写的,每个特性都包含该特性所需的Python最低版本。

字符串前缀f(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.

除了format方法,Python3提供了一种更加灵活的方式,也就是字符串前缀f来进行字符串格式化,用了字符串前缀f的一样的示例就像下面这样:

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很棒,但一些像路径的字符串有它们自己的模块来让我们对它们的操作更加简单。Python3提供了pathlib模块来更方便地操作文件路径。如果你还不确定你为什么要用pathlib,尝试读一下这篇很棒的文章了 - 晚
为什么你要用pathlib - 来自Trey Hunner

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支持类型提示。

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

枚举 (3.4+)

Python3支持通过枚举类编写枚举的简单方法。枚举是封装常量列表的一种简便的方法,因此它们不会在没有太多结构的情况下随机分布在代码中。

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)
# Monster.ZOMBIE
# Monster.WARRIOR
# Monster.BEAR

内建LRU缓存库 (3.2+)

缓存存在于我们今天使用的几乎所有的软件和硬件中。Python3通过将LRU(Least Recently Used)缓存放到functools标准库中成为一个名为lru_cache的装饰器,使得我们使用它们变得非常简单。

下面是一个简单的计算Fibonacci函数,我们知道它将从缓存中受益,因为它会通过递归多次执行相同的工作。

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装饰器对斐波那契函数进行优化(这种优化技术被称为记忆)。我们可以看到,执行时间从几秒降到几纳秒。

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] 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

Data classes (3.7+)

Python 3引入了数据类,这些数据类没有太多限制,可以用来减少样板代码,因为dataclass装饰器会自动为你生成特殊的方法,比如_init__()方法和_repr()__方法。根据官方描述,它们被称为“具有默认值的可变命名元组”。

类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>

下面我们用数据类来实现Armor:

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.4
print(armor)
# Armor(armor=5.2, description='Common armor.', level=2)

隐式命名空间包 (3.3+)

结构化Python代码的一个方式就是将代码放在一个带有__init__.py的文件夹里。下面这个例子由Python官方给出:

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中,随着隐式命名空间包的推出,这些文件就不复存在了。

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
              ...

PS:有些人说,这不只是简单地我在这一节中指出这一点,从官方PEP 420规范来看——init.py仍然需要定期包,把它从文件夹结构将把它变成一个本地名称空间包提供了额外的限制,官方文档对本地名称空间包给一个很好的例子,以及所有的限制。

结束语

就像互联网上几乎所有的列表一样,这个列表并不完整。我希望这篇文章至少向您展示了一个您以前不知道的Python 3功能,它将帮助您编写更整洁、更直观的代码。一如既往,所有代码都可以在GitHub上找到。

译者注:作者的GitHub
这篇文章的代码地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值