一文带您了解Python之禅(Zen)及27个高级技巧

发布时间:2024年01月16日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写干净、优雅的 Python 是一门艺术,也是生成高质量代码的基本艺术。Python 创始人留下了一套指导原则来帮助开发人员进行这项工作:Python 之禅(The Zen of Python)。

什么是python之禅

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

《Python 之禅》由 Python 核心开发人员之一Tim Peters于 1999 年撰写,列出了 19 条陈述 Python设计哲学的格言。5 年后,它已成为开发人员的标准,以至于PEP 20(Python Enhancement Proposal 增强提案)将其纳入官方 Python 包,创造了如上所示的复活节彩蛋。

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

清晰(Clarity)

编写清晰的代码就是编写易于感知、理解或解释的代码。如果您是一名开发人员,您很可能每天会花费超过8 个小时查看代码。代码清晰特别重要, Python Zen 的第一行:

美丽总比丑陋好。(1)

当然还有第七个:

可读性很重要。(7)

在实践中,从命名约定( PEP 8 ) 到代码格式化程序( black ) ,多种工具和标准可以帮助遵循这些原则。

明确性(Explicitness)

编写明确的代码意味着编写没有任何疑问的代码。禅宗的两个部分详细描述了这个概念:

显式的比隐式的好。(2)
应该有一种——最好只有一种——明显的方法来做到这一点。(12)
错误永远不应该悄无声息地过去。(10)
除非明确沉默。(11)

模块化(Modularity)

模块化是将代码划分为可以分离和重新组合的组件的想法,以实现更大的灵活性和独立性。

简单总比复杂好。复杂胜于凌乱。(3)复杂胜于凌乱。(4)

复杂(complex )和凌乱(complicated)之间的区别很重要:

  • 复杂的代码很难理解,因为它涉及大量不同但相关的实体。
  • 凌乱的代码本身很难理解。

实用主义(Pragmatism)

在现实世界中,开发人员在面对各种限制(业务现实、时间、预算等)的情况下进行工作,同时需要提供长期可行的高质量产品。开发人员经常需要务实地平衡实现目标的最佳方式和最迅速的方式。这种妥协的态度是Python之禅中的关键要素。

特殊情况还不足以违反规则。(9)
尽管实用性胜过纯粹性。(10)
现在总比没有好。(16)
尽管从来没有比“现在”更好。(17)

了解了Python 之禅:愿它的概念能够指导您完成您的开发之旅!在做出技术选择时牢记这一点应该会让你走上清晰和Pythonic代码的道路。接下介绍常用的27个高级技巧,这些技巧不仅加快了编码速度,而且使代码更干净、更容易理解。这些python 技巧是python的之禅原则的具体实现。

27个python技巧

1. F-Strings:动态字符串格式

使用 f-strings (Python 3.6+) 进行简洁和动态的字符串格式化。

优点:

  1. 简洁易读的语法。
  2. 轻松嵌入表达式到字符串中。

缺点:

  1. 仅限于Python 3.6及以上版本。
  2. 在处理安全性漏洞时需要小心,防止SQL注入。
name = "John"
age = 25
message = f"My name is {name}, and I am {age} years old."

2.装饰器(Decorators):动态增强功能

利用装饰器动态扩展或修改函数,增强代码模块化。

优点:

  1. 提供了一种扩展函数行为的简洁方法。
  2. 增强代码的可重用性。

缺点:

  1. 过度使用装饰器会使代码更难理解。

参见《如何与数据对话:掌握Python装饰器(Decorators),提升数据科学项目效能

3.利用help()函数掌握 Python

利用该help()函数作为强大的工具来深入了解 Python 模块、函数和对象,以便更好地理解和使用。

优点:

  1. 即时文档:快速访问代码中任何 Python 对象、模块或函数的文档。
  2. 交互式学习:非常适合直接从 Python 解释器或脚本探索和学习不熟悉的模块或函数。

缺点:

  1. 有限的细节:提供的信息help()有时可能很简洁,对于复杂的主题可能需要更详细的文档。其有效性help()取决于代码中文档字符串的存在和质量。
def calculate_square(number):
    """
    Calculates the square of a given number.Parameters:
    - number (int): The input number.
    Returns:
    - int: The square of the input number.
    """
    return number ** 2

help(calculate_square)
print(calculate_square.__doc__)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.列表推导式(List Comprehensions):紧凑的列表创建方式

采用列表推导式,以一种简洁而易读的方式创建列表,减少对多行循环的需求。

优点:

  1. 通过压缩列表创建逻辑,提升可读性。
  2. 通常相比传统循环,能够提高性能。

缺点:

  1. 避免嵌套列表推导式,以提高可读性,尤其是在逻辑较为复杂的情况下。
squares = [x**2 for x in range(10) if x % 2 == 0]
squares

5.循环中的else子句

在循环中使用 else 子句,以便在循环自然完成时执行代码。

优点:

  1. 允许在循环自然完成而无需break语句时执行代码。
  2. 非常适合特定操作应遵循成功循环的场景。

缺点:

  1. 经常被忽视或误解,导致潜在的逻辑错误。
for n in  range ( 2 , 10 ): 
    for x in  range ( 2 , n): 
        if n % x == 0 : 
            break 
    else : 
        print (n, "is a prime number.")

6.Lambda 函数:快速且匿名的函数

提示:使用 lambda 函数进行快速匿名函数定义。

优点:

  1. 简洁的单行代码实现简单的功能。
  2. 不需要正式的函数定义。

缺点:

  1. 仅限于单一表达;不适合复杂的逻辑。
  2. 如果过度使用会降低代码的可读性。
add_numbers = lambda x, y: x + y
result = add_numbers(3, 5)

7.Python 迭代器使用iteration、zip

使用enumerate()和zip()函数对序列进行更多 Python 迭代。

优点:

  1. enumerate():通过索引和值简化迭代。
  2. zip():促进多个列表的并行迭代。

缺点:

  1. 无重大影响;提高代码的清晰度和简洁性。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 22]
for index, name in enumerate(names):
    print(f"Person {index + 1}: {name}")
for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8.*args 和 **kwargs:灵活的函数参数

使用*args和**kwargs将可变数量的参数传递给函数,为广泛的用例提供灵活性。

优点:

  1. 非常适合处理可变数量的参数。
  2. 允许创建多功能函数和包装器。

缺点:

  1. 需要仔细记录,因为函数签名可能不会显示所有可能的参数。
def multiply(*args):
    result = 1
    for num in args:
        result *= num
    return result

multiply(1,2,3,4)

9.使用try和except进行优雅的错误处理

合并try和except块以进行优雅的错误处理,从而增强代码的稳健性。

优点:

  1. 错误恢复能力,防止您的程序因意外错误而崩溃。
  2. 增强的调试:提供对错误原因的深入了解,有助于有效的调试。
  3. 用户友好:允许您向用户传达特定的错误消息以获得更好的体验。

缺点:

  1. 开销:在某些情况下,使用try和except可能会带来轻微的性能开销。
  2. 潜在的疏忽:错误地捕获或抑制错误可能会掩盖潜在的问题。
def divide_numbers(a, b):
    try:
        result = a / b
        print(f"The result of {a} divided by {b} is: {result}")
    except ZeroDivisionError:
        print("Cannot divide by zero! Please provide a non-zero denominator.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    else:
        print("Division successful!")
# Testing the function
divide_numbers(10, 2)  # Normal division
divide_numbers(5, 0)   # Division by zero
divide_numbers("a", 2) # Unexpected error (TypeError)

10.列表切片:功能强大且富有表现力

利用列表切片对列表进行简洁且富有表现力的操作。

优点:

  1. 简化提取子列表、反转或跳过元素等操作。
  2. 增强代码可读性并减少对显式循环的需求。

缺点:

  1. 过度使用复杂的切片可能会影响代码的可读性。
original_list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] 
sublist =original_list[ 2 : 6 ]
sublist

11.生成器(Generators):内存高效迭代

用生成器迭代大型数据集,而无需将所有内容加载到内存中。

优点:

  1. 有效处理大型数据集。
  2. 即时生成项目,节省内存。

缺点:

  1. 生成器是一次性迭代器;一旦消耗,就不能重复使用。
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for x in fibonacci(10):
  print(x)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

12.断言(Assertions):充满信心地调试

提示:在开发过程中使用断言来确认有关代码状态的假设。

优点:

  1. 通过尽早发现潜在问题来增强代码可靠性。
  2. 提供一种方法来确认有关代码的假设。

缺点:

  1. 在生产代码中过度使用会影响性能
num = -4
assert num > 0, "Number must be positive"

13.深复制与浅复制:明智地复制

提示:了解处理可变对象deepcopy和处理可变对象的区别。shallow copy

优点:

  1. Shallow copy:创建一个包含对相同对象的引用的新集合。
  2. Deepcopy:生成原始对象及其所有内容的独立克隆。

缺点:

  1. 当需要深复制时使用浅复制可能会导致原始数据的意外修改。
import copy 
origin = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] 
Shoulder = copy.copy(origin) 
deep = copy.deepcopy(origin)
origin[0][0]=100
print(Shoulder)
print(deep)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

14.随机模块:拥抱不可预测性

使用该random模块将可变性或随机性引入代码中。

优点:

  1. 对于模拟、游戏或任何需要不可预测性的场景很有用。
  2. 提供多种随机化功能。

缺点:

  1. 结果并不是真正随机的;它们是伪随机的。
import random
# Generating a random number between 1 and 10
random_number = random.randint(1, 10)

15.Defaultdict:简化字典操作

使用defaultdict模块collections来简化字典操作。

优点:

  1. 通过为不存在的键提供默认值来简化代码。
  2. 消除显式密钥存在检查。

缺点:

  1. 需要导入collections模块。
from collections import defaultdict 
word = "pythonic"
letter_count = defaultdict(int) 
for letter in word: 
    letter_count[letter] += 1
letter_count

16.海象运算符(Walrus Operator ) ( :=):内联赋值以提高效率

使用海象运算符 (Python 3.8+) 进行表达式内的内联赋值。

优点:

  1. 高效地分配值并在同一表达式中使用它们。
  2. 在某些情况下减少冗余。

缺点:

  1. 过度使用它会使不熟悉该操作符的人更难阅读代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

17.类型提示:增强代码清晰度

提示:采用类型提示 (Python 3.5+) 来提高代码清晰度,尤其是在大型项目中。

优点:

  1. 提高代码的可读性和可维护性。
  2. 实现更好的 IDE 支持和静态类型检查。

缺点:

  1. Python 仍然是一种动态类型语言;类型提示是可选的,不是强制的——它是为了阅读。
def greet(name: str) -> str:
    return f"Hello, {name}!"

18.命名元组(Namedtuples):自说明的数据结构

使用命名元组创建简单的、自记录的数据结构。

优点:

  1. 提供轻量级、不可变的数据结构。
  2. 通过为每个字段命名来增强代码可读性。

缺点:

  1. 不可变;创建后无法修改。
  2. 对于可变结构,请考虑使用数据类 (Python 3.7+)。
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age'])
alice = Person(name="Alice", age=30)
print(alice)
print(alice.name)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

19.压缩和解压列表:组合和展开序列

用于zip()组合多个可迭代对象,从而更轻松地并行循环多个列表。

优点:

  1. 简化了同时迭代多个列表的过程。
  2. 对于需要一起处理不同列表中的项目的任务非常方便。

缺点:

  1. zip()停在最短的输入列表处;对于不同大小的可迭代对象,请考虑使用itertools.zip_longest().
names = ["Alice", "Bob"]
scores = [85, 92]
for name, score in zip(names, scores):
    print(f"{name}:{score}")

20. 字典 get() 和 setdefault():优雅的键处理方式

get()提示:使用和方法增强字典操作setdefault()。

优点:

  1. get():检索键的值,如果键不存在则提供默认值。
  2. setdefault():如果key不存在则设置默认值,防止多余的key检查。

缺点:

  1. 忽略这些方法可能会导致检查密钥是否存在的冗余代码。
data = {"name": "Alice"}
age = data.get("age", 30)
print(age)
data.setdefault("country", "USA")
print(data['country'])
print(data)

21. __main__ 保护:脚本执行控制

提示:if __name__ == “__main__”:当直接运行脚本时,使用守卫来控制代码执行。

优点:

  1. 确保某些代码仅在直接执行脚本时运行,而不是在导入时运行。
  2. 对于可以为函数导入或为任务直接运行的实用程序脚本很有用。

缺点:

  1. 导入模块时忘记使用此防护可能会导致意外行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

22. 虚拟环境:隔离项目特定开发的依赖关系

提示:利用虚拟环境来隔离项目特定的依赖关系,防止与系统范围的包发生冲突。

优点:

  1. 确保每个项目都有一个干净且隔离的环境。
  2. 便于管理依赖关系并避免冲突。

缺点:

  1. 忘记激活虚拟环境可能会导致全局 Python 环境中意外安装包。
python -m venv my_project_env
source my_project_env/bin/activate

23. 星号 (*) 运算符:用途广泛且功能强大

提示:探索星号(Asterisk ) ( *) 运算符在打包和解包、关键字参数解包和重复方面的多功能性。

优点:

  1. 有效地将集合解包为单独的元素。
  2. 促进函数中的动态参数处理。

缺点:

  1. 过度使用会降低代码的可读性,尤其是连续多次解包时。
def func(a, b, c):
    return a + b + c

values = [1, 2, 3]
print(func(*values))

24. 上下文管理器(with语句):资源管理的简便方式

提示:将上下文管理器与with语句结合使用以实现高效的资源管理。

优点:

  1. 确保资源的正确设置和拆卸。
  2. 提高代码可读性并降低资源泄漏的可能性。

缺点:

  1. 忘记在有益时使用该with语句可能会导致与资源相关的问题。
with open('iris.csv', 'r') as f:
    content = f.read()

25. 下划线 ( _) 用途:命名和循环的多功能性

提示:利用下划线 ( _) 作为循环中的一次性变量。

优点:

  1. 表示命名约定中的“受保护”变量。
  2. 重用 REPL 环境中的最后结果。
  3. 当不需要循环变量时,充当循环中的一次性变量。

缺点:

  1. 不同的用途可能会令人困惑,尤其是对于新程序员来说。
for _ in  range ( 5 ): 
    print (_, "Hello, World!" )

26. 映射、过滤和归约:Python 中的函数式编程

提示:结合map()、filter()、 和reduce()作为处理集合的函数方法,减少对显式循环的需要。

优点:

  1. map():将函数应用于集合中的每个项目。
  2. filter():根据谓词选择项目。
  3. reduce():累积应用函数,将序列减少为单个值。

缺点:

  1. 注意,在Python 3.x中,map()返回filter()迭代器;如果需要,将它们转换为列表。
names = ["alice", "bob", "charlie"]
upper_names = list(map(str.upper, names))
print(upper_names)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

27.合并字典:简化字典操作

提示:使用update()方法或{**dict1, **dict2}语法来合并字典。

优点:

  1. 简化多个词典内容的组合。
  2. 提供选择合并方法的灵活性。

缺点:

  1. 在处理嵌套字典时,过度使用这种方法可能会导致意想不到的结果。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
print({**dict1,**dict2})
dict1.update(dict2)
print(dict1)

总结了27个Python编程技巧,以Python之禅为指导原则。强调编写清晰、可读的代码是一门艺术,Python之禅的19条原则包括"美丽总比丑陋好"、“可读性很重要”、"明确比隐式好"等,提醒开发者在实际工作中要务实地平衡目标实现的最佳和最迅速的方式。这些技巧涵盖字符串格式化、装饰器、异常处理、列表切片等多个方面,旨在引导开发者编写清晰、Pythonic的代码。

以上就是“一文带您了解Python之禅(Zen)及27个高级技巧”的全部内容,希望对你有所帮助。
?
?关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

文章来源:https://blog.csdn.net/m0_58477260/article/details/135594186
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。