引言
大家好,在本文中,我将介绍一些大家在日常编码中都可以使用的技术或功能。在学习这些 Python技巧的过程中,我发现了一些超越常规的技术,它们为我们的代码增添了一丝魔力。
闲话少说,我们直接开始吧!
海象运算符
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会尝试将字典中的键与函数参数列表中的相应参数名称进行匹配。如果键与参数名称相匹配,则相应的值将被分配给该参数。
求模
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 生态系统中探索基础知识和持续学习的重要性。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90623.html