推荐Python中五个不为人知的小技巧

01

引言

大家好,在本文中,我将介绍一些大家在日常编码中都可以使用的技术或功能。在学习这些 Python技巧的过程中,我发现了一些超越常规的技术,它们为我们的代码增添了一丝魔力。

闲话少说,我们直接开始吧!

02

 海象运算符

 

这是在 python 3.8版本中发布的新特性。这有助于我们在使用内部函数时定义值。我们来看个例子:

def extract_val():    for i in range(10):        yield i    yield -1
def some_func(val):    pass
gen_obj = extract_val()val = next(gen_obj)while val != -1:    some_func(val)    val = next(gen_obj)

在这个示例中,我创建了一个生成器对象gen_obj,然后调用 next 函数获取下一个值。我通过检查该值是否为负 1,然后调用next函数获取下一个val。现在,让我们用海象运算符 := 来实现同样的功能,代码如下:

def extract_val():    for i in range(10):        yield i    yield -1
def some_func(val):    pass
gen_obj = extract_val()while (val := next(gen_obj))!= -1:    some_func(val)

在这里我将val作为循环的结果,同时将val作为 while 循环中条件判断的一部分。

03

  字典解包

 

我们直接通过例子来说明:

person = {        "name": "AIWay",        "age": "26",    }    name, age = person["name"], person["age"]print(f"姓名: {name}")print(f"年龄: {age}")

虽然我们通过传递给字典对应的Key来解包相应的Value,但是更为简单的方式是使用两个星号直接解包字典,如下:

person = {        "name": "AIWay",        "age": "26",    }  def print_data(name, age):    print(f"姓名: {name}")    print(f"年龄: {age}")
print_data(**person)

有趣的是,即使我改变 print_data 函数中参数的顺序,即将函数声明修改为def print_data(age,name),它仍然可以正常工作。

这主要是因为在执行解包过程时,Python会尝试将字典中的键与函数参数列表中的相应参数名称进行匹配。如果键与参数名称相匹配,则相应的值将被分配给该参数。
04

 求模

 

函数divmod 可用于以更有条理的方式格式化数字,例如以小时和分钟为单位显示时间。因此,它可以在一个步骤中执行除法和求模运算

total_minutes = 125hours, minutes = divmod(total_minutes, 60)print(f"{hours} hours and {minutes} minutes")   # 2 hours and 5 minutes

 

05

  提取嵌套列表

 

给定一个嵌套列表,为了对其进行展开处理,可以采用下面的旧方法:

lst = [[1], [2], [3], [4], [5]]new_lst = []for sublist in lst:    for element in sublist:        new_lst.append(element)print(new_lst)# [1, 2, 3, 4, 5]
## OR using list compressionflattened_lst = [val for sublist in List1 for val in sublist]print(flattened_lst)# [1, 2, 3, 4, 5]

但是,有一种技术经常被用来将嵌套列表展开为单个列表,从而使代码更加简洁易读。

lst = [[1], [2], [3], [4], [5]]flattened_lst = sum(lst, [])print(flattened_lst)# [1, 2, 3, 4, 5]

上述代码中,将 lst 中的所有子列表合并为一个列表。[] 作为求和操作的初始值,确保结果是一个 list。虽然它很简洁,但内存效率不高。

最终我们推荐的一种方法是使用 itertools.chain()。这种方法可以避免创建中间列表,因此非常节省内存,适合处理大型数据集。

from itertools import chainlst = [[1], [2], [3], [4], [5]]flattened_lst = list(chain.from_iterable(lst))print(flattened_lst)# [1, 2, 3, 4, 5]

 

06

  联合类型

 

Python 3.10 引入的联合类型允许变量、函数参数和返回类型接受多种类型的值。这一特性增强了代码的表现力和类型安全性,允许开发人员精确指定在给定上下文中哪些类型是可接受的。

from typing import Union
def process_data(data: Union[int, float, str]) -> None:    print(data)
process_data(10)      # Validprocess_data(3.14)    # Validprocess_data("hello") # Valid

 

07

总结
 

以上是一些大家日常可以使用到的技术,这些技巧强化了在不断发展的 Python 生态系统中探索基础知识和持续学习的重要性。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90623.html

(0)
guozi的头像guozi
上一篇 2024年6月7日
下一篇 2024年6月7日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注