你有没有遇到过这种情况:辛辛苦苦写了好几行代码,点击运行,控制台干干净净,一个字都没打印。
你反复检查,代码没报错,缩进没毛病,拼写没打错。然后你开始怀疑人生——这代码怎么不听话?
别慌,代码没毛病。你只是忘了"喊"它一声。
这就是Python函数最容易坑新手的地方:定义了不等于执行了。
官方定义说:函数是组织好的、可重复使用的、用于执行特定任务的代码块。
听着挺唬人,其实你早就会了。
想想智能家居的"场景模式"。你在手机上设置了一个叫"回家"的场景,里面排好了操作:开空调 → 温度调26度 → 开客厅灯 → 开卧室灯。
设置好之后,每次回家你只需要说一句"执行回家场景",这一串操作就会依次自动执行。你不用再一个一个去点空调、点灯。
函数就是这个"场景模式"。
你提前把一堆代码写好,起个名字放那儿。以后想用的时候,喊一下这个名字,那堆代码就会依次执行。

有人可能会说:我直接写代码不就行了,干嘛还要包一层函数?
三个好处:
好处 | 大白话 |
代码复用 | 写一次,到处用。不用反复复制粘贴同一段代码 |
结构清晰 | 不同功能放在不同函数里,代码像收纳盒一样整整齐齐 |
模块化开发 | 大项目拆成小功能,团队成员各写各的函数,互不干扰 |
举个例子:你写了一段代码计算订单价格,300个地方都要用到。没有函数,你得把这段代码复制300遍。有了函数,你只需要写一次,然后喊300次名字就行。哪天价格算法改了,你只改函数里的代码,300个地方全部生效。
不是所有函数都需要你自己写。Python里的函数分成三类:
分类 | 特点 | 例子 |
内置函数 | Python自带的,直接就能用 | print()、type()、input()、range() |
模块提供的函数 | 需要先导入模块才能用 | math模块里的函数等 |
自定义函数 | 程序员自己写的,先定义再使用 | 你自己写的welcome()等 |
你其实早就在用函数了——print()就是Python官方给你准备好的内置函数。你不需要知道它内部怎么实现的,直接用就行。
但内置函数再全,也覆盖不了所有需求。真正体现你编码能力的,是自定义函数——这是你自己亲手写的。
定义一个函数,核心就一个关键字:def。
def welcome():
print("欢迎来到xxx课堂")
print("让天下没有难学的技术")拆开看每一部分:
零件 | 代码 | 说明 |
关键字 | def | define(定义)的缩写,告诉Python"我要定义函数了" |
函数名 | welcome | 自己起的名字,要符合标识符命名规则 |
空格 | def和welcome之间的空格 | 必须有,不写直接报错 |
圆括号 | () | 固定格式,不写就不是函数。以后可以在这里写参数 |
冒号 | : | 必须有,和if、for、while一样 |
函数体 | 两行print | 缩进4个空格,属于函数的代码 |
def是define的缩写。有人可能会想:那我写全称define行不行?
# 这样写会报错!
define welcome():
print("你好")不行。Python只认def这三个字母,你写define它不认。
和if、for、while一样,Python靠缩进来判断代码的归属。4个空格缩进的print属于函数体,不缩进的就不属于。
def welcome():
print("第一句") # 属于函数(有缩进)
print("第二句") # 属于函数(有缩进)
print("第三句") # 不属于函数(没缩进)回到开头的问题:函数写好了,运行后控制台啥也没有——为什么?
因为你只定义了函数,没有调用它。
# 定义函数
def welcome():
print("欢迎来到xxx课堂")
print("让天下没有难学的技术")
# 点击运行...控制台空空如也!定义函数就像拍电影前的准备工作——场景搭好了,演员就位了,灯光打好了。但导演没喊"Action",谁都不会动。
调用函数就是喊"Action":函数名后面跟一对圆括号。
# 定义函数
def welcome():
print("欢迎来到xxx课堂")
print("让天下没有难学的技术")
# 调用函数——这就是"喊它一声"
welcome()运行结果:
欢迎来到xxx课堂
让天下没有难学的技术这回有反应了。
新手第一大坑:写完def就觉得代码会自动运行。不会!定义函数只是"准备好了",调用函数才是"开始执行"。你必须写一行welcome()来喊它。
函数最大的价值就是复用——喊一次执行一次,喊三次执行三次:
def welcome():
print("欢迎来到xxx课堂")
print("让天下没有难学的技术")
welcome() # 第1次调用
welcome() # 第2次调用
welcome() # 第3次调用运行结果:
欢迎来到xxx课堂
让天下没有难学的技术
欢迎来到xxx课堂
让天下没有难学的技术
欢迎来到xxx课堂
让天下没有难学的技术函数体里两行代码,调用了3次,就执行了6行输出。如果以后要改成4次、5次、100次,只需要多写几行调用,函数体一行都不用改。
Python里有一条铁律:函数必须先定义,后调用。
如果你把调用写在定义前面:
welcome() # 调用(在第2行)
def welcome(): # 定义(在第4行)
print("你好")运行直接报错:
NameError: name 'welcome' is not defined翻译过来就是:"welcome"没定义。
Python是从上往下执行代码的。执行到第2行welcome()的时候,它还不知道welcome是个什么东西——因为定义在第4行,还没执行到。就像你喊一个人名字,这人还没出生,怎么喊?
记住这个顺序:先def定义函数,再调用函数。就像先注册账号,再登录使用。没有"先登录再注册"的道理。
写函数就两步:
第一步:定义函数(搭好场景,排好动作)
def 函数名():
函数体(要执行的代码)第二步:调用函数(喊一声"Action")
函数名()两步缺一不可:
情况 | 结果 |
只定义,不调用 | 函数体一行都不执行,控制台没输出 |
只调用,不定义 | 直接报错:NameError: name is not defined |
先调用,后定义 | 同样报错,Python从上往下执行,找不到未定义的函数 |
先定义,后调用 | 正常执行,函数体代码运行 |
函数是编程世界里最重要的概念之一。这节我们只学了最基础的——无参数、无返回值的函数。
但就算是最基础的,也请记住这两件事:
第一,def只是定义,调用才会执行。你写了def却没写函数名+括号,代码就是一具没有灵魂的躯壳。
第二,先定义后调用,顺序不能反。Python从上往下执行,没见过的函数不能调用。
下节我们会学给函数加参数——让函数能接受不同的输入,干不同的活。比如welcome("张三")让函数对特定的人说欢迎。
留个思考题:如果同一个函数名定义了两次,Python会用哪一个?
把你的答案写在评论区。
更新时间:2026-07-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight All Rights Reserved.
Powered By 61893.com 闽ICP备11008920号
闽公网安备35020302034844号