目录
一、推导式
推导式分为列表推导式(List Comprehensions)、字典推导式(Dictionary Comprehensions)、集合推导式(Set Comprehensions)和生成器表达式(Generator Expressions),都是为了简化代码、使代码更加简洁和高效的方式。
1、列表推导式
基本语法:
# new_list = [expression for item in iterable if condition]
# 解释
# expression 是基于 item 的表达式。
# iterable 是可迭代对象。
# condition 是一个可选的过滤条件。
例子
# 循环输出0-9的次方
squares = [x**2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2、字典推导式
字典推导式用于创建字典,语法与列表推导式类似,但使用大括号 {} 而不是方括号 []。
基本语法:
new_dict = {key_expression: value_expression for item in iterable if condition}
例子
# 循环输出0-4的次方
doubles = {x: x*2 for x in range(5)}
print(doubles) # 输出: {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
# 输出的类型也是键值对的类型,每个值都有对应的索引
3、集合推导式
集合推导式用于创建集合
基本语法:
new_set = {expression for item in iterable if condition}
例子
# 循环输出0-9除2余数为0的数
evens = {x for x in range(10) if x % 2 == 0}
print(evens) # 输出: {0, 2, 4, 6, 8}
4、生成器表达式
生成器表达式类似于列表推导式,但使用圆括号 () 而不是方括号 [],它们返回一个生成器对象而不是立即计算整个列表。
gen = (x**2 for x in range(10))
for i in gen:
print(i)
# 这将输出与列表推导式相同的平方数,但使用更少的内存,因为生成器在每次迭代时才计算下一个值。
二、拆包
拆包(Unpacking)是一种非常有用的功能,它允许你从一个序列或者可迭代对象中取出元素,并将这些元素分配给多个变量。
1、元组拆包
假设你有一个包含三个元素的元组,你可以直接将其元素分配给三个不同的变量
t = (1, 2, 3)
a, b, c = t
print(a) # 输出: 1
print(b) # 输出: 2
print(c) # 输出: 3
2、列表拆包
列表同样可以进行拆包,但是需要注意的是列表是可变的,而元组是不可变的。在某些情况下,列表拆包可能会导致意外的结果,尤其是在列表的长度不确定时。
l = [4, 5, 6]
x, y, z = l
print(x) # 输出: 4
print(y) # 输出: 5
print(z) # 输出: 6
3、字典拆包
对于字典,拆包通常涉及两个方面:键的拆包和值的拆包。当使用**操作符时,字典会被拆解成关键字参数。
d = {'name': 'Alice', 'age': 30}
name, age = d.values()
print(name) # 输出: Alice
print(age) # 输出: 30
# 使用 ** 进行拆包
def greet(**kwargs):
#这里定义了一个greet函数,它可以接收任何数量的关键字参数,**kwargs 实现,
# **kwargs 表示任何传入的额外关键字参数,都将存到一个kwargs的新字典中
return f"Hello, {kwargs['name']}!"
# 返回kwargs字典中的值,使用了一个格式化字符串(f-string),{kwargs['name']}这是对name键的引用
# Hello+{kwargs['name']}进行一个拼接结果,将关键字nanme里的值提取出来
message = greet(**d)
# 这里的话就是greet函数被调用,字典d通过**d的形式将参数传给了函数greet,键值对被拆分成独立的关键字,
# 这样 greet 函数就可以像接收单独的关键字参数一样接收这些键值对。
print(message) # 输出: Hello, Alice!
4、拆包与星号表达式
当你处理未知长度的序列时,星号(*)表达式可以帮助你在拆包时捕获多余的元素
items = [1, 2, 3, 4, 5]
first, *middle, last = items
print(first) # 输出: 1
print(middle) # 输出: [2, 3, 4]
print(last) # 输出: 5
# 在上面的例子中,*middle 会捕获所有除了第一个和最后一个之外的元素。