编程学习网 > 编程语言 > Python > Python教程:推荐Python中五个不为人知的小技巧!
2024
06-08

Python教程:推荐Python中五个不为人知的小技巧!

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

闲话少说,我们直接开始吧!
海象运算符
这是在 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 循环中条件判断的一部分。

字典解包

我们直接通过例子来说明:
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会尝试将字典中的键与函数参数列表中的相应参数名称进行匹配。如果键与参数名称相匹配,则相应的值将被分配给该参数。

求模

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

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

提取嵌套列表

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

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 compression
flattened_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 chain
lst = [[1], [2], [3], [4], [5]]
flattened_lst = list(chain.from_iterable(lst))
print(flattened_lst)
# [1, 2, 3, 4, 5]

联合类型

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

from typing import Union

def process_data(data: Union[int, float, str]) -> None:
    print(data)

process_data(10)      # Valid
process_data(3.14)    # Valid
process_data("hello") # Valid

总结

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

以上就是Python教程:推荐Python中五个不为人知的小技巧!的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取