19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar,用于改善您的编码体验

文章目录


使函数正常工作是一回事,使用精确而优雅的代码实现它是另一回事。

正如 Python 的禅宗所提到的,“美丽总比丑陋好”。

像 Python 这样好的编程语言总是会提供适当的语法糖,以帮助开发人员轻松编写优雅的代码。

本文重点介绍了 Python 中的 19 个关键语法糖。掌握的旅程涉及理解和熟练地利用它们。

1. 联合运算符Union Operators:合并 Python 字典的最优雅方式

在 Python 中合并多个字典的方法有很多种,但在 Python 3.9 发布之前,没有一种方法可以被描述为优雅。

例如,我们如何在 Python 3.9 之前合并以下三个字典?

其中一种方法是使用 for 循环:

cities_us = {
   'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {
   'London': 'UK', 'Birmingham': 'UK'}
cities_jp = {
   'Tokyo': 'JP'}

cities = {
   }

for city_dict in [cities_us, cities_uk, cities_jp]:
    for city, country in city_dict.items():
        cities[city] = country

print(cities)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK', 'Tokyo': 'JP'}

它很体面,但远非优雅和 Pythonic。

Python 3.9 引入了联合运算符,这是一种语法糖,使合并任务变得超级简单:

cities_us = {
   'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {
   'London': 'UK', 'Birmingham': 'UK'}
cities_jp = {
   'Tokyo': 'JP'}

cities = cities_us | cities_uk | cities_jp

print(cities)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK', 'Tokyo': 'JP'}

如上面的程序所示,我们可以使用一些管道符号pipe symbols,在这种情况下称为联合运算符union operators,来合并任意数量的 Python 字典。

是否可以通过联合运算符进行就地合并?

cities_us = {
   'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {
   'London': 'UK', 'Birmingham': 'UK'}
cities_jp = {
   'Tokyo': 'JP'}

cities_us |= cities_uk | cities_jp
print(cities_us)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK', 'Tokyo': 'JP'}

当然,只需将联合运算符移动到等号的左侧,如上面的代码所示。

2. 类型提示Type Hints:使您的 Python 程序类型安全

动态类型化Dynamic typing,即在运行时确定变量的类型,是使 Python 灵活方便的关键特性。但是,如果变量类型不正确,也可能导致隐藏的错误和错误。

为了解决这个问题,Python 在 3.5 版本中引入了键入提示功能typing hint feature。它提供了一种在代码中注释变量类型annotate variable types的方法,现代 IDE 可以在开发过程中为开发人员及早发现类型错误。

例如,如果我们将一个变量定义为整数,但将其更改为字符串,如下所示,IDE(在本例中为 PyCharm)将为我们突出显示意外的代码:

在这里插入图片描述

除了原始类型之外,还有一些高级类型提示技巧。

例如,在 Python 中使用所有大写字母定义常量是一种常见的约定。

DATABASE = 'MySQL'

但是,这只是一种约定,没有人可以阻止您为这个“常量constant”分配新值。

为了改进它,我们可以使用 Final 类型提示,它指示变量旨在成为常量值,不应重新赋值:

from typing import Final
DATABASE: Final = "MySQL"

如果我们真的更改了“常量constant”,IDE肯定会提醒我们:

在这里插入图片描述

3. F-Strings:一种 Pythonic 字符串格式化方法

Python 支持几种不同的字符串格式化技术,例如使用 % 符号的 C 样式格式化、内置 format() 函数和 f-strings。

除非您仍在使用比 Python 3.6 更旧的版本,否则 f-strings 绝对是执行字符串格式的最 Python 方式。因为它们可以用最少的代码完成所有格式化任务,甚至可以在字符串中运行表达式。

from datetime import datetime

today = datetime.today()

print(f"Today is {
     today}")
# Today is 2023-12-28 13:43:13.944146

print(f"Today is {
     today:%B %d, %Y}")
# Today is December 28, 2023

print(f"Today is {
     today:%m-%d-%Y}")
# Today is 12-28-2023

如上面的代码所示,使用 f-strings 只需做两件事:

  1. 在字符串前添加字母“f”以指示它是 f-string。
  2. 使用带有变量名称的大括号和字符串 ( {variable_name:format} ) 内的可选格式说明符,以特定格式插值变量的值。

“简单总比复杂好。 f-strings 很好地反映了 Python 禅宗中的这句话。

更重要的是,我们可以直接在 f-string 中执行一个表达式:

from datetime import datetime

print(f"Today is {
     datetime.today()}")
# Today is 2023-12-28 13:46:18.905805

4. 使用省略号Ellipsis作为未编写代码的占位符

在 Python 中,我们通常将 pass 关键字作为未编写代码的占位符。但是我们也可以使用省略号来实现此目的。

def write_an_article():
    ...


class Author:
    ...

Python 之父 Guido van Rossum 在 Python 中加入了这种语法糖,因为他觉得这种语法糖很可爱

5. Python 中的装饰器Decorators:一种模块化功能和分离关注点的方法

Python 装饰器的理念是允许开发者在不修改现有对象原始逻辑的情况下为其添加新功能。

我们可以自己定义装饰器。此外,还有许多出色的内置装饰器可供使用。

例如,Python 类中的静态方法static methods并不与实例instance或类class绑定。它们被包含在类中只是因为它们在逻辑上属于这个类。

要定义静态方法,我们只需使用 @staticmethod 装饰器,如下所示:

class Student:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
        self.nickname = None

    def set_nickname(self, name):
        self.nickname = name

    @staticmethod
    def suitable_age(age):
        return 6 <= age <= 70


print(Student.suitable_age(99)) # False
print(Student.suitable_age(27)) # True
print(Student('zhang', 'san').suitable_age(27)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值