百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

干净、可读的 Python 代码的提示和技巧

ztj100 2024-12-17 17:46 23 浏览 0 评论

从装饰器到列表推导式,这些内置的 Python 功能可帮助开发人员将笨拙的代码转换为干净、可读的解决方案,而无需重新发明轮子。

学习编码是一个陡峭的攀登过程。学习的一面包括学习如何编码,另一面包括如何优雅地进行编码。对我来说,这是最困难的部分。我可以蛮力和笨拙地解决很多问题,但是当涉及到编写一个优雅的解决方案时,不,谢谢,我每次都会使用嵌套循环。但当然,这不起作用,原因有几个,因为代码应该是 DRY (Don't Repeat Yourself) 的,内存友好,并且其他人可以阅读。但 Google 是我的朋友,我慢慢发现了一些工具,这些工具可以帮助我以更简单的方式将更优雅的解决方案组合在一起,而无需重新发明轮子。以下是一些 Python 的内置帮助程序,它们有助于提高代码的可读性和易用性。

*args 和 **kwargs

*args 和 **kwargs 有助于使函数广泛使用。使用 *args 作为 functions 参数允许函数采用任意数量的参数。如果没有 *args,则必须考虑 integer 和 string 参数。

使用 *args:

没有它只会引发一个错误......

**kwargs 具有与 *args 类似的功能,但对键值对执行此操作。**kwargs 可用于没有所需数字或键值对数量未知的函数。

def dictionary_builder(**kwargs):
    for x,y in kwargs.items():
        print(f'key: {x}, value: {y}')

dictionary_builder(topic = 'Python')
dictionary_builder(city = 'Brooklyn', state = 'New York')
dictionary_builder(month = 'March', day = 1, year = 2024)

# key: topic, value: Python
# key: city, value: Brooklyn
# key: state, value: New York
# key: month, value: March
# key: day, value: 1
# key: year, value: 2024

表推导式

列表推导式允许开发人员仅使用一行创建列表。如果不使用列表推导式,您可以使用以下代码构建数字列表:

numbers = []

for i in range (1, 5):
    numbers.append(i)

列表推导式将该代码转换为单行代码。基本语法是:

[expression for item in iterable] 。在简单的代码中,它看起来像这样:

numbers= [i for i in range(5)]

列表推导式还可以包括筛选功能。

even_numbers = [i for i in range(1,5) if i % 2 == 0]
print(even_numbers) # [2, 4]

列表并不是您可以以这种方式创建的唯一数据结构。我们可以创建一个字典并使用相同的创建模式进行设置。字典的基本语法是:

{key_expression: value_expression for item in iterable}

我们可以将数字列表中的每个数字乘以 10 到 by_tens 字典中。

numbers = [1, 2, 3, 4, 5]
by_tens = {num: num*10 for num in numbers}
print(by_tens) #{1: 10, 2: 20, 3: 30, 4: 40, 5: 50}

我们也可以用 set 来做到这一点。基本语法是

{expression for item in iterable} 。代码如下所示:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_set = {num for num in numbers if num % 2 == 0}
print(even_set)# {2, 4, 6, 8, 10}

zip()

zip() 允许您同时迭代多个列表并创建相应元素的元组。zip() 将本来可能是多行迭代的内容缩短为一行代码。

zip() 迭代最小列表的长度。如果给定列表的长度不同,则 Tuples 的长度将仅与最小的列表一样长。 下面的代码清楚地说明了上述两点:

pets = ["dog", "cat", "horse", "fish", "turtle"]
names = ["Maxie", "Spot", "Dusty", "Swift", "Speedy"]
ages = [7, 4, 1, 12]
 
# Create a zipped object combining the pets, names, and ages lists
result = zip(pets, names, ages)
 
# Print the zipped object
print("Zipped result as a list:")
for i in list(result):
  print(i)
  
# Zipped result as a list:
# ('dog', 'Maxie', 7)
# ('cat', 'Spot', 4)
# ('horse', 'Dusty', 1)
# ('fish', 'Swift', 12)

合并词典

你可以使用 update() 功能或字典解包语法 (**) 合并字典。

land_pets = {'dog': 'Maxie', 'cat': 'Spot', 'horse': 'Dusty' }
water_pets = {'fish': 'Swift', 'turtle': 'Speedy'}
all_pets = {**land_pets, **water_pets}

print(all_pets)

#{'dog': 'Maxie', 'cat': 'Spot', 'horse': 'Dusty', 'fish': 'Swift', 'turtle': 'Speedy'}

或者你可以使用 update 函数将 water_pets 对象添加到 land_pets 对象:land_pets.update(water_pets)。

链接比较运算符

链接比较运算符允许您将多个比较合并到一个表达式中。链接消除了对显式 and' 运算符的需求。它有助于提高代码的可读性和性能,因为它减少了单独比较的数量。

以下示例比较变量 miles 以确定距离是否在范围内。代码如下所示,没有链接比较运算符:

def distance_checker(miles):
    if miles > 0 and miles <10:
        print("in range")
    else:
        print("out of range")

distance_checker(3)

# in range

当比较表示为复合条件时,它如下所示:

def distance_checker(miles):
    if  0 < miles <10:
        print("in range")
    else:
        print("out of range")

distance_checker(13)

# out of range

三元运算符

三元运算符允许开发人员在一行中编写 if 条件。基本语法是:

result = true_value if condition else false_value

如果条件的计算结果为 True,则表达式返回 true 值。如果条件的计算结果为 False,则表达式返回 false 值。下面是一个没有 turnery 运算符的示例:

x = 5

if x % 2 == 0:
    result = "even"   
else:
    result = "odd"

print(result)

#odd

与带有三元运算符的 if 条件相比:

x = 5

result = "even" if x % 2 == 0 else "odd"
print(result)

装饰

装饰器在不更改源代码的情况下修改函数。装饰器是一个新函数,它将原始函数作为参数,使用新函数对其进行修改,然后返回具有更新功能的函数。

让我们从一个基本的除法函数开始。

def division(x,y):
    print(x/y)

除法(10,5) 打印 2

除法(9,3) 打印 3

对于此示例,我们假设此函数始终需要将较大的数字除以较小的数字。编辑源代码不理想的原因有很多,在这些情况下,装饰器会派上用场。如果你熟悉 closures,这看起来很熟悉。对于那些不熟悉的人来说,装饰器是一个构建、修改和返回函数的函数。装饰器的 shell 将如下所示:


#decorator function definition, function passed in as an argument
def decorated_division(func):

    #inner function where the modifications will take place, has the same arguments as the function it's modifying
    def inner(a,b):

    #return the inner function   
    return inner


在内部函数中,我们将检查参数的顺序是否正确,如果不正确,则进行必要的交换(另一个 Python 技巧)。

def decorated_division(func):

    def inner(a,b):
        if a < b:
            a,b = b,a
            
        return func(a,b)

    return inner


内部函数的外观和行为与任何基本函数一样。

现在有几种不同的方法可以使用 decorator 函数来修改 division 函数。第一种方法是使用 @decorator,它看起来像这样:

@decorated_division
def division(x,y):
    print(x/y)
    
division(5, 10)

# 2

另一种方法是将函数分配为变量:

new_division = decorated_division(division)
new_division(5,10) 

# 2

祝您编码愉快!

这些技巧肯定会将代码从基本提升到优雅。您使用 Python 的次数越多,它就越容易。

相关推荐

Java项目宝塔搭建实战MES-Springboot开源MES智能制造系统源码

大家好啊,我是测评君,欢迎来到web测评。...

一个令人头秃的问题,Logback 日志级别设置竟然无效?

原文链接:https://mp.weixin.qq.com/s/EFvbFwetmXXA9ZGBGswUsQ原作者:小黑十一点半...

实战!SpringBoot + RabbitMQ死信队列实现超时关单

需求背景之为什么要有超时关单原因一:...

火了!阿里P8架构师编写堪称神级SpringBoot手册,GitHub星标99+

Springboot现在已成为企业面试中必备的知识点,以及企业应用的重要模块。今天小编给大家分享一份来着阿里P8架构师编写的...

Java本地搭建宝塔部署实战springboot仓库管理系统源码

大家好啊,我是测评君,欢迎来到web测评。...

工具尝鲜(1)-Fleet构建运行一个Springboot入门Web项目

Fleet是JetBrains公司推出的轻量级编辑器,对标VSCode。该款产品还在公测当中,具体下载链接如下JetBrainsFleet:由JetBrains打造的下一代IDE。想要尝试的...

SPRINGBOOT WEB 实现文件夹上传(保留目录结构)

网上搜到的SpringBoot的代码不多,完整的不多,能用的也不多,基本上大部分的文章只是提供了少量的代码,讲一下思路,或者实现方案。之前一般的做法都是使用HTML5来做的,大部都是传文件的,传文件夹...

Java项目本地部署宝塔搭建实战报修小程序springboot版系统源码

大家好啊,我是测评君,欢迎来到web测评。...

新年IT界大笑料“工行取得基于SpringBoot的web系统后端实现专利

先看看专利描述...

看完SpringBoot源码后,整个人都精神了

前言当读完SpringBoot源码后,被Spring的设计者们折服,Spring系列中没有几行代码是我们看不懂的,而是难在理解设计思路,阅读Spring、SpringMVC、SpringBoot需要花...

阿里大牛再爆神著:SpringBoot+Cloud微服务手册

今天给大家分享的这份“Springboot+Springcloud微服务开发实战手册”共有以下三大特点...

WebClient是什么?SpringBoot中如何使用WebClient?

WebClient是什么?WebClient是SpringFramework5引入的一个非阻塞、响应式的Web客户端库。它提供了一种简单而强大的方式来进行HTTP请求,并处理来自服务器的响应。与传...

SpringBoot系列——基于mui的H5套壳APP开发web框架

  前言  大致原理:创建一个main主页面,只有主页面有头部、尾部,中间内容嵌入iframe内容子页面,如果在当前页面进行跳转操作,也是在iframe中进行跳转,而如果点击尾部按钮切换模块、页面,那...

在Spring Boot中使用 jose4j 实现 JSON Web Token (JWT)

JSONWebToken或JWT作为服务之间安全通信的一种方式而闻名。...

Spring Boot使用AOP方式实现统一的Web请求日志记录?

AOP简介AOP(AspectOrientedProgramming),面相切面编程,是通过代码预编译与运行时动态代理的方式来实现程序的统一功能维护的方案。AOP作为Spring框架的核心内容,通...

取消回复欢迎 发表评论: