引言
大家好,在本文中,我将介绍一些大家在日常编码中都可以使用的技术或功能。在学习这些 Python技巧的过程中,我发现了一些超越常规的技术,它们为我们的代码增添了一丝魔力。
闲话少说,我们直接开始吧!
海象运算符
def extract_val():for i in range(10):yield iyield -1def some_func(val):passgen_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 iyield -1def some_func(val):passgen_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会尝试将字典中的键与函数参数列表中的相应参数名称进行匹配。如果键与参数名称相匹配,则相应的值将被分配给该参数。
求模
total_minutes = 125hours, 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 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]
联合类型
Python 3.10 引入的联合类型允许变量、函数参数和返回类型接受多种类型的值。这一特性增强了代码的表现力和类型安全性,允许开发人员精确指定在给定上下文中哪些类型是可接受的。
from typing import Uniondef process_data(data: Union[int, float, str]) -> None:print(data)process_data(10) # Validprocess_data(3.14) # Validprocess_data("hello") # Valid
以上是一些大家日常可以使用到的技术,这些技巧强化了在不断发展的 Python 生态系统中探索基础知识和持续学习的重要性。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90623.html