python中的for........in 配合序列解包
一、核心语法:for 循环元组解包(序列解包)
先看代码:
targets = [
("百度", "https://www.baidu.com"),
("搜狗", "https://www.sogou.com"),
("京东", "https://www.jd.com"),
]
# 完整正确写法
for name, url in targets:
print(name, url)
1. 底层原理
targets 是列表,列表里每一个元素都是一个二元元组 (字符串, 字符串)。
targets 时,每次取出一个元组,直接拆分成两个变量 name、url,这个过程叫序列解包。等价拆解过程:
# 循环第一步取出第一个元组
item = ("百度", "https://www.baidu.com")
# 自动解包赋值
name, url = item
2. 解包规则
- 右边可迭代对象(元组 / 列表)里元素数量,必须和左边变量数量一致,否则报错;
# 报错:值数量不匹配
for name in targets:
# name 拿到的是整个元组 ("百度", "url")
for name, url, x in targets:
# 每个元组只有2个值,塞3个变量直接报错
- 不止元组,列表也能解包:
targets = [["百度", "url"], ["搜狗", "url"]]
for name, url in targets:
pass
二、拓展用法
1. 多层解包
data = [(1, ("a", "b")), (2, ("c", "d"))]
for num, (s1, s2) in data:
print(num, s1, s2)
2. 单变量接收整个元组(不解包)
for item in targets:
print(item[0], item[1]) # item[0]名称 item[1]链接
3. 推导式中同样能用解包
# 提取所有网站名称
names = [name for name, url in targets]
# 生成 {名称:链接} 字典
site_dict = {name:url for name, url in targets}
三、补充:下划线占位符
如果只需要其中一个值,没用的变量用
_ 接收:# 只拿url,名称不用
urls = [url for name, url in targets]
# 规范写法(标识变量未使用)
urls = [url for _, url in targets]

浙公网安备 33010602011771号