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

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

ztj100 2024-12-17 17:46 30 浏览 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网络编程(JAVA网络编程技术)

网络编程三要素1.IP地址:表示设备在网络中的地址,是网络中设备的唯一标识2.端口号:应用程序在设备中唯一的标识3.协议:连接和数据在网络中传输的规则。InetAddress类Java中也有一个...

字节Java全能手册火了!多线程/网络/性能调优/框架啥都有

前言在这个技术不断更新的年代,跟不上时代变化的速度就会被刷掉,特别是咱们程序员这一群体,技术不断更新的同时也要同时进步,不然长江后浪推前浪,前浪......一个程序员从一个什么都不懂的小白在学到有一定...

一分钟了解java网络编程(java基础网络编程)

一、OSI七层网络模型应用层:Http协议、电子邮件传输、文件服务器等;表示层:数据转换,解决不同系统的兼容问题(跨语言);会话层:建立与应用程序的会话连接;传输层:提供了端口号和传输协议(TPC/U...

Java编程-高并发情况下接口性能优化实践-提升吞吐量TPS

记得前段时间工作中接到一个任务是优化一个下单接口的性能提高接口的吞吐量TPS,前期通过arthas工具跟踪接口的具体方法调用链路及耗时,发现了影响此接口的性能瓶颈主要是加锁的方式,后来变更了锁的方式...

socket 断线重连和心跳机制如何实现?

一、socket概念1.套接字(socket)是网络通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,...

迅速了解-Java网络编程(java基础网络编程)

Java网络编程在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进行I/O操作呢?这就要提到Java的网络编程了。...

Java网络编程详解(java 网络编程)

网络编程基础知识最!最!最!重要网络编程基础概念网络编程不等于网站编程,网络编程即使用套接字(socket)来达到各进程间的通信,现在一般称为TCP/IP编程;网络编程分为服务端和客户端。服务端就相当...

「开源推荐」高性能网络通信框架 HP-Socket v5.7.2

简介HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/...

Java网络编程从入门到精通:打造属于你的网络世界

Java网络编程从入门到精通:打造属于你的网络世界在当今这个信息爆炸的时代,网络编程已经成为程序员必不可少的一项技能。而Java作为一种功能强大且广泛使用的编程语言,在网络编程领域也有着举足轻重的地位...

5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色

一、核心功能与定位1.Socket类:底层通信的基石-位于System.Net.Sockets命名空间,提供对网络协议栈的直接操作,支持TCP、UDP等多种协议。-手动管理连接细节:需...

(三)谈谈 IO 模型(Socket 编程篇)

快过年啦,估计很多朋友已在摸鱼的路上。而我为了兄弟们年后的追逐,却在苦苦寻觅、规划,导致文章更新晚了些,各位猿粉谅解。上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让BIO、NIO编程过程呈...

大数据编程入门:Java网络编程(大数据 编程)

如果想要编写出一个可以运行在多个设备上的程序,应该怎么做呢?答案是网络编程,今天小编将为大家带来大数据编程入门:Java网络编程。一、网络编程概念网络编程是指编写在通过网络连接的多个设备(计算机)上运...

基于JAVA的社交聊天室(java聊天设计与实现)

基于Java的社交聊天室一、前言随着互联网技术的迅速发展,实时通信和在线社交已成为人们日常生活的重要组成部分。基于Java的社交聊天室系统,凭借其跨平台、高性能和安全性等特点,为用户提供了一个集中、开...

java-socket长连接demo体验(java socket长连接)

作者:DavidDing来源:https://zhuanlan.zhihu.com/p/56135195一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有:服务端和app端通过阿里i...

JAVA数据库编程(java数据库编程指南)

预计更新###第一节:什么是JAVA-JAVA的背景和历史-JAVA的特点和应用领域-如何安装和配置JAVA开发环境###第二节:JAVA基础语法-JAVA的基本数据类型和变量-运算符和...

取消回复欢迎 发表评论: