邪修・【在WPS里学Python】丨0.8:def——用Python写一个XLOOKUP函数

不说话 ✘
不说话 ✘ Lv.2 潜力创作者KVP

Lv.2潜力创作者

👍学习从什么时候开始都不晚:我要开始学习了

不用下载, 打开WPS智能表格--PY脚本, 立即开学!

📢

前面我们已经学会:

xl()读取,write_xl()写入,delete_xl()删除

DataFrame

if判断

for循环

break / continue

🔥

现在终于来到一个很重要的东西:

👉 使用def定义函数

这一章开始,你就会开始具备写功能块的能力


👋

一、什么是def函数?

👉 def函数:“自己定义一个功能”

📌

def结构

def 函数名(参数列表):  
    具体功能的代码块
    [return 返回值]  # return 可选,无返回值时可省略

📢是不是发现:

👉 和for循环、if判断一样,都是“关键字 + 冒号 + 缩进代码块”的结构

📊

二、先来个对比

def 和“名称管理器”有点像

还记得前面我们说过:

👉 变量 ≈ 名称管理器

👉 so得出一个粗狂结论: def ≈ 变量 ≈ 名称管理器

变量是存数据的容器

def 是自定义函数,是“能接收参数、按预设逻辑自动运转的语法指令”

对比一下

def

变量

名称管理器

核心本质

定义代码逻辑(函数/类)的语法指令

存储数据的内存容器

表格对象的命名管理工具

核心作用

封装可复用功能,实现逻辑复用

存储、传递数据

管理命名对象,简化引用、提升操作效率

核心场景

编程中封装计算、处理逻辑,重复调用

编程中存用户输入、运算结果等动态数据

表格中存值、公式,避免复杂引用


📊

三、准备数据

📢先写入数据:

write_xl([
["渠道","数量","金额"],
["H5",1000,2000],
["短信",800,40],
["app",500,1500]
],"A1")

📊 表格:

渠道

数量

金额

H5

1000

2000

短信

800

40

app

500

1500


📌

四、用Python写一个基础版的“XLOOKUP”

先回忆下表格中XLOOKUP是如何使用的

💡 XLOOKUP示例:

=XLOOKUP("短信",A:A,C:C,"未找到")

👉 意思其实是:

在A列里循环查找“短信”

找到后:

返回C列对应行结果

找不到:

返回“未找到”
📌

有没有发现?

👉 其实核心逻辑就是:

for循环

if判断

break停止

💡

读取表格

数据 = xl(headers=True)
print(数据)

👉 DataFrame:

💡

开始写逻辑

def XLOOKUP(查找项,查找列,结果列,未找到显示内容):

    for 行号 in range(len(数据)):  #和表格len函数一样,计算长度,这里计算“数据”的行数

        if 数据[查找列][行号] == 查找项:

            print(数据[结果列][行号])

            break
💡

调用函数(像不像XLOOKUP?)

👉现在直接用函数名调用这个函数

XLOOKUP("短信","渠道","金额","未找到")

👉 输出:

👉 输出了正确答案: 40

📢

恭喜你,这一刻非常重要:

👉 你已经用Python代码“自己手搓了一个表格函数”


五、还有一个问题

📢如果查不到呢:

XLOOKUP("肯定查不到我","渠道","金额","未找到")

👉 什么都不输出

😱

有点懵,为啥没有报出结果:

又没有显示正确结果,又没有报错?

到底找没找到?

是不是程序坏了?

🧐

其实复盘一下执行轨迹就能发现,程序没坏,它只是“默默下班了”🤫

1️⃣ for 循环老老实实把每一行都检查了一遍

2️⃣ 发现没有哪一行的 渠道 等于 "肯定查不到我"

3️⃣ if 条件一次都没触发,break 自然也没机会执行

4️⃣ 循环安静结束,函数执行完毕,屏幕一片空白。


🧐

加入“未找到”逻辑

找到问题,就简单了,加入未找到的逻辑就行:

数据 = xl(headers=True)

def XLOOKUP(查找项,查找列,结果列,未找到显示内容):

    是否找到 = False  #新增变量“是否找到”, 默认值False

    for 行号 in range(len(数据)):

        if 数据[查找列][行号] == 查找项:

            print(数据[结果列][行号])

            是否找到 = True

            break

    if 是否找到 == False:  #如果循环完,未跳出循环,这个变量还是等于False

        print(未找到显示内容)

XLOOKUP("肯定查不到我","渠道","金额","未找到")

再次运行

👉 输出:

👉 输出了正确答案: 未找到

📢

现在:

👉 这个函数已经越来越像真正的“XLOOKUP”了

😎 恭喜你:刚刚“修复了一个逻辑BUG


🧐

再优化一下这个函数

数据 = xl(headers=True)

def XLOOKUP(查找项, 查找列, 结果列, 未找到显示内容="未找到"):
    
    for 行号 in range(len(数据)):
        if 数据[查找列][行号] == 查找项:
            return 数据[结果列][行号]  # ✅ 找到啦!直接带着结果“提前下班”
            
    return 未找到显示内容  # 🛡 循环完整走完都没触发return,说明没找到,返回兜底值

XLOOKUP("肯定找不到我","渠道","金额","未找到")
  • return 是把函数结果返回出去(Python中会经常用到)

  • return 一旦执行,函数会立刻终止,后面的代码全都不跑。

  • 所以,只要匹配成功,直接带着结果“提前下班”。

  • 如果一路走到循环结束,都没遇到if中的 return,程序就会自然“掉落”到最后一行,乖乖返回你设定的 未找到显示内容

  • 参数可以设置默认值,例如将未找到显示内容的默认值设置为“未找到”

👉 输出了正确答案: 未找到,并且代码更简洁,运行速度更快,更易读。

📢

😎 这一刻:

👉 你优化了一个功能模块

虽然我们写得只是一个基础版的“XLOOKUP”,但更重要的是我们学会了自己用代码去手搓一个自己想要的功能,并且具备了修复BUG和优化代码的思维。


🎉

小结 & 成就感

💡 你已经:

• 学会def定义函数

• 学会for+if+break组合写一个功能块

• 学会自己封装逻辑

• 自己手搓了一个“XLOOKUP”,并且修复了一个逻辑BUG,还优化了代码

🥳此时你已经可以自己创造“小工具”了,这就是很多程序最开始的样子。


📸 学习从什么时候开始都不晚:

我要开始学习了

✍️ 作业1

实现:

查找("H5","渠道","数量","未找到")

👉 输出:

1000


✍️ 作业2(挑战)

😎如果找到H5:

不要只输出数字

👉而是输出一段文本:

H5的数量是1000


✍️ 作业3(高手挑战)

🔥查找并加入计算:

查找H5, 并计算出H5的 单价(金额/数量)

👉 输出:

2


金融投资通识——股票、期货、期权、基金
@不说话 ✘
四川省
浏览 244
3
10
分享
10 +1
2
3 +1
全部评论 2
 
㊣
的print("结果等于=" , 数据[结果列][查找行])
· 广东省
回复
 
小白子
彳亍
· 广东省
回复