欢迎光临
我们一直在努力

《超简单:用 Python 让 Excel 飞起来》读书笔记:2.4.4 逻辑运算符 and / or,把 Excel 条件判断串起来

avatar

🔥
个人主页:
杨利杰YJlio

❄️
个人专栏:
《Sysinternals实战教程》
《Windows PowerShell 实战》
《WINDOWS教程》
《IOS教程》

《微信助手》
《锤子助手》
《Python》
《Kali Linux》

《那些年未解决的Windows疑难杂症》
🌟
让复杂的事情更简单,让重复的工作自动化

请添加图片描述

在这里插入图片描述


《超简单:用 Python 让 Excel 飞起来》读书笔记:2.4.4 逻辑运算符 and / or,把 Excel 条件判断串起来

  • 1. 2.4.4 逻辑运算符:用 and 和 or 把条件串起来
  • 2. 为什么 Excel 自动化离不开逻辑运算符?
  • 3. and:所有条件都满足才通过
    • 3.1 基础示例:金额大于 3000 且部门是 IT
    • 3.2 只要有一个条件不满足,结果就是 False
    • 3.3 放到 Excel 行数据里理解
  • 4. or:任意条件满足就通过
    • 4.1 基础示例:状态是待处理或异常
    • 4.2 状态不匹配时才是 False
    • 4.3 部门是 IT 或财务都要处理
  • 5. and 和 or 的区别:不要只背中文意思
    • 5.1 混合条件建议加括号
  • 6. 常见错误:or 不能省略左侧比较对象
    • 6.1 错误写法
    • 6.2 正确写法
    • 6.3 更推荐的写法:使用 in
  • 7. 短路特性:先判空,再处理
    • 7.1 先判空再转字符串
    • 7.2 or 的短路规则
  • 8. 把 and / or 放回 Excel 自动化流程里
    • 8.1 一个完整的模拟案例
    • 8.2 条件拆开写,比一行写完更稳
  • 9. 常见问题与踩坑提醒
    • 9.1 and 和 or 能不能随便混用?
    • 9.2 为什么我写了 or,结果所有数据都命中了?
    • 9.3 判断多个状态时,用 or 还是 in?
    • 9.4 处理 Excel 空值时,为什么要先判空?
  • 10. 总结提升

1号标题图

1. 2.4.4 逻辑运算符:用 and 和 or 把条件串起来

  这一篇继续整理《超简单:用 Python 让 Excel 飞起来》的读书笔记,主题是 Python 里的逻辑运算符。前面学过比较运算符,例如 >、<、==、!=,这些符号可以判断一个条件是否成立。但在真实 Excel 自动化场景里,很多判断并不是一个条件就能完成。

  比如报销数据里,只筛选 金额 > 3000 不够,因为可能还要限定部门;只判断状态是不是“异常”也不够,因为“待处理”可能同样需要进入处理流程。这个时候就需要用 and 和 or 把多个条件串起来。

  我的理解是:比较运算符负责判断“单个条件”,逻辑运算符负责把“多个条件”组合成真正的业务规则。 如果说比较运算符是在判断一个单元格,那么逻辑运算符就是在判断一整行数据到底该不该被处理。

  这张图展示的是逻辑运算符在 Excel 自动化中的整体作用:通过 and 和 or 把多个条件连接起来,最终得到筛选结果。

请添加图片描述

  从图中可以看出,逻辑运算符不是孤立的语法点。它会直接影响自动化脚本如何筛选数据、如何判断行记录、如何决定哪些内容进入下一步处理。如果逻辑条件写错,脚本可能不会报错,但筛选出来的数据会悄悄变错,这比直接报错更危险。

#mermaid-svg-iyNXxhhdbtQhbksI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iyNXxhhdbtQhbksI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iyNXxhhdbtQhbksI .error-icon{fill:#552222;}#mermaid-svg-iyNXxhhdbtQhbksI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iyNXxhhdbtQhbksI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iyNXxhhdbtQhbksI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iyNXxhhdbtQhbksI .marker.cross{stroke:#333333;}#mermaid-svg-iyNXxhhdbtQhbksI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iyNXxhhdbtQhbksI p{margin:0;}#mermaid-svg-iyNXxhhdbtQhbksI .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-iyNXxhhdbtQhbksI .cluster-label text{fill:#333;}#mermaid-svg-iyNXxhhdbtQhbksI .cluster-label span{color:#333;}#mermaid-svg-iyNXxhhdbtQhbksI .cluster-label span p{background-color:transparent;}#mermaid-svg-iyNXxhhdbtQhbksI .label text,#mermaid-svg-iyNXxhhdbtQhbksI span{fill:#333;color:#333;}#mermaid-svg-iyNXxhhdbtQhbksI .node rect,#mermaid-svg-iyNXxhhdbtQhbksI .node circle,#mermaid-svg-iyNXxhhdbtQhbksI .node ellipse,#mermaid-svg-iyNXxhhdbtQhbksI .node polygon,#mermaid-svg-iyNXxhhdbtQhbksI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iyNXxhhdbtQhbksI .rough-node .label text,#mermaid-svg-iyNXxhhdbtQhbksI .node .label text,#mermaid-svg-iyNXxhhdbtQhbksI .image-shape .label,#mermaid-svg-iyNXxhhdbtQhbksI .icon-shape .label{text-anchor:middle;}#mermaid-svg-iyNXxhhdbtQhbksI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iyNXxhhdbtQhbksI .rough-node .label,#mermaid-svg-iyNXxhhdbtQhbksI .node .label,#mermaid-svg-iyNXxhhdbtQhbksI .image-shape .label,#mermaid-svg-iyNXxhhdbtQhbksI .icon-shape .label{text-align:center;}#mermaid-svg-iyNXxhhdbtQhbksI .node.clickable{cursor:pointer;}#mermaid-svg-iyNXxhhdbtQhbksI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iyNXxhhdbtQhbksI .arrowheadPath{fill:#333333;}#mermaid-svg-iyNXxhhdbtQhbksI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iyNXxhhdbtQhbksI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iyNXxhhdbtQhbksI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iyNXxhhdbtQhbksI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iyNXxhhdbtQhbksI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iyNXxhhdbtQhbksI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iyNXxhhdbtQhbksI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iyNXxhhdbtQhbksI .cluster text{fill:#333;}#mermaid-svg-iyNXxhhdbtQhbksI .cluster span{color:#333;}#mermaid-svg-iyNXxhhdbtQhbksI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iyNXxhhdbtQhbksI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iyNXxhhdbtQhbksI rect.text{fill:none;stroke-width:0;}#mermaid-svg-iyNXxhhdbtQhbksI .icon-shape,#mermaid-svg-iyNXxhhdbtQhbksI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iyNXxhhdbtQhbksI .icon-shape p,#mermaid-svg-iyNXxhhdbtQhbksI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iyNXxhhdbtQhbksI .icon-shape .label rect,#mermaid-svg-iyNXxhhdbtQhbksI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iyNXxhhdbtQhbksI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iyNXxhhdbtQhbksI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iyNXxhhdbtQhbksI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

必须全部满足

满足任意一个即可

读取 Excel 数据

写出单个条件

多个条件如何组合?

使用 and

使用 or

进入 if 判断

筛选 / 处理 / 输出结果


2号标题图

2. 为什么 Excel 自动化离不开逻辑运算符?

  如果只是写最简单的 Python 示例,单个条件已经够用。但一旦开始处理 Excel,业务规则通常会变成复合条件。

  比如下面这些判断,在办公数据里非常常见:

金额大于 3000,并且部门是 IT
状态是待处理,或者状态是异常
文件存在,并且文件后缀是 .xlsx
员工属于正式员工,并且本月考勤异常次数大于 0

  这些判断的共同点是:它们都不是单个比较能完成的,而是需要把多个条件组合起来。此时 and 和 or 就变成了自动化脚本中的“业务规则连接器”。

  推荐理解方式: 写逻辑条件之前,不要急着敲代码,先用中文把规则说清楚。凡是出现“并且”,通常考虑 and;凡是出现“或者”,通常考虑 or。

  例如这条业务规则:

只处理 IT 部门,并且金额大于等于 3000 的记录

  翻译成代码就是:

row["部门"] == "IT" and row["金额"] >= 3000

  再比如这条规则:

状态是待处理,或者状态是异常,都需要继续处理

  翻译成代码就是:

status == "待处理" or status == "异常"

  这就是逻辑运算符的实际价值:把人能看懂的业务规则,翻译成 Python 能执行的判断条件。


3号标题图

3. and:所有条件都满足才通过

  and 的含义是“并且”。它要求左右两边的条件都为 True,最终结果才是 True。只要其中一个条件不成立,整体结果就是 False。

  可以先看一张真值表:

条件 A条件 BA and B
True True True
True False False
False True False
False False False

  简单说:and 适合“必须同时满足多个条件才处理”的场景。

  这张图展示的是 and 的典型业务判断:金额大于 3000,并且部门等于 IT,两个条件都成立时才输出 True。

请添加图片描述

  从图中能看出,and 不是“满足一个就行”,而是两个条件都要过关。对于 Excel 自动化来说,这类逻辑经常用于筛选报销、过滤异常数据、判断是否进入审批或处理流程。

3.1 基础示例:金额大于 3000 且部门是 IT

money = 3500
dept = "IT"

print(money > 3000 and dept == "IT")

  输出结果是:

True

  因为 money > 3000 成立,dept == "IT" 也成立,所以整体结果为 True。

3.2 只要有一个条件不满足,结果就是 False

money = 3500
dept = "财务"

print(money > 3000 and dept == "IT")

  输出结果是:

False

  虽然金额条件成立,但部门不是 IT,所以整体条件不通过。这就是 and 的关键:它不是看某一个条件,而是看所有条件是否同时成立。

3.3 放到 Excel 行数据里理解

  下面这个例子更贴近 Excel 自动化。我们把每一行数据看成一个字典,模拟从 Excel 中读取出来的行记录。

rows = [
{"姓名": "张三", "部门": "IT", "金额": 3500},
{"姓名": "李四", "部门": "财务", "金额": 8000},
{"姓名": "王五", "部门": "IT", "金额": 1200},
]

for row in rows:
if row["部门"] == "IT" and row["金额"] >= 3000:
print("命中:", row)

  输出结果是:

命中: {'姓名': '张三', '部门': 'IT', '金额': 3500}

  李四金额虽然高,但部门不是 IT;王五部门是 IT,但金额不够。最终只有张三同时满足两个条件。

  这里的重点不是代码多复杂,而是逻辑边界要准确:业务要求“同时满足”,代码就应该使用 and。


4号标题图

4. or:任意条件满足就通过

  or 的含义是“或者”。它的规则和 and 不一样:左右两边只要有一个条件为 True,整体结果就是 True。

  先看真值表:

条件 A条件 BA or B
True True True
True False True
False True True
False False False

  简单说:or 适合“命中任意一种情况就处理”的场景。

  这张图展示的是 or 的典型状态判断:状态是“待处理”或者“异常”,都需要进入处理流程。

请添加图片描述

  从图中能看出,or 更适合处理“多个状态入口”的问题。比如待处理、异常、失败、超时,这些状态虽然名字不同,但在业务上都可能需要继续处理。

4.1 基础示例:状态是待处理或异常

status = "异常"

print(status == "待处理" or status == "异常")

  输出结果是:

True

  因为第二个条件 status == "异常" 成立,所以整体结果就是 True。

4.2 状态不匹配时才是 False

status = "已完成"

print(status == "待处理" or status == "异常")

  输出结果是:

False

  因为状态既不是“待处理”,也不是“异常”,所以整体条件不通过。

4.3 部门是 IT 或财务都要处理

dept = "财务"

if dept == "IT" or dept == "财务":
print("需要处理该部门:", dept)

  输出结果是:

需要处理该部门: 财务

  这里的判断逻辑是:部门只要属于 IT 或财务,就进入处理流程。 这类写法适合处理“多个候选值都算命中”的场景。


5号标题图

5. and 和 or 的区别:不要只背中文意思

  很多人学到这里,会把 and 记成“并且”,把 or 记成“或者”。这当然没错,但还不够。真正写脚本时,要能判断业务规则到底是“全部满足”,还是“任意满足”。

运算符中文理解判断规则典型场景
and 并且 所有条件都为 True 才通过 金额达标并且部门匹配
or 或者 任意条件为 True 就通过 状态是待处理或异常
混合使用 多条件组合 需要加括号明确优先级 部门筛选 + 金额筛选 + 状态筛选

  一个比较实用的判断方法是:先不要写代码,先把规则念出来。

金额大于 3000,并且部门是 IT

  这里出现“并且”,大概率用 and。

状态是待处理,或者状态是异常

  这里出现“或者”,大概率用 or。

  但要注意:中文里的“和”“或”有时会有业务歧义,不能只按字面翻译。最终要看业务是否要求全部满足。

5.1 混合条件建议加括号

  当 and 和 or 同时出现时,建议用括号把逻辑分组写清楚。不要把判断交给读代码的人猜。

dept = "IT"
money = 3500
status = "异常"

if (dept == "IT" or dept == "财务") and money >= 3000 and status == "异常":
print("进入重点处理流程")

  这段代码表示:部门必须是 IT 或财务,同时金额要大于等于 3000,并且状态必须是异常。

  推荐做法:复合条件一旦超过两个,尽量用括号提升可读性。 这不是为了让代码显得复杂,而是为了避免后期维护时看错逻辑。


6号标题图

6. 常见错误:or 不能省略左侧比较对象

  这一节是新手最容易踩坑的地方。很多人会把 or 写成下面这样:

dept = "行政"

if dept == "IT" or "财务":
print("需要处理")

  这段代码看起来像是在判断部门是不是 IT 或财务,但实际上它几乎一定会进入 if 分支。原因是 "财务" 本身是一个非空字符串,在条件判断中会被当成 True。

  这类错误非常危险,因为程序不一定报错,但逻辑已经错了。

  这张图展示的就是这个常见错误:错误写法中,"财务" 被当成一个恒为真的条件;正确写法中,必须把每个比较条件写完整。

请添加图片描述

  从图中能看出,or 两边都应该是完整条件,而不是一边是条件、一边只是一个字符串。这个坑在 Excel 自动化里很常见,比如筛选部门、状态、类型、地区时都可能写错。

6.1 错误写法

dept = "行政"

if dept == "IT" or "财务":
print("需要处理")

  这段代码的问题在于:"财务" 是非空字符串,会被 Python 当作 True。

6.2 正确写法

dept = "行政"

if dept == "IT" or dept == "财务":
print("需要处理")
else:
print("不处理")

  这才是真正判断部门是否为 IT 或财务。

6.3 更推荐的写法:使用 in

  如果要判断一个值是否属于多个候选项,实际写脚本时更推荐使用 in。

dept = "财务"

if dept in ["IT", "财务"]:
print("需要处理")

  这种写法更短,也更不容易漏写比较对象。

  推荐做法:两个候选项可以用 or,多个候选项建议用 in,代码会更清楚。


7号标题图

7. 短路特性:先判空,再处理

  and 和 or 还有一个很实用的特性,叫短路判断。这个知识点在处理 Excel 空值时很有价值。

  短路可以简单理解为:如果前面的条件已经能决定最终结果,后面的条件就不再计算。

  and 的短路规则是:前面为 False,后面就不用判断了。

value = None

if value is not None and value != "":
print("有值")

  这段代码会先判断 value is not None。如果 value 是 None,后面的判断就不会继续执行。

  这在 Excel 自动化里很常用,因为很多单元格可能是空值,先判空再处理可以减少报错。

7.1 先判空再转字符串

value = None

if value is not None and str(value).strip() != "":
print("可以继续处理")
else:
print("空值,跳过")

  这里先判断是不是 None,再做字符串清洗。如果顺序反过来,后续复杂处理里就更容易出问题。

7.2 or 的短路规则

  or 的短路规则是:前面为 True,后面就不用判断了。

status = "异常"

if status == "异常" or status == "待处理":
print("需要处理")

  如果第一个条件已经成立,后面的条件就不需要再继续判断。

  短路特性不是必须死记的理论,但知道它以后,写空值判断和多条件判断会更稳。


8号标题图

8. 把 and / or 放回 Excel 自动化流程里

  学逻辑运算符,最终不是为了会背真值表,而是为了能写出更准确的自动化处理逻辑。真实办公场景里,我们通常会经历这样一个流程:读取数据、写出单条件、组合条件、执行判断、输出结果。

  这张图展示的是复合条件在自动化脚本中的完整流程:先读取 Excel 数据,再写出多个单条件,通过 and 或 or 组合,最后进入 if 判断并输出结果。

请添加图片描述

  从图中能看出,and 和 or 通常不是单独出现的,它们会嵌入到完整的数据处理链路里。先读数据,再筛选条件,再执行处理,这才是办公自动化里更真实的使用方式。

8.1 一个完整的模拟案例

  假设我们现在有一批报销记录,只想筛选出“IT 或财务部门,并且金额大于等于 3000,并且状态是异常”的记录。

rows = [
{"姓名": "张三", "部门": "IT", "金额": 3500, "状态": "异常"},
{"姓名": "李四", "部门": "行政", "金额": 5000, "状态": "异常"},
{"姓名": "王五", "部门": "财务", "金额": 2800, "状态": "异常"},
{"姓名": "赵六", "部门": "财务", "金额": 6000, "状态": "正常"},
{"姓名": "孙七", "部门": "财务", "金额": 7200, "状态": "异常"},
]

for row in rows:
dept_hit = row["部门"] in ["IT", "财务"]
money_hit = row["金额"] >= 3000
status_hit = row["状态"] == "异常"

if dept_hit and money_hit and status_hit:
print("命中:", row)

  输出结果是:

命中: {'姓名': '张三', '部门': 'IT', '金额': 3500, '状态': '异常'}
命中: {'姓名': '孙七', '部门': '财务', '金额': 7200, '状态': '异常'}

  这里我没有把所有判断都塞进一行 if 里,而是先拆成 dept_hit、money_hit、status_hit 三个变量。这样写稍微多几行,但可读性更好,后续排错也更方便。

  推荐做法:条件复杂时,不要硬塞成一行,先拆成几个有名字的布尔变量。 这样别人接手代码时能快速看懂每个条件在判断什么。

8.2 条件拆开写,比一行写完更稳

  很多新手喜欢把所有条件写成这样:

if row["部门"] in ["IT", "财务"] and row["金额"] >= 3000 and row["状态"] == "异常":
print("命中:", row)

  这段代码没有错,但如果条件继续增加,可读性会越来越差。尤其是后面要排查“为什么这条数据没命中”时,一行复杂条件并不友好。

  拆开写的优势是:每个条件都可以单独打印验证。

print(row["姓名"], dept_hit, money_hit, status_hit)

  这就是脚本可维护性的差别:能跑只是第一步,能解释、能排错、能交接才更重要。


9号标题图

9. 常见问题与踩坑提醒

9.1 and 和 or 能不能随便混用?

  不能。and 和 or 的业务含义不同。and 是所有条件都要满足,or 是任意条件满足即可。混用时建议加括号,否则后面自己回头看代码都可能看错。

9.2 为什么我写了 or,结果所有数据都命中了?

  优先检查是不是写成了这种形式:

if dept == "IT" or "财务":
print("命中")

  这种写法几乎一定是错的。正确写法应该是:

if dept == "IT" or dept == "财务":
print("命中")

  或者更推荐:

if dept in ["IT", "财务"]:
print("命中")

9.3 判断多个状态时,用 or 还是 in?

  两个状态时,or 可以接受;三个以上状态时,更推荐 in。

if status in ["待处理", "异常", "失败", "超时"]:
print("需要处理")

  这种写法比连续写多个 or 更清楚,也更容易维护。

9.4 处理 Excel 空值时,为什么要先判空?

  因为 Excel 里经常会有空单元格。空值进入 Python 后,可能是 None,也可能是 NaN,具体取决于你用的是 openpyxl 还是 pandas。先判空可以减少后续处理时的报错。

  真实办公数据很少是完全干净的。写条件判断时,不要假设每个字段都有值。


10号标题图

10. 总结提升

  这一节学习的是 and 和 or,但真正要掌握的不是两个英文单词,而是复合条件的思维方式。

  and 适合“所有条件都满足才通过”的场景。 例如金额达标,并且部门匹配,并且状态异常。

  or 适合“任意条件满足就通过”的场景。 例如状态是待处理,或者状态是异常,或者状态是失败。

  最需要警惕的是错误写法 dept == "IT" or "财务"。 这类代码看起来像业务判断,实际逻辑已经偏了,而且不一定会报错。

  我的建议是:写复合条件前,先用中文把业务规则说清楚;条件复杂时,先拆成多个布尔变量;涉及多个候选值时,优先考虑 in。 这样写出来的 Excel 自动化脚本会更清晰,也更容易排错。

  一句话收尾:比较运算符负责判断单个条件,逻辑运算符负责组织业务规则。真正写自动化脚本时,条件判断写得准,后面的筛选、处理和输出才不会跑偏。


请添加图片描述

🔝 返回顶部

点击回到顶部

赞(0)
未经允许不得转载:171主机测评 » 《超简单:用 Python 让 Excel 飞起来》读书笔记:2.4.4 逻辑运算符 and / or,把 Excel 条件判断串起来
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址